@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