summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMikko Hallamaa <mikko.hallamaa@qt.io>2023-12-29 14:02:18 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-08 12:51:19 +0000
commitaed05293fb7ae7e099b03f6eac21865eebb314f3 (patch)
treea8d797f92dd0053b36574bb23a89364023a5cc5f /src
parent80abf2be0b3549c1e8ae92fce80205a36e66b845 (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.cpp20
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)