diff options
author | Mikko Hallamaa <mikko.hallamaa@qt.io> | 2024-03-19 16:36:13 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-21 13:35:27 +0000 |
commit | d9a09602458c4763f04131c4b6951e4295b2a07e (patch) | |
tree | 538abb8169924647471b70934a3d838ab4efdd40 | |
parent | dd90247c23da07e82be78574f2ab0d9e3ad0b297 (diff) |
PulseAudio: Clean up readable byte amount logic
This patch cleans up the logic in QPulseAudioSource by calling
pa_stream_readable_size() directly in bytesReady() instead of keeping
around a member variable that needs to be kept updated.
Pick-to: 6.5
Change-Id: Ia8de889ff0805f43b302745cf3b5f1c98b68b71f
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit 33f03b352ea5cf0a533dcc131080dbf71bd6fbef)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit b56ca7e1b8c2f877d187d8d6a207fe2e0ec2ba56)
-rw-r--r-- | src/multimedia/pulseaudio/qpulseaudiosource.cpp | 43 | ||||
-rw-r--r-- | src/multimedia/pulseaudio/qpulseaudiosource_p.h | 3 |
2 files changed, 16 insertions, 30 deletions
diff --git a/src/multimedia/pulseaudio/qpulseaudiosource.cpp b/src/multimedia/pulseaudio/qpulseaudiosource.cpp index e523fd21e..4be3afd5e 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosource.cpp +++ b/src/multimedia/pulseaudio/qpulseaudiosource.cpp @@ -97,7 +97,6 @@ QPulseAudioSource::QPulseAudioSource(const QByteArray &device, QObject *parent) , m_volume(qreal(1.0f)) , m_pullMode(true) , m_opened(false) - , m_bytesAvailable(0) , m_bufferSize(0) , m_periodSize(0) , m_periodTime(SourcePeriodTimeMs) @@ -317,22 +316,27 @@ void QPulseAudioSource::close() m_opened = false; } -int QPulseAudioSource::checkBytesReady() -{ - m_bytesAvailable = m_stateMachine.isActiveOrIdle() ? pa_stream_readable_size(m_stream) : 0; - return m_bytesAvailable; -} - qsizetype QPulseAudioSource::bytesReady() const { - return qMax(m_bytesAvailable, 0); + if (!m_stateMachine.isActiveOrIdle()) + return 0; + + std::lock_guard lock(*QPulseAudioEngine::instance()); + + int bytes = pa_stream_readable_size(m_stream); + if (bytes < 0) { + qWarning() << "pa_stream_readable_size() failed:" + << pa_strerror(pa_context_errno(pa_stream_get_context(m_stream))); + return 0; + } + + return static_cast<qsizetype>(bytes); } qint64 QPulseAudioSource::read(char *data, qint64 len) { Q_ASSERT(data != nullptr || len == 0); - m_bytesAvailable = checkBytesReady(); m_stateMachine.updateActiveOrIdle(true, QAudio::NoError); int readBytes = 0; @@ -512,34 +516,19 @@ void QPulseAudioSource::userFeed() // QTime now(QTime::currentTime()); // qDebug()<< now.second() << "s " << now.msec() << "ms :userFeed() IN"; #endif - deviceReady(); -} - -bool QPulseAudioSource::deviceReady() -{ if (m_pullMode) { // reads some audio data and writes it to QIODevice read(nullptr,0); - } else { + } else if (m_audioSource != nullptr) { // emits readyRead() so user will call read() on QIODevice to get some audio data - if (m_audioSource != nullptr) { - PulseInputPrivate *a = qobject_cast<PulseInputPrivate*>(m_audioSource); - a->trigger(); - } + PulseInputPrivate *a = qobject_cast<PulseInputPrivate*>(m_audioSource); + a->trigger(); } - m_bytesAvailable = checkBytesReady(); - - // TODO: This doesn't look correct, check how this should work -// if (m_deviceState != QAudio::ActiveState) -// return true; - - return true; } void QPulseAudioSource::reset() { stop(); - m_bytesAvailable = 0; } void QPulseAudioSource::onPulseContextFailed() diff --git a/src/multimedia/pulseaudio/qpulseaudiosource_p.h b/src/multimedia/pulseaudio/qpulseaudiosource_p.h index 3bf836dda..d652f81a0 100644 --- a/src/multimedia/pulseaudio/qpulseaudiosource_p.h +++ b/src/multimedia/pulseaudio/qpulseaudiosource_p.h @@ -71,19 +71,16 @@ protected: private slots: void userFeed(); - bool deviceReady(); void onPulseContextFailed(); private: void applyVolume(const void *src, void *dest, int len); - int checkBytesReady(); bool open(); void close(); bool m_pullMode; bool m_opened; - int m_bytesAvailable; int m_bufferSize; int m_periodSize; unsigned int m_periodTime; |