diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2022-06-10 11:47:11 +1000 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-07-13 23:48:48 +0000 |
commit | 3c27884775acd69986654cd33e10a76b05b172a9 (patch) | |
tree | 17dd191b063ec7f6097e505ffda4cf3e7700183f | |
parent | 7ec7a2eec364802da04786fb0f5497c8bb4ba855 (diff) | |
download | qtmultimedia-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.cpp | 22 |
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) { } |