mwm@eris.BERKELEY.EDU (Mike (My watch has windows) Meyer) (10/23/87)
I've got a program that needs two simple sounds. One can run sync, but the other wants to be async. I allocate a port, an IOAudio struct and let OpenDevice allocate a channel for me. I then have a pair of routines that issue the do a CMD_WRITE with the appropriate waveform. The sync sounds just then does a WaitIO on the IOAudio request. The async versions returns after the BeginIO, and a third function is called later to do the WaitIO. Everything work as expected (and is working in the background, even as I type this). Except every once in a while, the thing hangs. Apparently in the WaitIO for the async sound (the sequence is: async sound, a little cleanup, sync sound). Everything worked fine before I added the sound code, so that's presumable the problem. Changing the async code to run sync (start function does it all, third function a nop) doesn't help. Things seem to be working just fine now. But the async WaitIO has been replaced by a loop: while (GetMsg(audio_port) != NULL) ; Ugly. Not right. Anyone got a fix? Oh yeah - nothing else that would want to touch the audio is running. Thanx, <mike -- I went down to the hiring fair, Mike Meyer For to sell my labor. mwm@berkeley.edu I noticed a maid in the very next row, ucbvax!mwm I hoped she'd be my neighbor. mwm@ucbjade.BITNET
gbbrooks@sybil.cs.Buffalo.EDU (G. Brandon Brooks) (03/17/90)
I've been trying to program the audio device over this past week, and for the past 2 days I've been stuck - wondering what I've done wrong. I wrote a program in Modula-2 (I'm sure any 'C' fan can read the code without much effort) that tries to open the audio device, play a note from unit 1 and then closes the device. The program (I think) properly opens and closes the device, but the note that I play is only about 1/10th of a second long, or a quick 'bpfdth' from the speakers of my monitor. THE PROBLEM - Why does the note play for so short? If I change the ioaCycles parameter to AN number (including 0), the program still emits a 'bpfdth' sound for much under a second. ioaVolume works, the waveform (from what I can hear of it) [ioadata] works, and the 'frequency' [1/ioaperiod] works. But why doesn't the length, ioaCycles work? If I use a DoIO command to dispatch the request, it will wait longer depending on larger values of ioaCycles, but no note will be played. If I use a BeginIO command, the note will play as a 'bpfdth' but not of the right length. What does BeginIO do that DoIO does not do? - Oh, SendIO will send the request as BeginIO does, but STILL without a sound coming from my speakers! The Modula-2 program follows, if it would help: -Brandon The program: --------------------------------------------------------------------------- MODULE AudioTest; FROM AudioDevice IMPORT AudioChannelsSet,Left1,ADCmdPerVol, ADIOPerVol,IOAudio,IOAudioPtr; FROM IODevices IMPORT OpenDevice,CloseDevice,CheckIO,SendIO,DoIO,WaitIO, IOFlagsSet,CmdWrite,CmdStart,CmdUpdate,IOQuick, BeginIO; FROM Memory IMPORT AllocMem,MemReqSet,MemChip; FROM Nodes IMPORT NTMessage; FROM RandomNumbers IMPORT Seed,Random; FROM Ports IMPORT MsgPort,MsgPortPtr; FROM PortsUtil IMPORT CreatePort,DeletePort; FROM SSTEM IMPORT ADDRESS,ADR,BTE; FROM InOut IMPORT WriteString,WriteCard,WriteInt,WriteLn; VAR Request : IOAudio; MSGPortPtr : MsgPortPtr; Wave,A : ADDRESS; i : CARDINAL; error : LONGCARD; a : ARRA [1..15] OF BTE; BEGIN (* Request unit 1 *) a[1] := BTE(1); (* Initialize a request structure *) MSGPortPtr := CreatePort(ADR("audioport"),0); Request.ioaRequest.ioMessage.mnReplyPort := MSGPortPtr; Request.ioaRequest.ioMessage.mnNode.lnType := NTMessage; Request.ioaRequest.ioMessage.mnNode.lnPri := BTE(0); Request.ioaData := ADR(a); Request.ioaLength := 7; (* Open the audio device channel 0 (left speaker) *) error := OpenDevice(ADR("audio.device"),1D,ADR(Request),0D); IF error # 0D THEN WriteString("Error: "); WriteCard(error,0); WriteLn; HALT; END; WriteString("Unit: "); WriteCard(CARDINAL(Request.ioaRequest.ioUnit),0); WriteLn; WriteString("Alloc:"); WriteCard(CARDINAL(Request.ioaAllocKey),0); WriteLn; (* Set up a wave *) Seed := 1235D; Wave := AllocMem(500D,MemReqSet{MemChip}); A := Wave; FOR i := 0 TO 499 DO A^ := BTE(Random(255)); INC(A); END; WriteString("Playing....\n"); (* Play a note *) Request.ioaRequest.ioCommand := CmdWrite; Request.ioaRequest.ioFlags := IOFlagsSet{ADIOPerVol}; (* Request.ioaAllocKey := CARDINAL(AudioChannelsSet{Left1}); *) Request.ioaData := Wave; Request.ioaLength := 500D; Request.ioaPeriod := 3000; Request.ioaVolume := 60; Request.ioaCycles := 0; BeginIO(ADR(Request)); CloseDevice(ADR(Request)); END AudioTest.