From 8731accd3f40b25632fa0f90c8954a5f0b1fd5a5 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 27 Mar 2020 01:03:01 -0700 Subject: [PATCH] Make sure prebuf is filled when starting pulseaudio playback --- alc/backends/pulseaudio.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/alc/backends/pulseaudio.cpp b/alc/backends/pulseaudio.cpp index bd1dd54a..4d546f44 100644 --- a/alc/backends/pulseaudio.cpp +++ b/alc/backends/pulseaudio.cpp @@ -1050,8 +1050,32 @@ bool PulsePlayback::start() pa_stream_set_write_callback(mStream, &PulsePlayback::streamWriteCallbackC, this); pa_operation *op{pa_stream_cork(mStream, 0, &PulseMainloop::streamSuccessCallbackC, &mMainloop)}; - mMainloop.waitForOperation(op, plock); + /* Write some (silent) samples to fill the prebuf amount if needed. */ + if(size_t prebuf{mAttr.prebuf}) + { + prebuf = minz(prebuf, pa_stream_writable_size(mStream)); + + void *buf{pa_xmalloc(prebuf)}; + switch(mSpec.format) + { + case PA_SAMPLE_U8: + std::fill_n(static_cast(buf), prebuf, 0x80); + break; + case PA_SAMPLE_ALAW: + std::fill_n(static_cast(buf), prebuf, 0xD5); + break; + case PA_SAMPLE_ULAW: + std::fill_n(static_cast(buf), prebuf, 0x7f); + break; + default: + std::fill_n(static_cast(buf), prebuf, 0x00); + break; + } + pa_stream_write(mStream, buf, prebuf, pa_xfree, 0, PA_SEEK_RELATIVE); + } + + mMainloop.waitForOperation(op, plock); return true; }