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>
This commit is contained in:
malc 2009-10-15 02:11:25 +04:00
parent a91b857c38
commit 2a117d401d

View File

@ -68,6 +68,10 @@ static void winwave_log_mmresult (MMRESULT mr)
"hasn't been prepared"; "hasn't been prepared";
break; break;
case WAVERR_STILLPLAYING:
str = "There are still buffers in the queue";
break;
default: default:
AUD_log (AUDIO_CAP, "Reason: Unknown (MMRESULT %#x)\n", mr); AUD_log (AUDIO_CAP, "Reason: Unknown (MMRESULT %#x)\n", mr);
return; return;
@ -262,8 +266,23 @@ static void winwave_poll_out (void *opaque)
static void winwave_fini_out (HWVoiceOut *hw) static void winwave_fini_out (HWVoiceOut *hw)
{ {
int i;
MMRESULT mr;
WaveVoiceOut *wave = (WaveVoiceOut *) hw; 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); winwave_anal_close_out (wave);
if (wave->event) { if (wave->event) {