[vlc-commits] Revert "pulse: use pa_stream_begin_write()" (fixes #25187)
Rémi Denis-Courmont
git at videolan.org
Mon Feb 8 15:14:53 UTC 2021
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Feb 6 11:34:32 2021 +0200| [bab6469b0a73bd3801a58fd1c3bba4ecbcb40e55] | committer: Rémi Denis-Courmont
Revert "pulse: use pa_stream_begin_write()" (fixes #25187)
Contrary to claims in the commit message, it introduces an extra memory
copy of all audio samples for no apparent reasons.
This reverts commit 0bdc7268dc450de0e4b2944726f366cb340eca21.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bab6469b0a73bd3801a58fd1c3bba4ecbcb40e55
---
modules/audio_output/pulse.c | 47 ++++++++++++++++++++++++++++++--------------
1 file changed, 32 insertions(+), 15 deletions(-)
diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index fba8fd6840..907f32fab6 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -458,6 +458,30 @@ static int TimeGet(audio_output_t *aout, vlc_tick_t *restrict delay)
return ret;
}
+/* Memory free callback. The block_t address is in front of the data. */
+static void data_free(void *data)
+{
+ block_t **pp = data, *block;
+
+ memcpy(&block, pp - 1, sizeof (block));
+ block_Release(block);
+}
+
+static void *data_convert(block_t **pp)
+{
+ block_t *block = *pp;
+ /* In most cases, there is enough head room, and this is really cheap: */
+ block = block_Realloc(block, sizeof (block), block->i_buffer);
+ *pp = block;
+ if (unlikely(block == NULL))
+ return NULL;
+
+ memcpy(block->p_buffer, &block, sizeof (block));
+ block->p_buffer += sizeof (block);
+ block->i_buffer -= sizeof (block);
+ return block->p_buffer;
+}
+
/**
* Queue one audio frame to the playback stream
*/
@@ -466,6 +490,11 @@ static void Play(audio_output_t *aout, block_t *block, vlc_tick_t date)
aout_sys_t *sys = aout->sys;
pa_stream *s = sys->stream;
+ const void *ptr = data_convert(&block);
+ if (unlikely(ptr == NULL))
+ return;
+
+ size_t len = block->i_buffer;
/* Note: The core already holds the output FIFO lock at this point.
* Therefore we must not under any circumstances (try to) acquire the
@@ -486,24 +515,12 @@ static void Play(audio_output_t *aout, block_t *block, vlc_tick_t date)
pa_operation_unref(pa_stream_flush(s, NULL, NULL));
}
#endif
- while (block->i_buffer > 0)
- {
- void *ptr;
- size_t len = block->i_buffer;
-
- if (pa_stream_begin_write(s, &ptr, &len))
- vlc_pa_error(aout, "cannot begin write", sys->context);
- memcpy(ptr, block->p_buffer, len);
- block->p_buffer += len;
- block->i_buffer -= len;
-
- if (pa_stream_write(s, ptr, len, NULL, 0, PA_SEEK_RELATIVE) < 0)
- vlc_pa_error(aout, "cannot write", sys->context);
+ if (pa_stream_write(s, ptr, len, data_free, 0, PA_SEEK_RELATIVE) < 0) {
+ vlc_pa_error(aout, "cannot write", sys->context);
+ block_Release(block);
}
- block_Release(block);
-
pa_threaded_mainloop_unlock(sys->mainloop);
}
More information about the vlc-commits
mailing list