From 2c667d209d3b99a04aaebe2dfdcf8bd4178fb0a5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 5 Nov 2014 10:10:05 -0800 Subject: [PATCH] make the AudioInjectorScriptingInterface a singleton --- interface/src/Application.cpp | 3 ++ .../audio/src/AudioScriptingInterface.cpp | 47 +++++++++---------- libraries/audio/src/AudioScriptingInterface.h | 18 +++++-- libraries/script-engine/src/ScriptEngine.cpp | 2 +- libraries/script-engine/src/ScriptEngine.h | 4 +- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6d8b612bc3..f62a9e8e30 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -450,6 +450,9 @@ Application::~Application() { _audio.thread()->quit(); _audio.thread()->wait(); + // kill any audio injectors that are still around + + _octreeProcessor.terminate(); _voxelHideShowThread.terminate(); _voxelEditSender.terminate(); diff --git a/libraries/audio/src/AudioScriptingInterface.cpp b/libraries/audio/src/AudioScriptingInterface.cpp index 43c7d35c1d..ac0d3751bd 100644 --- a/libraries/audio/src/AudioScriptingInterface.cpp +++ b/libraries/audio/src/AudioScriptingInterface.cpp @@ -11,6 +11,15 @@ #include "AudioScriptingInterface.h" +AudioScriptingInterface& AudioScriptingInterface::getInstance() { + static AudioScriptingInterface staticInstance; + return staticInstance; +} + +void AudioScriptingInterface::stopAllInjectors() { + +} + AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { if (sound->isStereo()) { @@ -23,15 +32,18 @@ AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjec injector->moveToThread(injectorThread); // start injecting when the injector thread starts - connect(injectorThread, SIGNAL(started()), injector, SLOT(injectAudio())); + connect(injectorThread, &QThread::started, injector, &AudioInjector::injectAudio); // connect the right slots and signals so that the AudioInjector is killed once the injection is complete - connect(injector, SIGNAL(finished()), injector, SLOT(deleteLater())); - connect(injector, SIGNAL(finished()), injectorThread, SLOT(quit())); - connect(injectorThread, SIGNAL(finished()), injectorThread, SLOT(deleteLater())); + connect(injector, &AudioInjector::finished, injector, &AudioInjector::deleteLater); + connect(injector, &AudioInjector::finished, injectorThread, &QThread::quit); + connect(injector, &AudioInjector::finished, this, &AudioScriptingInterface::injectorStopped); + connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater); injectorThread->start(); + _activeInjectors.insert(injector); + return injector; } @@ -45,24 +57,9 @@ bool AudioScriptingInterface::isInjectorPlaying(AudioInjector* injector) { return (injector != NULL); } -void AudioScriptingInterface::startDrumSound(float volume, float frequency, float duration, float decay, - const AudioInjectorOptions* injectorOptions) { - - Sound* sound = new Sound(volume, frequency, duration, decay); - AudioInjector* injector = new AudioInjector(sound, *injectorOptions); - sound->setParent(injector); - - QThread* injectorThread = new QThread(); - - injector->moveToThread(injectorThread); - - // start injecting when the injector thread starts - connect(injectorThread, SIGNAL(started()), injector, SLOT(injectAudio())); - - // connect the right slots and signals so that the AudioInjector is killed once the injection is complete - connect(injector, SIGNAL(finished()), injector, SLOT(deleteLater())); - connect(injector, SIGNAL(finished()), injectorThread, SLOT(quit())); - connect(injectorThread, SIGNAL(finished()), injectorThread, SLOT(deleteLater())); - - injectorThread->start(); -} +void AudioScriptingInterface::injectorStopped() { + qDebug() << "Removing" << sender() << "from active injectors"; + qDebug() << _activeInjectors.size(); + _activeInjectors.remove(static_cast(sender())); + qDebug() << _activeInjectors.size(); +} \ No newline at end of file diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index 343eac304c..3655aff766 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -19,12 +19,20 @@ const AudioInjectorOptions DEFAULT_INJECTOR_OPTIONS; class AudioScriptingInterface : public QObject { Q_OBJECT +public: + static AudioScriptingInterface& getInstance(); + + void stopAllInjectors(); public slots: - static AudioInjector* playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL); - static void stopInjector(AudioInjector* injector); - static bool isInjectorPlaying(AudioInjector* injector); - static void startDrumSound(float volume, float frequency, float duration, float decay, - const AudioInjectorOptions* injectorOptions = NULL); + AudioInjector* playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL); + void stopInjector(AudioInjector* injector); + bool isInjectorPlaying(AudioInjector* injector); + + void injectorStopped(); + +private: + AudioScriptingInterface() {}; + QSet _activeInjectors; }; #endif // hifi_AudioScriptingInterface_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index fb98124fc9..7445822f55 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -290,7 +290,7 @@ void ScriptEngine::init() { qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue); registerGlobalObject("Script", this); - registerGlobalObject("Audio", &_audioScriptingInterface); + registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Controller", _controllerScriptingInterface); registerGlobalObject("Entities", &_entityScriptingInterface); registerGlobalObject("Quat", &_quatLibrary); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index d556475859..456134dd5c 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -141,9 +141,7 @@ private: static VoxelsScriptingInterface _voxelsScriptingInterface; static EntityScriptingInterface _entityScriptingInterface; - AbstractControllerScriptingInterface* _controllerScriptingInterface; - AudioScriptingInterface _audioScriptingInterface; - AvatarData* _avatarData; + AbstractControllerScriptingInterface* _controllerScriptingInterface; AvatarData* _avatarData; QString _scriptName; QString _fileNameString; Quat _quatLibrary;