From 205be0edde97fd891a429b15abdb83ecae90c995 Mon Sep 17 00:00:00 2001 From: zetaPRIME Date: Sun, 27 Jan 2019 14:27:28 -0500 Subject: [PATCH] hacky fix for QAudioOutput leftovers --- xybrid/audio/audioengine.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/xybrid/audio/audioengine.cpp b/xybrid/audio/audioengine.cpp index 9bf2e26..51d6917 100644 --- a/xybrid/audio/audioengine.cpp +++ b/xybrid/audio/audioengine.cpp @@ -14,6 +14,7 @@ using namespace Xybrid::Data; #include #include #include +#include // zero-initialize AudioEngine* Xybrid::Audio::audioEngine = nullptr; @@ -101,8 +102,12 @@ void AudioEngine::initAudio(bool startNow) { void AudioEngine::deinitAudio() { if (output) { - output->stop(); - output.reset(); + QTimer::singleShot(20, [this] { // delay to flush buffers with silence, else we get leftovers on next playback + if (output && mode == Stopped) { + output->stop(); + output.reset(); + } + }); } } @@ -129,8 +134,6 @@ void AudioEngine::play(std::shared_ptr p) { output->start(this); - //tickId = 0; // actually, no reason to reset this - mode = Playing; emit this->playbackModeChanged(); }, Qt::QueuedConnection); @@ -141,6 +144,7 @@ void AudioEngine::stop() { project = nullptr; queueValid = false; queue.clear(); + for (auto& b : buffer) b.clear(); deinitAudio(); mode = Stopped; emit this->playbackModeChanged(); @@ -277,20 +281,18 @@ qint64 AudioEngine::readData(char *data, qint64 maxlen) { data += stride; sr -= stride; } - return maxlen - sr; } void AudioEngine::nextTick() { bufPos = 0; - if (mode == Paused) { // simplest case, just give a 100ms empty buffer + if (mode == Paused || mode == Stopped) { // simplest case, just give a 100ms empty buffer buffer[0].clear(); buffer[1].clear(); buffer[0].resize(static_cast(sampleRate/10)); buffer[1].resize(static_cast(sampleRate/10)); } else if (mode == Previewing) { - // WIP // reset raw buffer tickBufPtr = tickBuf.get(); tickId++;