diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f62a9e8e30..ff4a23ceaf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -451,7 +451,7 @@ Application::~Application() { _audio.thread()->wait(); // kill any audio injectors that are still around - + AudioScriptingInterface::getInstance().stopAllInjectors(); _octreeProcessor.terminate(); _voxelHideShowThread.terminate(); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 31c135fd58..87de9ede8b 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -26,6 +26,7 @@ AudioInjector::AudioInjector(QObject* parent) : _sound(NULL), _options(), _shouldStop(false), + _isFinished(false), _currentSendPosition(0) { } @@ -34,6 +35,7 @@ AudioInjector::AudioInjector(Sound* sound, const AudioInjectorOptions& injectorO _sound(sound), _options(injectorOptions), _shouldStop(false), + _isFinished(false), _currentSendPosition(0) { } @@ -161,5 +163,6 @@ void AudioInjector::injectAudio() { } } + _isFinished = true; emit finished(); } diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index af9b5e55d1..1f070a77b0 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -27,6 +27,7 @@ public: AudioInjector(QObject* parent); AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); + bool isFinished() const { return _isFinished; } int getCurrentSendPosition() const { return _currentSendPosition; } public slots: void injectAudio(); @@ -39,6 +40,7 @@ private: Sound* _sound; AudioInjectorOptions _options; bool _shouldStop; + bool _isFinished; int _currentSendPosition; }; diff --git a/libraries/audio/src/AudioScriptingInterface.cpp b/libraries/audio/src/AudioScriptingInterface.cpp index ac0d3751bd..f78bdb0614 100644 --- a/libraries/audio/src/AudioScriptingInterface.cpp +++ b/libraries/audio/src/AudioScriptingInterface.cpp @@ -17,7 +17,18 @@ AudioScriptingInterface& AudioScriptingInterface::getInstance() { } void AudioScriptingInterface::stopAllInjectors() { - + QList >::iterator injector = _activeInjectors.begin(); + while (injector != _activeInjectors.end()) { + if (!injector->isNull()) { + injector->data()->stop(); + + while (injector->data() && !injector->data()->isFinished()) { + // wait for this injector to go down + } + } + + injector = _activeInjectors.erase(injector); + } } AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { @@ -42,7 +53,7 @@ AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjec injectorThread->start(); - _activeInjectors.insert(injector); + _activeInjectors.append(QPointer(injector)); return injector; } @@ -58,8 +69,5 @@ bool AudioScriptingInterface::isInjectorPlaying(AudioInjector* injector) { } void AudioScriptingInterface::injectorStopped() { - qDebug() << "Removing" << sender() << "from active injectors"; - qDebug() << _activeInjectors.size(); - _activeInjectors.remove(static_cast(sender())); - qDebug() << _activeInjectors.size(); + _activeInjectors.removeAll(QPointer(reinterpret_cast(sender()))); } \ No newline at end of file diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index 3655aff766..6179111f59 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -12,6 +12,8 @@ #ifndef hifi_AudioScriptingInterface_h #define hifi_AudioScriptingInterface_h +#include + #include "AudioInjector.h" #include "Sound.h" @@ -32,7 +34,7 @@ public slots: private: AudioScriptingInterface() {}; - QSet _activeInjectors; + QList< QPointer > _activeInjectors; }; #endif // hifi_AudioScriptingInterface_h