hacky fix for QAudioOutput leftovers

portability/boost
zetaPRIME 2019-01-27 14:27:28 -05:00
parent 46eb1cb9b4
commit 205be0edde
1 changed files with 9 additions and 7 deletions

View File

@ -14,6 +14,7 @@ using namespace Xybrid::Data;
#include <QDebug> #include <QDebug>
#include <QThread> #include <QThread>
#include <QMutex> #include <QMutex>
#include <QTimer>
// zero-initialize // zero-initialize
AudioEngine* Xybrid::Audio::audioEngine = nullptr; AudioEngine* Xybrid::Audio::audioEngine = nullptr;
@ -101,8 +102,12 @@ void AudioEngine::initAudio(bool startNow) {
void AudioEngine::deinitAudio() { void AudioEngine::deinitAudio() {
if (output) { if (output) {
output->stop(); QTimer::singleShot(20, [this] { // delay to flush buffers with silence, else we get leftovers on next playback
output.reset(); if (output && mode == Stopped) {
output->stop();
output.reset();
}
});
} }
} }
@ -129,8 +134,6 @@ void AudioEngine::play(std::shared_ptr<Project> p) {
output->start(this); output->start(this);
//tickId = 0; // actually, no reason to reset this
mode = Playing; mode = Playing;
emit this->playbackModeChanged(); emit this->playbackModeChanged();
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
@ -141,6 +144,7 @@ void AudioEngine::stop() {
project = nullptr; project = nullptr;
queueValid = false; queueValid = false;
queue.clear(); queue.clear();
for (auto& b : buffer) b.clear();
deinitAudio(); deinitAudio();
mode = Stopped; mode = Stopped;
emit this->playbackModeChanged(); emit this->playbackModeChanged();
@ -277,20 +281,18 @@ qint64 AudioEngine::readData(char *data, qint64 maxlen) {
data += stride; data += stride;
sr -= stride; sr -= stride;
} }
return maxlen - sr; return maxlen - sr;
} }
void AudioEngine::nextTick() { void AudioEngine::nextTick() {
bufPos = 0; 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[0].clear();
buffer[1].clear(); buffer[1].clear();
buffer[0].resize(static_cast<size_t>(sampleRate/10)); buffer[0].resize(static_cast<size_t>(sampleRate/10));
buffer[1].resize(static_cast<size_t>(sampleRate/10)); buffer[1].resize(static_cast<size_t>(sampleRate/10));
} else if (mode == Previewing) { } else if (mode == Previewing) {
// WIP
// reset raw buffer // reset raw buffer
tickBufPtr = tickBuf.get(); tickBufPtr = tickBuf.get();
tickId++; tickId++;