<<>> <> <> <> <> <<>> <> <> <<>> <> DIRECTORY Basics, IO, TuneParse; TonePlay: CEDAR DEFINITIONS = { STREAM: TYPE = IO.STREAM; Scaled: TYPE = Basics.LongNumber; AudioDataIndex: TYPE = [0..audioDataMod); audioDataMod: NAT = 2*1024; AudioHistoryIndex: TYPE = [0..audioHistoryMod); audioHistoryMod: NAT = 4*1024; AudioBuf: TYPE = REF AudioBufRep; AudioBufRep: TYPE = RECORD [ st: STREAM, flush: PROC [AudioBuf, NAT], self: PROCESS, pos: AudioDataIndex, data: PACKED ARRAY AudioDataIndex OF BYTE, toneA: FMToneSpec, toneB: FMToneSpec ]; FMToneSpec: TYPE = REF FMToneSpecBody; FMToneSpecBody: TYPE = RECORD [ phaseStep1: Scaled, phaseStep2: Scaled, ampDefault: REAL, fadeInSteps: INT, normalSteps: INT, fadeOutSteps: INT, zeroSteps: INT, ampFadeIn: Scaled, ampFadeOut: Scaled, ampInit: Scaled, phaseRatio: Scaled, delaySteps: AudioHistoryIndex, delayRatio: Scaled, phase1: Scaled, phase2: Scaled, amp: Scaled, rem: INT, state: ToneState, histPos: AudioHistoryIndex, history: ARRAY AudioHistoryIndex OF Scaled ]; ToneState: TYPE = {fadeIn, normal, fadeOut, zero}; MuLawByte: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM byte => [byte: BYTE], coded => [positive: BOOL, code: [0..128)], parts => [pos: BIT, octant: [0..7], rem: [0..15]] ENDCASE ]; SumArray: TYPE = ARRAY BYTE OF ARRAY BYTE OF BYTE; OutputBuffer: TYPE = PACKED ARRAY [0..216) OF BYTE; OutputBufferIndex: TYPE = INT [0..216); OpenAudioDeviceForWrite: PROC[defaultAmplitude: REAL] RETURNS [buf: AudioBuf]; <> <> <> CloseWriteAudioDevice: PROC[buf: AudioBuf, discardQueued: BOOL¬FALSE]; <> PlayTonePair: PROC [buf: AudioBuf, time: REAL, freq1: REAL, freq2: REAL]; <> <<>> PlayRingTune: PROC [buf: AudioBuf, toneSpec: TuneParse.ToneSpec]; <> <<>> GenTone: PROC [buf: AudioBuf]; <> Stop: PROC[buf: AudioBuf]; <> }. <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <>