Dlaczego kolejkowanie komend CMD_WRITE audio.device nie działa? Dokumentacja mówi, że polecenia CMD_WRITE audio.device powinny ustawiać się w kolejce. System zawiesza się gdy podejmuję takiej próby. Odkryłem, że pewnym obejściem jest krótka przerwa pomiędzy wywołaniami BeginIO(), ale czy da się zrobić by te wywołania były bezpośrednio po sobie? Więc oto kod przykładowy:
Procedura Play_Sample() powinna odtworzyć zapętlony dźwięk taki jaki znamy z MODów lub MEDów to znaczy, że najpierw jednorazowo odtworzony jest cały sampel po czym wielokrotnie odtworzona zostaje część zapętlona. Pobiera następujące parametry
- ioa, aux - zainicjalizowane struktury IOAudio, pierwsza użyta do jednorazowego odegrania sampla, druga do odegrania jego częśći zapętlonej.
- data - ciało sampla
- length - długość sampla
- rep - pozycja początku zapętlenia
- replen - długość zapętlenia
- period - okres (częstotliwość)
- volume - głośność
void Play_Sample(struct IOAudio *ioa, struct IOAudio *aux, ULONG data, ULONG length, ULONG rep, ULONG replen, ULONG period, ULONG volume)
{
ioa->ioa_Request.io_Command = CMD_WRITE;
ioa->ioa_Request.io_Flags = ADIOF_PERVOL;
ioa->ioa_Data = data;
ioa->ioa_Length = length;
ioa->ioa_Period = period;
ioa->ioa_Volume = volume;
ioa->ioa_Cycles = 1;
BeginIO((struct IORequest *)ioa);
aux->ioa_Request.io_Command = CMD_WRITE;
aux->ioa_Request.io_Flags = ADIOF_PERVOL;
aux->ioa_Data = rep;
aux->ioa_Length = replen;
aux->ioa_Period = period;
aux->ioa_Volume = volume;
aux->ioa_Cycles = 10; // tutaj można wstawić 0 dla nieskończonej pętli
BeginIO((struct IORequest *)aux);
}
Powyższy kod zawiesza się o ile między kolejnymi BeginIO() nie ma żadnej przerwy. Tymczasowo rozwiązuję ten problem sprawdzając w programie za pomocą CheckIO(), czy jednorazowa część sampla została odegrana i puszczam wtedy część zapętloną, ale zależy mi na szybkości, tj. by część zapętlona sampla była odgrywana w przerwaniu.
No nic, jeśli ten kod nie zadziała to spróbuję odtwarzać część zapętloną po krótkiej przerwie. Mam jeszcze pytanie - jak wykorzystać flagę ADIOF_WRITEMESSAGE?