<> <> <> <> <> <> <> DIRECTORY <> IntervalTimer USING [Pulses], IO USING [STREAM], Jukebox USING [Handle, RunData, RunDataObject, Tune, WindowOrigin, RunArrayRange, EnergyRange], PrincOps USING [ByteBltBlock], PupDefs USING [PupSocket], Rope USING [ROPE], VM USING [Interval]; VoiceStream: DEFINITIONS = BEGIN ErrorCode: TYPE = {Bug, BadPiece, StreamClosed, Timeout, Hungup}; <> <> <> <> <> <> Error: ERROR [reason: ErrorCode, rope: Rope.ROPE]; <> <> wholeTune: INT; Open: PROC [jukebox: Jukebox.Handle, proc: NotifyProc _ NIL, clientData: REF ANY _ NIL] RETURNS [handle: Handle]; <> Close: PROC [handle: Handle]; <> SetSocket: PROC [handle: Handle, socket: PupDefs.PupSocket]; <> AddPiece: PROC [handle: Handle, tuneId: INT, firstByte: INT, nBytes: INT, create: BOOLEAN _ FALSE, playback: BOOLEAN _ TRUE, keyIndex: NAT _ 0, flush: BOOLEAN _ FALSE, ambientLevel: Jukebox.EnergyRange _ 0]; <> FlushPieces: PROC [handle: Handle]; <> IsEmpty: PROC [handle: Handle] RETURNS[BOOLEAN]; <> WaitEmpty: PROC [handle: Handle]; <> Get: PROC [handle: Handle, maxSilentBytes: NAT, block: PrincOps.ByteBltBlock, wait: BOOL _ FALSE] RETURNS[silence: NAT, bytesTransferred: NAT, keyIndex: NAT]; <> Put: PROC [handle: Handle, silentBytes: NAT, block: PrincOps.ByteBltBlock, energy: CARDINAL] RETURNS [bytesTransferred: NAT]; <> Check: PROC [handle: Handle] RETURNS[BOOLEAN]; <> StartServer: PROC [stream: IO.STREAM]; <> Handle: TYPE = REF VSRecord; NotifyProc: TYPE = PROC [self: Handle, clientData: REF ANY]; <> <<-------------------------------------------------------->> <> <<-------------------------------------------------------->> buffersPerStream: PRIVATE INTEGER = 3; VSRecord: PRIVATE TYPE = RECORD [ <<>> <> jukebox: Jukebox.Handle, firstServerBuffer: REF Buffer, firstClientBuffer: REF Buffer, firstIdleBuffer: REF Buffer, piece: REF Piece, next: REF VSRecord, errorRope: Rope.ROPE, errorCode: ErrorCode, proc: NotifyProc, notified: BOOL, clientData: REF ANY, connection: Connection, newPiece: CONDITION, action: BOOLEAN ]; Connection: TYPE = REF ConnectionObject; ConnectionObject: TYPE = RECORD [ socket: PupDefs.PupSocket, packetSize: NAT, -- Packet size when we're sending. bufferSpace: NAT, -- Milliseconds of buffering in Lark. probeLaunchTime: IntervalTimer.Pulses, -- time probe was transmitted probeSequenceNumber: CARDINAL, -- last probe fingerprint <> larkEpoch: CARDINAL, -- Lark clock (milliseconds) localEpoch: IntervalTimer.Pulses, roundTripMS: CARDINAL, -- milliseconds initialProbeDone: CONDITION, initialProbeFinished: BOOL, drift: INT, -- accumulated clock error sendNext: IntervalTimer.Pulses, pollStreamNext: IntervalTimer.Pulses, sequenceNumber: CARDINAL, timeToPlay: CARDINAL, -- lark time to play next packet packetMS: NAT -- Milliseconds in most recent packet ]; Buffer: PRIVATE TYPE = RECORD [ <> chirp: LONG INTEGER, chirpSpace: VM.Interval, window: Jukebox.WindowOrigin, block: PrincOps.ByteBltBlock, runData: RunData, runIndex: Jukebox.RunArrayRange, bytesAccountedFor: NAT, next: REF Buffer, toJukebox: BOOLEAN, keyIndex: NAT, valid: BOOLEAN, playedBytes: CARDINAL ]; RunDataObject: TYPE = Jukebox.RunDataObject; RunData: TYPE = Jukebox.RunData; Piece: PRIVATE TYPE = RECORD [ <> tuneId: INT, create: BOOLEAN, firstByte: INT, nBytes: INT, tune: Jukebox.Tune, playback: BOOLEAN, keyIndex: NAT, next: REF Piece, flush: BOOLEAN, ambientLevel: Jukebox.EnergyRange, -- for recording only, set by parameters to AddPiece packetsSinceLastNonSilence: INT -- used in both recording and playback: indicates how long since last sound worth playing occured; preset to Jukebox.hangoverPackets by AddPiece ]; <> Lock: MONITORLOCK; <> serverCondition: CONDITION; client: CONDITION; <> waitCondition: CONDITION; <> closeCondition: CONDITION; <> ioStream: IO.STREAM; <> VSList: Handle; setError: PRIVATE PROC [handle: Handle, rope: Rope.ROPE, code: ErrorCode]; <> flushBuffer: PRIVATE PROC [handle: Handle]; <> END. April 5, 1983 2:35 pm, Stewart, add RunData to Buffer record June 4, 1983 5:39 pm, Stewart, add notified to VSRecord in order to notify only once L. Stewart, June 20, 1983 4:52 pm, Try using Pulses instead of Microseconds L. Stewart, December 26, 1983 7:41 pm, Cedar 5