@Phibrizzo, post #1
@Phibrizzo, post #4
@Hexmage960, post #3
@Phibrizzo, post #7
chcialem grac na cztrech kanalach wykozystujac jeden request, modyfikujac tylko unit przy wywolaniu odpowieniego kanaluJeżeli wyślesz request do urządzenia, to nie możesz z nim nic robić dopóki nie wróci. Jeżeli go wyślesz drugi raz przed powrotem, to zwis masz w zasadzie gwarantowany. W strukturze requesta masz Node, który służy do kolejkowania requestów. Wysłanie go dwa razy to umieszczenie tego samego Node na dwóch listach jednocześnie, w tym momencie pierwsza lista staje się uszkodzona.
@Phibrizzo, post #7
@Hexmage960, post #9
@Hexmage960, post #9
Zastanawia mnie tylko jeszcze jeden przypadek - zmiana głośności i wysokości dźwięku za pomocą polecenia ADCMD_PERVOL. Z tego co pamiętam, to akurat to możesz wysyłać na tym samym IORequeście, co odgrywasz dźwięk, ale synchronicznie za pomocą DoIO() z ustawioną flagą IOF_QUICK.Tak, bo ta flaga powoduje, że request nie jest wstawiany do kolejki, więc jego struktura Node nie podlega modyfikacji. Z drugiej strony ja bym na wszelki wypadek użył kopii requesta, to raptem kilkadziesiąt bajtów...
@Hexmage960, post #11
@cholok, post #17
@asman, post #19
@Hexmage960, post #20
@asman, post #19
@Phibrizzo, post #1
#define KANAL_LEWY 0 #define KANAL_PRAWY 1 BOOL PaulaInit(void) { UBYTE Channel[] = {3}; if(AudioPort = CreateMsgPort()) { AudioIO[0] = (struct IOAudio*)CreateIORequest(AudioPort, sizeof(struct IOAudio)); AudioIO[1] = (struct IOAudio*)CreateIORequest(AudioPort, sizeof(struct IOAudio)); if(AudioIO[1]) { AudioIO[0]->ioa_Request.io_Message.mn_ReplyPort = AudioPort; AudioIO[0]->ioa_Request.io_Message.mn_Node.ln_Pri = 127; AudioIO[0]->ioa_Request.io_Command = ADCMD_ALLOCATE; AudioIO[0]->ioa_Request.io_Flags = ADIOF_NOWAIT; AudioIO[0]->ioa_AllocKey = 0; AudioIO[0]->ioa_Data = Channel; AudioIO[0]->ioa_Length = sizeof(Channel); if(OpenDevice(AUDIONAME, 0L, (struct IORequest*)AudioIO[0], 0L) == NULL) { CopyMem(AudioIO[0], AudioIO[1], sizeof(struct IOAudio)); return(TRUE); } } } return(FALSE); } void PaulaKill(void) { if(AudioIO[1] && AudioIO[1]->ioa_Request.io_Device) { AbortIO((struct IORequest*)AudioIO[1]); } if(AudioIO[0] && AudioIO[0]->ioa_Request.io_Device) { AbortIO((struct IORequest*)AudioIO[0]); CloseDevice((struct IORequest*)AudioIO[0]); } if(AudioIO[1]) { DeleteIORequest(AudioIO[0]); DeleteIORequest(AudioIO[1]); } if(AudioPort) DeleteMsgPort(AudioPort); } void PaulaPlay(int sfx, BYTE unit) { if(CheckIO((struct IORequest*)AudioIO[unit]) == NULL) { AbortIO((struct IORequest*)AudioIO[unit]); } AudioIO[unit]->ioa_Request.io_Command = CMD_WRITE; AudioIO[unit]->ioa_Request.io_Flags = ADIOF_PERVOL; AudioIO[unit]->ioa_Request.io_Unit = (APTR)(1 << unit); AudioIO[unit]->ioa_Data = Dzwieki[sfx].Adres; AudioIO[unit]->ioa_Length = Dzwieki[sfx].Len; AudioIO[unit]->ioa_Period = (UWORD)(Dzwieki[sfx].Period); AudioIO[unit]->ioa_Volume = (UWORD)(63); AudioIO[unit]->ioa_Cycles = 1; BeginIO((struct IORequest*)AudioIO[unit]); }
@Phibrizzo, post #26