diff options
Diffstat (limited to 'src/multimedia')
-rw-r--r-- | src/multimedia/pulseaudio/qpulseaudiosink.cpp | 29 | ||||
-rw-r--r-- | src/multimedia/pulseaudio/qpulseaudiosink_p.h | 5 |
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; |