diff options
author | malc <av1474@comtv.ru> | 2009-10-15 02:11:25 +0400 |
---|---|---|
committer | malc <av1474@comtv.ru> | 2009-10-15 02:11:25 +0400 |
commit | 2a117d401d7f227c5f466834d24c11a2e7cffc00 (patch) | |
tree | 5d9ce50a55e6b97097e4e8096fd244d8701ea7af | |
parent | a91b857c383b1945d33413d37764693a87661409 (diff) |
winwave: follow the rules when closing the output device
a. call waveOutReset to drain the queue
b. unprepare headers before freeing underlying memory
Signed-off-by: malc <av1474@comtv.ru>
-rw-r--r-- | audio/winwaveaudio.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c index f43ae95cf4..d467c9d04f 100644 --- a/audio/winwaveaudio.c +++ b/audio/winwaveaudio.c @@ -68,6 +68,10 @@ static void winwave_log_mmresult (MMRESULT mr) "hasn't been prepared"; break; + case WAVERR_STILLPLAYING: + str = "There are still buffers in the queue"; + break; + default: AUD_log (AUDIO_CAP, "Reason: Unknown (MMRESULT %#x)\n", mr); return; @@ -262,8 +266,23 @@ static void winwave_poll_out (void *opaque) static void winwave_fini_out (HWVoiceOut *hw) { + int i; + MMRESULT mr; WaveVoiceOut *wave = (WaveVoiceOut *) hw; + mr = waveOutReset (wave->hwo); + if (mr != MMSYSERR_NOERROR) { + winwave_logerr (mr, "waveOutReset\n"); + } + + for (i = 0; i < conf.dac_headers; ++i) { + mr = waveOutUnprepareHeader (wave->hwo, &wave->hdrs[i], + sizeof (wave->hdrs[i])); + if (mr != MMSYSERR_NOERROR) { + winwave_logerr (mr, "waveOutUnprepareHeader(%d)\n", i); + } + } + winwave_anal_close_out (wave); if (wave->event) { |