diff options
author | Chris Robinson <[email protected]> | 2021-04-19 04:42:28 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2021-04-19 04:42:28 -0700 |
commit | ccb1355cc82fa964d951d8f8bb013e2040bfee89 (patch) | |
tree | 6e50eb8c5d510bc0d93f5823bf091c33e28accbe | |
parent | 2b64008b3e565e4129784872002acd23d26580dd (diff) |
Fill the PulseAudio buffer before uncorking playback
-rw-r--r-- | alc/backends/pulseaudio.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/alc/backends/pulseaudio.cpp b/alc/backends/pulseaudio.cpp index 448cce94..00365721 100644 --- a/alc/backends/pulseaudio.cpp +++ b/alc/backends/pulseaudio.cpp @@ -1033,34 +1033,34 @@ void PulsePlayback::start() { auto plock = mMainloop.getUniqueLock(); - pa_stream_set_write_callback(mStream, &PulsePlayback::streamWriteCallbackC, this); - pa_operation *op{pa_stream_cork(mStream, 0, &PulseMainloop::streamSuccessCallbackC, - &mMainloop)}; - - /* Write some (silent) samples to fill the prebuf amount if needed. */ - if(size_t prebuf{mAttr.prebuf}) + /* Write some (silent) samples to fill the buffer before we start feeding + * it newly mixed samples. + */ + if(size_t todo{pa_stream_writable_size(mStream)}) { - prebuf = minz(prebuf, pa_stream_writable_size(mStream)); - - void *buf{pa_xmalloc(prebuf)}; + void *buf{pa_xmalloc(todo)}; switch(mSpec.format) { case PA_SAMPLE_U8: - std::fill_n(static_cast<uint8_t*>(buf), prebuf, 0x80); + std::fill_n(static_cast<uint8_t*>(buf), todo, 0x80); break; case PA_SAMPLE_ALAW: - std::fill_n(static_cast<uint8_t*>(buf), prebuf, 0xD5); + std::fill_n(static_cast<uint8_t*>(buf), todo, 0xD5); break; case PA_SAMPLE_ULAW: - std::fill_n(static_cast<uint8_t*>(buf), prebuf, 0x7f); + std::fill_n(static_cast<uint8_t*>(buf), todo, 0x7f); break; default: - std::fill_n(static_cast<uint8_t*>(buf), prebuf, 0x00); + std::fill_n(static_cast<uint8_t*>(buf), todo, 0x00); break; } - pa_stream_write(mStream, buf, prebuf, pa_xfree, 0, PA_SEEK_RELATIVE); + pa_stream_write(mStream, buf, todo, pa_xfree, 0, PA_SEEK_RELATIVE); } + pa_stream_set_write_callback(mStream, &PulsePlayback::streamWriteCallbackC, this); + pa_operation *op{pa_stream_cork(mStream, 0, &PulseMainloop::streamSuccessCallbackC, + &mMainloop)}; + mMainloop.waitForOperation(op, plock); } |