From 449719bc7cedd7a819160f70b1c1ec84afa05f62 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 11 Feb 2015 16:58:30 -0800 Subject: [PATCH] add option to restart a local audio injector --- libraries/audio-client/src/AudioClient.cpp | 3 +++ libraries/audio/src/AudioInjector.cpp | 14 ++++++++++++-- libraries/audio/src/AudioInjector.h | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 3d43cb3cf8..7f6c509626 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -980,6 +980,9 @@ 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 eea61db1fb..7ef00f6091 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -60,16 +60,19 @@ void AudioInjector::setIsFinished(bool isFinished) { if (_localBuffer) { _localBuffer->stop(); + _localBuffer->deleteLater(); + _localBuffer = NULL; } - // cleanup the audio data so we aren't holding that memory unecessarily - _audioData.resize(0); + _isStarted = false; + _shouldStop = false; } } void AudioInjector::injectAudio() { if (!_isStarted) { + // check if we need to offset the sound by some number of seconds if (_options.secondOffset > 0.0f) { @@ -78,6 +81,8 @@ void AudioInjector::injectAudio() { byteOffset *= sizeof(int16_t); _currentSendPosition = byteOffset; + } else { + _currentSendPosition = 0; } if (_options.localOnly) { @@ -90,6 +95,11 @@ void AudioInjector::injectAudio() { } } +void AudioInjector::restart() { + stop(); + QMetaObject::invokeMethod(this, "injectAudio", Qt::QueuedConnection); +} + void AudioInjector::injectLocally() { bool success = false; if (_localAudioInterface) { diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index d01294dc36..61e42d8a11 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -25,6 +25,9 @@ class AbstractAudioInterface; +// In order to make scripting cleaner for the AudioInjector, the script now holds on to the AudioInjector object +// until it dies. + class AudioInjector : public QObject { Q_OBJECT Q_PROPERTY(bool isPlaying READ isPlaying) @@ -44,6 +47,7 @@ public: void setLocalAudioInterface(AbstractAudioInterface* localAudioInterface) { _localAudioInterface = localAudioInterface; } public slots: void injectAudio(); + void restart(); void stop(); void setOptions(AudioInjectorOptions& options) { _options = options; } void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; }