diff options
author | Mikko Hallamaa <mikko.hallamaa@qt.io> | 2023-12-29 14:02:18 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-01-08 12:51:19 +0000 |
commit | aed05293fb7ae7e099b03f6eac21865eebb314f3 (patch) | |
tree | a8d797f92dd0053b36574bb23a89364023a5cc5f /src | |
parent | 80abf2be0b3549c1e8ae92fce80205a36e66b845 (diff) |
Add a default PulseAudio buffer length
The target buffer length set by PulseAudio by default is quite long,
which causes playback issues in pull mode until the buffer length is
adjusted by PulseAudio in subsequent plays to be shorter.
This patch sets a default target length if buffer size is not set using
setBufferSize(), instead of using the buffer size decided by PulseAudio.
This also allows us to conform better to the documented
QAudioSink::bufferSize() behavior where it's supposed to return a
platform default value if called before start().
Task-number: QTBUG-111045
Pick-to: 6.6 6.5
Change-Id: I67ad7c83cb0f7c34da82a7da7d2f5757f54bdbe5
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
(cherry picked from commit 6ec73a0b6471f311be1092fcff8f97f3b1c9f6c2)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/multimedia/pulseaudio/qpulseaudiosink.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/multimedia/pulseaudio/qpulseaudiosink.cpp b/src/multimedia/pulseaudio/qpulseaudiosink.cpp index c9af00aa6..a330b43dd 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosink.cpp +++ b/src/multimedia/pulseaudio/qpulseaudiosink.cpp @@ -17,6 +17,7 @@ QT_BEGIN_NAMESPACE static constexpr uint SinkPeriodTimeMs = 20; +static constexpr uint DefaultBufferLengthMs = 100; #define LOW_LATENCY_CATEGORY_NAME "game" @@ -288,14 +289,17 @@ bool QPulseAudioSink::open() pa_stream_set_latency_update_callback(m_stream, outputStreamLatencyCallback, this); pa_buffer_attr requestedBuffer; + // Request a target buffer size + auto targetBufferSize = bufferSize(); + requestedBuffer.tlength = targetBufferSize ? targetBufferSize : (uint32_t)-1; + // Rest should be determined by PulseAudio requestedBuffer.fragsize = (uint32_t)-1; requestedBuffer.maxlength = (uint32_t)-1; requestedBuffer.minreq = (uint32_t)-1; requestedBuffer.prebuf = (uint32_t)-1; - requestedBuffer.tlength = m_bufferSize; pa_stream_flags flags = pa_stream_flags(PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_ADJUST_LATENCY); - if (pa_stream_connect_playback(m_stream, m_device.data(), (m_bufferSize > 0) ? &requestedBuffer : nullptr, flags, nullptr, nullptr) < 0) { + if (pa_stream_connect_playback(m_stream, m_device.data(), &requestedBuffer, flags, nullptr, nullptr) < 0) { qCWarning(qLcPulseAudioOut) << "pa_stream_connect_playback() failed!"; pa_stream_unref(m_stream); m_stream = nullptr; @@ -532,7 +536,17 @@ void QPulseAudioSink::setBufferSize(qsizetype value) qsizetype QPulseAudioSink::bufferSize() const { - return m_bufferSize; + if (m_bufferSize) + return m_bufferSize; + + if (m_spec.rate > 0) + return pa_usec_to_bytes(DefaultBufferLengthMs * 1000, &m_spec); + + auto spec = QPulseAudioInternal::audioFormatToSampleSpec(m_format); + if (pa_sample_spec_valid(&spec)) + return pa_usec_to_bytes(DefaultBufferLengthMs * 1000, &spec); + + return 0; } static qint64 operator-(timeval t1, timeval t2) |