From 4894a5b4141a351bf09b07bc349c0bbdb2b617dd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 11 Feb 2015 16:11:55 -0800 Subject: [PATCH] better handling of cleanup for local injector --- libraries/audio-client/src/AudioClient.cpp | 3 -- libraries/audio/src/AudioInjector.cpp | 29 +++++++++---------- libraries/audio/src/AudioInjector.h | 8 +++-- .../src/AudioScriptingInterface.cpp | 5 ---- .../src/AudioScriptingInterface.h | 3 -- 5 files changed, 19 insertions(+), 29 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 7f6c509626..3d43cb3cf8 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -980,9 +980,6 @@ bool AudioClient::outputLocalInjector(bool isStereo, qreal volume, AudioInjector // move the localOutput to the same thread as the local injector buffer localOutput->moveToThread(injector->getLocalBuffer()->thread()); - // have it be cleaned up when that injector is done - connect(injector, &AudioInjector::finished, localOutput, &QAudioOutput::stop); - qDebug() << "Starting QAudioOutput for local injector" << localOutput; localOutput->start(injector->getLocalBuffer()); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 445bf0770b..eea61db1fb 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -52,20 +52,21 @@ AudioInjector::AudioInjector(const QByteArray& audioData, const AudioInjectorOpt } -AudioInjector::~AudioInjector() { - if (_localBuffer) { - _localBuffer->stop(); +void AudioInjector::setIsFinished(bool isFinished) { + _isFinished = isFinished; + + if (_isFinished) { + emit finished(); + + if (_localBuffer) { + _localBuffer->stop(); + } + + // cleanup the audio data so we aren't holding that memory unecessarily + _audioData.resize(0); } } -void AudioInjector::setOptions(AudioInjectorOptions& options) { - _options = options; -} - -float AudioInjector::getLoudness() { - return _loudness; -} - void AudioInjector::injectAudio() { if (!_isStarted) { @@ -252,8 +253,7 @@ void AudioInjector::injectToMixer() { } } - _isFinished = true; - emit finished(); + setIsFinished(true); } void AudioInjector::stop() { @@ -261,8 +261,7 @@ void AudioInjector::stop() { if (_options.localOnly) { // we're only a local injector, so we can say we are finished right away too - _isFinished = true; - emit finished(); + setIsFinished(true); } } diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 7f414effae..4252eaf2ef 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -31,9 +31,9 @@ public: AudioInjector(QObject* parent); AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions); - ~AudioInjector(); bool isFinished() const { return _isFinished; } + int getCurrentSendPosition() const { return _currentSendPosition; } AudioInjectorLocalBuffer* getLocalBuffer() const { return _localBuffer; } @@ -43,9 +43,9 @@ public: public slots: void injectAudio(); void stop(); - void setOptions(AudioInjectorOptions& options); + void setOptions(AudioInjectorOptions& options) { _options = options; } void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; } - float getLoudness() const; + float getLoudness() const { return _loudness; } bool isPlaying() const { return !_isFinished; } signals: @@ -57,6 +57,8 @@ private: void injectToMixer(); void injectLocally(); + void setIsFinished(bool isFinished); + QByteArray _audioData; AudioInjectorOptions _options; bool _shouldStop = false; diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index 6182e6926d..3deceffb09 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -57,7 +57,6 @@ AudioInjector* AudioScriptingInterface::invokedPlaySound(Sound* sound, const Aud // connect the right slots and signals for AudioInjector and thread cleanup connect(injector, &AudioInjector::destroyed, injectorThread, &QThread::quit); connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater); - connect(injectorThread, &QThread::destroyed, this, &AudioScriptingInterface::threadDead); injectorThread->start(); @@ -68,7 +67,3 @@ AudioInjector* AudioScriptingInterface::invokedPlaySound(Sound* sound, const Aud return NULL; } } - -void AudioScriptingInterface::threadDead() { - qDebug() << "The audio thread has gone down"; -} diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index 8cbb515d7f..59d610b4e3 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -31,9 +31,6 @@ signals: void mutedByMixer(); void environmentMuted(); -public slots: - void threadDead(); - private slots: AudioInjector* invokedPlaySound(Sound* sound, const AudioInjectorOptions& injectorOptions);