# machine dependent voice support # implement Mvoice; include "sys.m"; sys: Sys; Dir, pctl, NEWPGRP, DMDIR, open, OREAD, FD, OWRITE, ORCLOSE, FORKFD, ORDWR, FORKNS, NEWFD, MREPL, MBEFORE, MAFTER, MCREATE, pipe, mount, fprint, sprint, create, pwrite, read, QTDIR, QTFILE, fildes, Qid: import sys; include "error.m"; err: Error; checkload, stderr, panic, kill, error: import err; include "env.m"; env: Env; getenv: import env; include "mvoice.m"; init() : string { return nil; } speakcmd(text: string): (ref FD, string) { cmd : string; r := getenv("emuroot"); if (r == nil) r = "/usr/inferno"; r += "/tmp/tmp.voice"; fd := create("/tmp/tmp.voice", OWRITE, 8r664); fprint(fd, "Say \"%s\"\n", text); cmd = sprint("osascript %s", r); return (fd, cmd); } speak(text: string): string { if (sys == nil){ sys = load Sys Sys->PATH; err = load Error Error->PATH; err->init(); env = checkload(load Env Env->PATH, Env->PATH); } (fd, cmd) := speakcmd(text); cfd := open("/cmd/clone", ORDWR); if (cfd == nil) return sprint("voice: cmd: %r"); nam := array[30] of byte; nr := read(cfd, nam, len nam); if (nr <= 0) return sprint("voice: cmd: %r"); dir := "/cmd/" + string nam[0:nr]; wfd := open(dir + "/wait", OREAD); if (wfd == nil) return sprint("voice: wait: %r"); fprint(cfd, "exec %s", cmd); sts := array[1024] of byte; nr = read(wfd, sts, len sts); fd = nil; return nil; }