hacky fix for QAudioOutput leftovers
parent
46eb1cb9b4
commit
205be0edde
|
@ -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++;
|
||||||
|
|
Loading…
Reference in New Issue