OSDN Git Service

winwave: follow the rules when closing the output device
authormalc <av1474@comtv.ru>
Wed, 14 Oct 2009 22:11:25 +0000 (02:11 +0400)
committermalc <av1474@comtv.ru>
Wed, 14 Oct 2009 22:11:25 +0000 (02:11 +0400)
a. call waveOutReset to drain the queue
b. unprepare headers before freeing underlying memory

Signed-off-by: malc <av1474@comtv.ru>
audio/winwaveaudio.c

index f43ae95..d467c9d 100644 (file)
@@ -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) {