qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v11] audio/pwaudio.c: Add Pipewire audio backend for QEMU


From: Volker Rümelin
Subject: Re: [PATCH v11] audio/pwaudio.c: Add Pipewire audio backend for QEMU
Date: Thu, 13 Apr 2023 07:41:19 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1

Am 12.04.23 um 15:59 schrieb Dorinda Bassey:
> Hi Volker,
>
> It seems that for some unknown reason using audio_pcm_info_clear_buf in 
> playback_process causes segmentation fault. Hence I moved the handling of 
> buffer underruns from the playback process to the qpw_write process because 
> that is the underlying cause of buffer underrun.
>

Hi Dorinda,

I guess you made a mistake somewhere if you see a segmentation fault. This 
patch for v10 works fine on my computer.

diff --git a/audio/pwaudio.c b/audio/pwaudio.c
index f9da86059f..0f272d6744 100644
--- a/audio/pwaudio.c
+++ b/audio/pwaudio.c
@@ -79,7 +79,7 @@ stream_destroy(void *data)
 static void
 playback_on_process(void *data)
 {
-    PWVoice *v = (PWVoice *) data;
+    PWVoice *v = data;
     void *p;
     struct pw_buffer *b;
     struct spa_buffer *buf;
@@ -108,19 +108,28 @@ playback_on_process(void *data)
     n_bytes = SPA_MIN(req, buf->datas[0].maxsize);
 
     /* get no of available bytes to read data from buffer */
-
     avail = spa_ringbuffer_get_read_index(&v->ring, &index);
+    if (avail <= 0) {
+        PWVoiceOut *vo = container_of(data, PWVoiceOut, v);
 
-    if (avail < (int32_t) n_bytes) {
-        n_bytes = avail;
-    }
+        audio_pcm_info_clear_buf(&vo->hw.info, p, n_bytes / v->frame_size);
+    } else {
+        if ((uint32_t)avail < n_bytes) {
+            /*
+             * PipeWire immediately calls this callback again if we provide
+             * less than n_bytes. Then audio_pcm_info_clear_buf() fills the
+             * rest of the buffer with silence.
+             */
+            n_bytes = avail;
+        }
 
-    spa_ringbuffer_read_data(&v->ring,
-                                v->buffer, RINGBUFFER_SIZE,
-                                index & RINGBUFFER_MASK, p, n_bytes);
+        spa_ringbuffer_read_data(&v->ring,
+                                 v->buffer, RINGBUFFER_SIZE,
+                                 index & RINGBUFFER_MASK, p, n_bytes);
 
-    index += n_bytes;
-    spa_ringbuffer_read_update(&v->ring, index);
+        index += n_bytes;
+        spa_ringbuffer_read_update(&v->ring, index);
+    }
 
     buf->datas[0].chunk->offset = 0;
     buf->datas[0].chunk->stride = v->frame_size;
-- 
2.35.3

With best regards,
Volker




reply via email to

[Prev in Thread] Current Thread [Next in Thread]