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 <QThread>
#include <QMutex>
#include <QTimer>
// 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<Project> 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<size_t>(sampleRate/10));
buffer[1].resize(static_cast<size_t>(sampleRate/10));
} else if (mode == Previewing) {
// WIP
// reset raw buffer
tickBufPtr = tickBuf.get();
tickId++;