<> <> DIRECTORY IO, Jukebox USING [CloseTune, CreateTune, Error, FindJukebox, Handle, OpenJukebox, Tune], Lark, NewLark, PrincOpsUtils USING [IsBound], PupDefs USING [MsToTocks, PupSocketDestroy, PupSocketMake], Rope USING [ROPE], VoiceStream USING [AddPiece, Close, Open, SetSocket, wholeTune]; NewLarkVFSImpl: CEDAR MONITOR IMPORTS IO, Jukebox, PrincOpsUtils, PupDefs, VoiceStream EXPORTS NewLark = BEGIN jukeOpen: BOOL _ FALSE; jukebox: Jukebox.Handle _ NIL; InitializeJukeBox: PROCEDURE = TRUSTED { jukeboxName: Rope.ROPE = "Test.Jukebox"; <> haveJuke: BOOL _ TRUE; IF NOT PrincOpsUtils.IsBound[Jukebox.FindJukebox] THEN RETURN; IF (jukebox _Jukebox.FindJukebox[jukeboxName]) = NIL THEN { jukebox _ Jukebox.OpenJukebox[jukeboxName ! Jukebox.Error => { CONTINUE; }]; }; jukeOpen _ jukebox # NIL; }; OpenVFS: PUBLIC NewLark.BProc = TRUSTED { IF NOT jukeOpen THEN InitializeJukeBox[]; IF NOT jukeOpen THEN RETURN; self.out.PutF["VFS Connect[[%b, %b]\n", IO.int[self.rx1.remoteSocket.net], IO.int[self.rx1.remoteSocket.host]]; self.socket _ PupDefs.PupSocketMake[ local: self.rx1.remoteSocket.socket, remote: self.rx1.localSocket, ticks: PupDefs.MsToTocks[100]]; self.tx3 _ NEW[Lark.ConnectionSpecRec]; self.tx3.protocol _ Lark.Protocol[interactive]; self.tx3.encoding _ Lark.Encoding[muLaw]; self.tx3.blankA _ 0; self.tx3.blankB _ 0; self.tx3.blankC _ 0; self.tx3.buffer _ in1; self.tx3.keyIndex _ 0; self.tx3.localSocket _ self.rx1.localSocket; self.tx3.remoteSocket _ self.socket.getLocalAddress[]; self.stream _ VoiceStream.Open[jukebox]; VoiceStream.SetSocket[socket: self.socket, handle: self.stream]; }; CloseVFS: PUBLIC NewLark.BProc = TRUSTED { IF NOT jukeOpen THEN RETURN; IF self.stream#NIL THEN VoiceStream.Close[self.stream]; self.stream _ NIL; IF self.socket#NIL THEN PupDefs.PupSocketDestroy[self.socket]; self.socket _ NIL; }; SetInterval: ENTRY PROC[ self: NewLark.LarkHandle, utterance: INT, record: BOOL, queueIt: BOOLEAN, nBytes: INT _ VoiceStream.wholeTune] RETURNS [actualUtterance: INT] = TRUSTED { ENABLE UNWIND=>NULL; tune: Jukebox.Tune; IF NOT jukeOpen THEN RETURN; IF utterance = -1 THEN IF record THEN { tune _ Jukebox.CreateTune[jukebox, -1]; utterance _ tune.tuneId; Jukebox.CloseTune[jukebox, tune]; } ELSE RETURN; VoiceStream.AddPiece[ handle: self.stream, tuneId: utterance, firstByte: 0, nBytes: nBytes, create: record, playback: NOT record, keyIndex: 0, flush: NOT queueIt ]; RETURN[utterance]; }; Playback: PUBLIC NewLark.PlaybackProc = { [] _ SetInterval[ self: self, utterance: message, record: FALSE, queueIt: queue ]; }; Record: PUBLIC NewLark.RecordProc = { message _ SetInterval[ self: self, utterance: -1, record: TRUE, queueIt: FALSE, nBytes: seconds * 8000 ]; }; END.