summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorVolker RĂ¼melin <vr_qemu@t-online.de>2020-09-20 19:17:24 +0200
committerGerd Hoffmann <kraxel@redhat.com>2020-09-23 08:19:42 +0200
commitb9896dc5becca1c6c2824d1ef8bcf00f5c74a6a9 (patch)
tree95e07008ef3bd5c9d23b2ae19c73e6cb8568124a
parentaec6d0dc4ef243b957115b3c3aef39c348fefb25 (diff)
downloadfocaccia-qemu-b9896dc5becca1c6c2824d1ef8bcf00f5c74a6a9.tar.gz
focaccia-qemu-b9896dc5becca1c6c2824d1ef8bcf00f5c74a6a9.zip
audio: align audio_generic_read with audio_pcm_hw_run_in
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>
Diffstat (limited to '')
-rw-r--r--audio/audio.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/audio/audio.c b/audio/audio.c
index d5891e1928..5c47a03602 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -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,