]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
audio: align audio_generic_read with audio_pcm_hw_run_in
authorVolker RĂ¼melin <vr_qemu@t-online.de>
Sun, 20 Sep 2020 17:17:24 +0000 (19:17 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Wed, 23 Sep 2020 06:19:42 +0000 (08:19 +0200)
The function audio_generic_read should work exactly like
audio_pcm_hw_run_in. It's a very similar function working
on a different buffer.

Signed-off-by: Volker RĂ¼melin <vr_qemu@t-online.de>
Message-id: 20200920171729.15861-4-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
audio/audio.c

index d5891e1928bcdb14934f23f2d2ca2f8e487e7e41..5c47a036028c45cea6bd983dc95ee3e15e9a549f 100644 (file)
@@ -1495,12 +1495,23 @@ size_t audio_generic_write(HWVoiceOut *hw, void *buf, size_t size)
 
 size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
 {
-    void *src = hw->pcm_ops->get_buffer_in(hw, &size);
+    size_t total = 0;
 
-    memcpy(buf, src, size);
-    hw->pcm_ops->put_buffer_in(hw, src, size);
+    while (total < size) {
+        size_t src_size = size - total;
+        void *src = hw->pcm_ops->get_buffer_in(hw, &src_size);
 
-    return size;
+        if (src_size == 0) {
+            hw->pcm_ops->put_buffer_in(hw, src, src_size);
+            break;
+        }
+
+        memcpy((char *)buf + total, src, src_size);
+        hw->pcm_ops->put_buffer_in(hw, src, src_size);
+        total += src_size;
+    }
+
+    return total;
 }
 
 static int audio_driver_init(AudioState *s, struct audio_driver *drv,