summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2022-06-10 11:47:11 +1000
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-07-13 23:48:48 +0000
commit3c27884775acd69986654cd33e10a76b05b172a9 (patch)
tree17dd191b063ec7f6097e505ffda4cf3e7700183f
parent7ec7a2eec364802da04786fb0f5497c8bb4ba855 (diff)
downloadqtmultimedia-3c27884775acd69986654cd33e10a76b05b172a9.tar.gz
wasm: make sure buffer stops when there's no more data
and a few other style fixes Change-Id: I9913149501eab320c044eac7832c0bb22ce62425 Reviewed-by: Lars Knoll <lars.knoll@gmail.com> (cherry picked from commit 4bdbdb889a746a47972b449ae00edbd1758a7ef3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/multimedia/wasm/qwasmaudiosink.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/multimedia/wasm/qwasmaudiosink.cpp b/src/multimedia/wasm/qwasmaudiosink.cpp
index 8ed28a778..7c6a5cff1 100644
--- a/src/multimedia/wasm/qwasmaudiosink.cpp
+++ b/src/multimedia/wasm/qwasmaudiosink.cpp
@@ -41,7 +41,8 @@ protected:
qint64 writeData(const char *data, qint64 len) override;
};
-QWasmAudioSink::QWasmAudioSink(const QByteArray &device) : m_name(device)
+QWasmAudioSink::QWasmAudioSink(const QByteArray &device)
+ : m_name(device)
{
m_timer.setSingleShot(false);
aldata = new ALData();
@@ -141,7 +142,6 @@ void QWasmAudioSink::start(bool mode)
}
alcMakeContextCurrent(aldata->context);
-
alGenSources(1, &aldata->source);
if (m_bufferSize > 0)
@@ -298,8 +298,12 @@ void QWasmAudioSink::loadALBuffers()
if (m_bufferFragmentsBusyCount == m_bufferFragmentsCount)
return;
+ if (m_device->bytesAvailable() == 0) {
+ return;
+ }
+
auto size = m_device->read(m_tmpData + m_tmpDataOffset, m_bufferFragmentSize -
- m_tmpDataOffset);
+ m_tmpDataOffset);
m_tmpDataOffset += size;
if (!m_tmpDataOffset || (m_tmpDataOffset != m_bufferFragmentSize &&
m_bufferFragmentsBusyCount >= m_bufferFragmentsCount * 2 / 3))
@@ -357,7 +361,7 @@ void QWasmAudioSink::nextALBuffers()
loadALBuffers();
ALint state;
alGetSourcei(aldata->source, AL_SOURCE_STATE, &state);
- if (state != AL_PLAYING)
+ if (state != AL_PLAYING && m_error == QAudio::NoError)
alSourcePlay(aldata->source);
updateState();
}
@@ -369,7 +373,7 @@ void QWasmAudioSink::updateState()
return;
m_state = current;
- if (m_state == QAudio::IdleState && m_running)
+ if (m_state == QAudio::IdleState && m_running && m_device->bytesAvailable() == 0)
setError(QAudio::UnderrunError);
emit stateChanged(m_state);
@@ -381,10 +385,16 @@ void QWasmAudioSink::setError(QAudio::Error error)
if (error == m_error)
return;
m_error = error;
+ if (error != QAudio::NoError) {
+ m_timer.stop();
+ alSourceRewind(aldata->source);
+ }
+
emit errorChanged(error);
}
-QWasmAudioSinkDevice::QWasmAudioSinkDevice(QWasmAudioSink *parent) : QIODevice(parent),
+QWasmAudioSinkDevice::QWasmAudioSinkDevice(QWasmAudioSink *parent)
+ : QIODevice(parent),
m_out(parent)
{
}