summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/pulseaudio/qpulseaudiosink.cpp29
-rw-r--r--src/multimedia/pulseaudio/qpulseaudiosink_p.h5
2 files changed, 23 insertions, 11 deletions
diff --git a/src/multimedia/pulseaudio/qpulseaudiosink.cpp b/src/multimedia/pulseaudio/qpulseaudiosink.cpp
index 39d21b560..ff526e1b1 100644
--- a/src/multimedia/pulseaudio/qpulseaudiosink.cpp
+++ b/src/multimedia/pulseaudio/qpulseaudiosink.cpp
@@ -303,8 +303,9 @@ bool QPulseAudioSink::open()
pa_buffer_attr requestedBuffer;
// Request a target buffer size
- auto targetBufferSize = bufferSize();
- requestedBuffer.tlength = targetBufferSize ? targetBufferSize : static_cast<uint32_t>(-1);
+ auto targetBufferSize = m_userBufferSize ? *m_userBufferSize : defaultBufferSize();
+ requestedBuffer.tlength =
+ targetBufferSize ? static_cast<uint32_t>(targetBufferSize) : static_cast<uint32_t>(-1);
// Rest should be determined by PulseAudio
requestedBuffer.fragsize = static_cast<uint32_t>(-1);
requestedBuffer.maxlength = static_cast<uint32_t>(-1);
@@ -537,7 +538,7 @@ qsizetype QPulseAudioSink::bytesFree() const
void QPulseAudioSink::setBufferSize(qsizetype value)
{
- m_bufferSize = value;
+ m_userBufferSize = value;
}
qsizetype QPulseAudioSink::bufferSize() const
@@ -545,14 +546,10 @@ qsizetype QPulseAudioSink::bufferSize() const
if (m_bufferSize)
return m_bufferSize;
- if (m_spec.rate > 0)
- return pa_usec_to_bytes(DefaultBufferLengthMs * 1000, &m_spec);
+ if (m_userBufferSize)
+ return *m_userBufferSize;
- auto spec = QPulseAudioInternal::audioFormatToSampleSpec(m_format);
- if (pa_sample_spec_valid(&spec))
- return pa_usec_to_bytes(DefaultBufferLengthMs * 1000, &spec);
-
- return 0;
+ return defaultBufferSize();
}
static qint64 operator-(timeval t1, timeval t2)
@@ -732,6 +729,18 @@ PAOperationUPtr QPulseAudioSink::exchangeDrainOperation(pa_operation *newOperati
return PAOperationUPtr(m_drainOperation.exchange(newOperation));
}
+qsizetype QPulseAudioSink::defaultBufferSize() const
+{
+ 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;
+}
+
QT_END_NAMESPACE
#include "moc_qpulseaudiosink_p.cpp"
diff --git a/src/multimedia/pulseaudio/qpulseaudiosink_p.h b/src/multimedia/pulseaudio/qpulseaudiosink_p.h
index d7c320f7c..cf0b181ec 100644
--- a/src/multimedia/pulseaudio/qpulseaudiosink_p.h
+++ b/src/multimedia/pulseaudio/qpulseaudiosink_p.h
@@ -80,6 +80,8 @@ private Q_SLOTS:
PAOperationUPtr exchangeDrainOperation(pa_operation *newOperation);
private:
+ qsizetype defaultBufferSize() const;
+
pa_sample_spec m_spec = {};
// calculate timing manually, as pulseaudio doesn't give us good enough data
mutable timeval lastTimingInfo = {};
@@ -102,8 +104,9 @@ private:
qreal m_volume = 1.0;
std::atomic<pa_operation *> m_drainOperation = nullptr;
+ qsizetype m_bufferSize = 0;
+ std::optional<qsizetype> m_userBufferSize = std::nullopt;
int m_pullingPeriodSize = 0;
- int m_bufferSize = 0;
int m_pullingPeriodTime = 0;
bool m_pullMode = true;
bool m_opened = false;