From 99ee6ae8af86874170a04c6598a2b04a51712621 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 7 May 2014 16:26:32 -0700 Subject: [PATCH] return an injector from playSound and allow user to stop it --- libraries/audio/src/AudioInjector.cpp | 8 +++++++- libraries/audio/src/AudioInjector.h | 13 +++++++++---- libraries/audio/src/AudioScriptingInterface.cpp | 4 +++- libraries/audio/src/AudioScriptingInterface.h | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 11 +++++++++++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index eed41ac849..364d14cfbb 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -21,6 +21,12 @@ #include "AudioInjector.h" +AudioInjector::AudioInjector(QObject* parent) : + QObject(parent) +{ + +} + AudioInjector::AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions) : _sound(sound), _options(injectorOptions) @@ -80,7 +86,7 @@ void AudioInjector::injectAudio() { int numPreAudioDataBytes = injectAudioPacket.size(); // loop to send off our audio in NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL byte chunks - while (currentSendPosition < soundByteArray.size()) { + while (currentSendPosition < soundByteArray.size() && !_shouldStop) { int bytesToCopy = std::min(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL, soundByteArray.size() - currentSendPosition); diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index abaa804fb0..08fe544255 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -24,14 +24,19 @@ class AudioInjector : public QObject { Q_OBJECT public: + AudioInjector(QObject* parent); AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); +public slots: + void injectAudio(); + void stop() { _shouldStop = true; } +signals: + void finished(); private: Sound* _sound; AudioInjectorOptions _options; -public slots: - void injectAudio(); -signals: - void finished(); + bool _shouldStop; }; +Q_DECLARE_METATYPE(AudioInjector*) + #endif // hifi_AudioInjector_h diff --git a/libraries/audio/src/AudioScriptingInterface.cpp b/libraries/audio/src/AudioScriptingInterface.cpp index 0d76a42757..944ae49adf 100644 --- a/libraries/audio/src/AudioScriptingInterface.cpp +++ b/libraries/audio/src/AudioScriptingInterface.cpp @@ -11,7 +11,7 @@ #include "AudioScriptingInterface.h" -void AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { +AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { AudioInjector* injector = new AudioInjector(sound, *injectorOptions); @@ -28,6 +28,8 @@ void AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions connect(injectorThread, SIGNAL(finished()), injectorThread, SLOT(deleteLater())); injectorThread->start(); + + return injector; } void AudioScriptingInterface::startDrumSound(float volume, float frequency, float duration, float decay, diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index f2e9b02e9a..de8e57090a 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -20,7 +20,7 @@ const AudioInjectorOptions DEFAULT_INJECTOR_OPTIONS; class AudioScriptingInterface : public QObject { Q_OBJECT public slots: - static void playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL); + static AudioInjector* playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL); static void startDrumSound(float volume, float frequency, float duration, float decay, const AudioInjectorOptions* injectorOptions = NULL); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 402f1a2885..9be2cb5252 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -52,6 +53,14 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ return QScriptValue(); } +QScriptValue injectorToScriptValue(QScriptEngine *engine, AudioInjector* const &in) { + return engine->newQObject(in); +} + +void injectorFromScriptValue(const QScriptValue &object, AudioInjector* &out) { + out = qobject_cast(object.toQObject()); +} + ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, AbstractControllerScriptingInterface* controllerScriptingInterface) : @@ -226,6 +235,8 @@ void ScriptEngine::init() { QScriptValue localVoxelsValue = _engine.scriptValueFromQMetaObject(); _engine.globalObject().setProperty("LocalVoxels", localVoxelsValue); + + qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue); registerGlobalObject("Script", this); registerGlobalObject("Audio", &_audioScriptingInterface);