Wann/Wo waveOutUnprepareHeader und waveOutClose aurufen



  • Hallo.

    Wenn ich mit waveOutOpen, waveOutPrepareHeader und waveOutWrite eine wave Datei abspiele, muss ich, nachdem die Datei abgespielt worden ist, die Funktionen waveOutUnprepareHeader und waveOutClose aufrufen (und auch noch evtl. allokierten Speicher freigeben).

    Nun ist nur die Frage: Wo mache ich das? Die Datei wir ja asynchron abgespielt und ich weiß nicht wann das Abspielen beendet ist. Nun dachte ich es wäre eine Möglichkeit dies in der Callbackfkt, von waveOutOpen machen, was ich aber nicht darf:

    Remarks

    Applications should not call any system-defined functions from inside a callback function, except for EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, and timeSetEvent. Calling other wave functions will cause deadlock.

    Wie wird dies nun richtig gemacht?

    Vielen Dank.


  • Mod

    Vielleicht soltest Du die Doku nicht vermischen.
    Was Du da zitierst steht für waveInProc!

    Für waveOutProc gilt das nicht:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd743866(v=vs.85).aspx

    Ich mag am liebsten die Event Variante... 😉

    If fdwOpen contains the CALLBACK_EVENT flag, dwCallback is a handle to an event. The event is signaled whenever the state of the waveform buffer changes. The application can use WaitForSingleObject or WaitForMultipleObjects to wait for the event. When the event is signaled, you can get the current state of the waveform buffer by checking the dwFlags member of the WAVEHDR structure. (See waveOutPrepareHeader.)



  • wie du schon sagst du musst das aufrufen wann du aufhören willst abzuspielen.
    Wann dies ist kann dir keiner sagen.
    Ich habe das immer so gemacht dass ich einen stream hatte und wann der eof war hab ich geschlossen. Außerdem das unprepare musst du immer erst am ende des abspielens aufrufen.


Anmelden zum Antworten