I w tym wypadku waveOutReset oczywiście zawiesza program.
No to w tym momencie trochę się pogubiłem ;) Czyli na karcie wbudowanej z callback'iem wszystko chodzi, tak???
No właśnie, jak tego nie ma, to wydaje mam wrażenie, że są wycieki... Uważasz, że to zbędne, skoro później robię FreeMem dla tego bufora?
No ale jak??? Jeżeli wyzerujesz wskaźnik FBuffer[0].lpData, a później dasz FreeMem(FBuffer[0].lpData); to de facto nic nie zwalniasz ;) no chyba, że wskaźniki przechowujesz gdzieś, w innej tablicy (choć to bez sensu). Poza tym bufory powinieneś zwalniać po odpreparowaniu funkcją waveOutUnprepareHeader.
Czy chodzi tylko o "estetykę"?
Między innymi tak ale:
twoja wersja:
HDR := PWAVEHDR(Msg.LParam);
...
i (parametr funkcji):=HDR^.dwUser
...
FBuffer[i].lpData //<--- niepotrzebne obliczanie offsetu i*sizeof(WAVEHDR)
wersja gdzie PrepareBuffer zamiast indexu bierze adres:
lpBuffer (parametr funkcji):=Msg.LParam
...
lpBuffer^.lpData
czyli z dwóch przypisań i obliczania offsetu mamy jedno przypisanie ;) To są drobiazgi ale jak takich drobiazgów zrobi się kilkadziesiąt/kilkaset w miescu gdzie wymagana jest wysoka wydajność to... sam rozumiesz ;) W przypadku twojego kodu to raczej chodziło mi o estetykę - tak mi się rzuciło w oczy ;P
Nie to, że mi się Delphi nie podoba, tylko, że rejony związane z muzyką - czyli moją branżą - zdecydowanie łatwiej programuje się w C++, albo tak mi się wydaje...
No nie sądze. Bez poznania mechanizmów związanych w obsługą audio (choć nie tylko) to i C/C++ nie pomoże ;) Wiesz, ja przez to wszystko przechodziłem, włączając twój problem ale z czasem wszystko stało się w miarę przejrzyste. W miarę, bo cały czas poznaje różne techniki audio.
Wracając do książki, myślałem, że dowiem się jakie są różnice (sens) w Callback do funkcji, okna, zdarzenia, wątku. A tu nadal jestem w lesie
W skrócie:
Callback: oddzielny wątek; funkcja wywoływana przy otwieraniu, zamykaniu i zwracaniu bufora. W sam raz gdy odtwarzany dzwięk jest jeszcze obrabiany np: przez efekty. Minus - konieczność synchronizacji z wątkiem applikacji.
Thread: idea podobna do wysyłania komunikatów do okna tyle, że te komunikaty wysyłane są do message loop, którą trzeba samemu zrobić. Całą tą pętle umieszczasz w oddzielnym wątku stworzonym funkcją CreateThread. Plusy i minusy jak w opcji z callbackiem. Prawdopodobnie łatwiej zrobić przekierowanie wejścia do wyjścia audio (np. processor effektów choć na waveOut i waveIn to absurd ;P)
Komunikaty okienkowe Raczej nie nadaje się tam gdzie dźwięk jest intensywnie przetwarzany efektami - może blokować aplikacje. Do prostego odtwarzania audio.
Event idea prosta. Przed zakolejkowaniem bufora ustawiasz event na stan nonsignaled. W chwili gdy driver skończy z bufforem zmieni stan na signaled. Funkcją WaitForSingleObject sprawdzasz jaki jest stan event'a. Z tego co zaobserwowałem, to rzadko jest to stosowane.