summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikko Hallamaa <mikko.hallamaa@qt.io>2024-03-19 16:36:13 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-21 13:35:27 +0000
commitd9a09602458c4763f04131c4b6951e4295b2a07e (patch)
tree538abb8169924647471b70934a3d838ab4efdd40
parentdd90247c23da07e82be78574f2ab0d9e3ad0b297 (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.cpp43
-rw-r--r--src/multimedia/pulseaudio/qpulseaudiosource_p.h3
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;