[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