From 2a117d401d7f227c5f466834d24c11a2e7cffc00 Mon Sep 17 00:00:00 2001 From: malc Date: Thu, 15 Oct 2009 02:11:25 +0400 Subject: 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 --- audio/winwaveaudio.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c index f43ae95..d467c9d 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) { -- cgit v1.1