<<>> <> <> <> <> <<>> <> <<>> DIRECTORY Arpa USING [ Address, nullAddress ], ArpaUDP USING [ Port ], UnixTypes USING [ FD ] ; AudioLibrary: CEDAR DEFINITIONS = { <> AudioInfo: TYPE ~ REF AudioInfoBody; AudioInfoBody: TYPE ~ RECORD [ play: AudioPRInfoBody ¬ [], -- output status information record: AudioPRInfoBody ¬ [], -- input status information monitorGain: INT ¬ defaultINT, -- input to output mix: 0 - 255 dummy: ARRAY [0..4) OF INT ¬ ALL[defaultINT] -- Reserved for future use. ]; AudioPRInfo: TYPE ~ REF AudioPRInfoBody; AudioPRInfoBody: TYPE ~ RECORD [ <> <> <> sampleRate: INT ¬ defaultINT, -- sample frames per second channels: INT ¬ defaultINT, -- number of interleaved channels precision: INT ¬ defaultINT, -- bits per sample encoding: DataEncodingMethod ¬ demDefault, <> gain: INT ¬ defaultINT, -- gain level: 0-255 port: INT ¬ defaultINT, -- Selected I/O port (see below) dummy: ARRAY [0..4) OF INT ¬ ALL[defaultINT], -- Reserved for future use. <> samples: INT ¬ defaultINT, -- number of samples converted eof: INT ¬ defaultINT, -- number of EOF records (play only) pause: CharBool ¬ cbDefault, -- TRUE to pause, FALSE to resume error: CharBool ¬ cbDefault, -- TRUE if overflow/underflow waiting: CharBool ¬ cbDefault, -- TRUE if a process wants access cdummy1: CharBool ¬ cbDefault, -- Reserved for future use cdummy2: CharBool ¬ cbDefault, -- Reserved for future use cdummy3: CharBool ¬ cbDefault, -- Reserved for future use <> open: CharBool ¬ cbDefault, -- TRUE if access requested at open active: CharBool ¬ cbDefault -- TRUE if HW I/O active ]; CharBool: TYPE ~ [0..256); cbFalse: CharBool = 0; cbTrue: CharBool = 1; cbDefault: CharBool = LAST[CharBool]; DataEncodingMethod: TYPE ~ INT; demDefault: DataEncodingMethod = -1; defaultINT: INT = -1; ErrCode: TYPE ~ MACHINE DEPENDENT { success(0), error (1), -- The standard default error <<. . .>> (LAST[INT]) -- INT-wide value }; FD: TYPE ~ UnixTypes.FD; -- Unix File Descriptors <> IPAddress: TYPE ~ Arpa.Address; nullAddress: IPAddress = Arpa.nullAddress; IPPort: TYPE ~ ArpaUDP.Port; nullPort: IPPort = [0,0]; MixerID: TYPE~ MACHINE DEPENDENT { mixer0A (0), mixer0B (1), -- Mixer 0 is connected to the real /dev/audio. Clients connect to B side. mixer1A (2), mixer1B (3), << . . . >> mixer7B (15) }; <> AudioGetInfo: PROC [fd: FD] RETURNS [err: ErrCode, info: AudioInfo]; AudioSetInfo: PROC [fd: FD, info: AudioInfo, returnCurrentValue: BOOL¬FALSE] RETURNS [err: ErrCode, newInfo: AudioInfo]; <> <> <<>> <> <<>> MixerLinkStream: PROC [mixerID: MixerID¬mixer0B, fd: FD] RETURNS [err: ErrCode]; MixerUnlinkStream: PROC [fd: FD] RETURNS [err: ErrCode]; <> <<>> TransmitStreamCreate: PROC [groupAddr: IPAddress, groupPort: IPPort, packetLen: INT, voxEnable: BOOL] RETURNS [fd: FD]; ReceiveStreamCreate: PROC [groupAddr: IPAddress, groupPort: IPPort, remoteAddr: IPAddress, remotePort: IPPort, jitterDelay: INT] RETURNS [fd: FD]; StreamDestroy: PROC [fd: FD] RETURNS [err: ErrCode]; StreamGetLocalAddr: PROC [fd: FD] RETURNS [err: ErrCode, localAddr: IPAddress, localPort: IPPort]; StreamSetGroupAddr: PROC [fd: FD, groupAddr: IPAddress, groupPort: IPPort] RETURNS [err: ErrCode]; StreamSetRemoteAddr: PROC [fd: FD, remoteAddr: IPAddress, remotePort: IPPort] RETURNS [err: ErrCode]; }. <> <> <<>> <<>> <<>>