From f24eff33fe55eb89b4187e4c4dd72294841a2f83 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 3 Jan 2014 09:38:05 -0800 Subject: [PATCH] open up ASI playSound method to ScriptEngine --- interface/src/avatar/Hand.cpp | 16 +++++----- libraries/audio/src/AudioInjector.cpp | 21 ++++++------- libraries/audio/src/AudioInjector.h | 2 +- libraries/audio/src/AudioInjectorOptions.cpp | 20 ++++++------- libraries/audio/src/AudioInjectorOptions.h | 30 +++++++++++++++---- .../audio/src/AudioScriptingInterface.cpp | 4 +-- libraries/audio/src/AudioScriptingInterface.h | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 6 ++++ libraries/shared/src/RegisteredMetaTypes.h | 1 + 9 files changed, 65 insertions(+), 37 deletions(-) diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 74602d037d..6bedfdba2a 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -127,11 +127,11 @@ void Hand::simulateToyBall(PalmData& palm, const glm::vec3& fingerTipPosition, f // use the threadSound static method to inject the catch sound // pass an AudioInjectorOptions struct to set position and disable loopback AudioInjectorOptions injectorOptions; - injectorOptions.position = newPosition; - injectorOptions.shouldLoopback = false; - injectorOptions.loopbackAudioInterface = app->getAudio(); + injectorOptions.setPosition(newPosition); + injectorOptions.setShouldLoopback(false); + injectorOptions.setLoopbackAudioInterface(app->getAudio()); - AudioScriptingInterface::playSound(&_catchSound, injectorOptions); + AudioScriptingInterface::playSound(&_catchSound, &injectorOptions); } } @@ -216,11 +216,11 @@ void Hand::simulateToyBall(PalmData& palm, const glm::vec3& fingerTipPosition, f // use the threadSound static method to inject the throw sound // pass an AudioInjectorOptions struct to set position and disable loopback AudioInjectorOptions injectorOptions; - injectorOptions.position = ballPosition; - injectorOptions.shouldLoopback = false; - injectorOptions.loopbackAudioInterface = app->getAudio(); + injectorOptions.setPosition(ballPosition); + injectorOptions.setShouldLoopback(false); + injectorOptions.setLoopbackAudioInterface(app->getAudio()); - AudioScriptingInterface::playSound(&_throwSound, injectorOptions); + AudioScriptingInterface::playSound(&_throwSound, &injectorOptions); } } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 7ea70fdc0b..906702210a 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -18,7 +18,7 @@ int abstractAudioPointerMeta = qRegisterMetaType("AbstractAudioInterface*"); -AudioInjector::AudioInjector(Sound* sound, AudioInjectorOptions injectorOptions) : +AudioInjector::AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions) : _sound(sound), _options(injectorOptions) { @@ -34,9 +34,9 @@ void AudioInjector::injectAudio() { // make sure we actually have samples downloaded to inject if (soundByteArray.size()) { // give our sample byte array to the local audio interface, if we have it, so it can be handled locally - if (_options.loopbackAudioInterface) { + if (_options.getLoopbackAudioInterface()) { // assume that localAudioInterface could be on a separate thread, use Qt::AutoConnection to handle properly - QMetaObject::invokeMethod(_options.loopbackAudioInterface, "handleAudioByteArray", + QMetaObject::invokeMethod(_options.getLoopbackAudioInterface(), "handleAudioByteArray", Qt::AutoConnection, Q_ARG(QByteArray, soundByteArray)); @@ -63,16 +63,17 @@ void AudioInjector::injectAudio() { currentPacketPosition += rfcStreamUUID.size(); // pack the flag for loopback - memcpy(currentPacketPosition, &_options.shouldLoopback, sizeof(_options.shouldLoopback)); - currentPacketPosition += sizeof(_options.shouldLoopback); + bool loopbackFlag = _options.shouldLoopback(); + memcpy(currentPacketPosition, &loopbackFlag, sizeof(loopbackFlag)); + currentPacketPosition += sizeof(loopbackFlag); // pack the position for injected audio - memcpy(currentPacketPosition, &_options.position, sizeof(_options.position)); - currentPacketPosition += sizeof(_options.position); + memcpy(currentPacketPosition, &_options.getPosition(), sizeof(_options.getPosition())); + currentPacketPosition += sizeof(_options.getPosition()); // pack our orientation for injected audio - memcpy(currentPacketPosition, &_options.orientation, sizeof(_options.orientation)); - currentPacketPosition += sizeof(_options.orientation); + memcpy(currentPacketPosition, &_options.getOrientation(), sizeof(_options.getOrientation())); + currentPacketPosition += sizeof(_options.getOrientation()); // pack zero for radius float radius = 0; @@ -80,7 +81,7 @@ void AudioInjector::injectAudio() { currentPacketPosition += sizeof(radius); // pack 255 for attenuation byte - uchar volume = MAX_INJECTOR_VOLUME * _options.volume; + uchar volume = MAX_INJECTOR_VOLUME * _options.getVolume(); memcpy(currentPacketPosition, &volume, sizeof(volume)); currentPacketPosition += sizeof(volume); diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 657ae0ca20..48d80c01c7 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -26,7 +26,7 @@ class AudioInjector : public QObject { public: friend AudioScriptingInterface; private: - AudioInjector(Sound* sound, AudioInjectorOptions injectorOptions); + AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); Sound* _sound; AudioInjectorOptions _options; diff --git a/libraries/audio/src/AudioInjectorOptions.cpp b/libraries/audio/src/AudioInjectorOptions.cpp index 4d0c26a087..a24f13e800 100644 --- a/libraries/audio/src/AudioInjectorOptions.cpp +++ b/libraries/audio/src/AudioInjectorOptions.cpp @@ -10,19 +10,19 @@ AudioInjectorOptions::AudioInjectorOptions(QObject* parent) : QObject(parent), - position(0.0f, 0.0f, 0.0f), - volume(1.0f), - orientation(glm::vec3(0.0f, 0.0f, 0.0f)), - shouldLoopback(true), - loopbackAudioInterface(NULL) + _position(0.0f, 0.0f, 0.0f), + _volume(1.0f), + _orientation(glm::vec3(0.0f, 0.0f, 0.0f)), + _shouldLoopback(true), + _loopbackAudioInterface(NULL) { } AudioInjectorOptions::AudioInjectorOptions(const AudioInjectorOptions& other) { - position = other.position; - volume = other.volume; - orientation = other.orientation; - shouldLoopback = other.shouldLoopback; - loopbackAudioInterface = other.loopbackAudioInterface; + _position = other._position; + _volume = other._volume; + _orientation = other._orientation; + _shouldLoopback = other._shouldLoopback; + _loopbackAudioInterface = other._loopbackAudioInterface; } \ No newline at end of file diff --git a/libraries/audio/src/AudioInjectorOptions.h b/libraries/audio/src/AudioInjectorOptions.h index 6ff9ebc4cc..2792f0069c 100644 --- a/libraries/audio/src/AudioInjectorOptions.h +++ b/libraries/audio/src/AudioInjectorOptions.h @@ -14,19 +14,39 @@ #include #include +#include + #include "AbstractAudioInterface.h" class AudioInjectorOptions : public QObject { Q_OBJECT + + Q_PROPERTY(glm::vec3 position READ getPosition WRITE setPosition) public: AudioInjectorOptions(QObject* parent = 0); AudioInjectorOptions(const AudioInjectorOptions& other); - glm::vec3 position; - float volume; - glm::quat orientation; - bool shouldLoopback; - AbstractAudioInterface* loopbackAudioInterface; + const glm::vec3& getPosition() const { return _position; } + void setPosition(const glm::vec3& position) { _position = position; } + + float getVolume() const { return _volume; } + void setVolume(float volume) { _volume = volume; } + + const glm::quat& getOrientation() const { return _orientation; } + void setOrientation(const glm::quat& orientation) { _orientation = orientation; } + + bool shouldLoopback() const { return _shouldLoopback; } + void setShouldLoopback(bool shouldLoopback) { _shouldLoopback = shouldLoopback; } + + AbstractAudioInterface* getLoopbackAudioInterface() const { return _loopbackAudioInterface; } + void setLoopbackAudioInterface(AbstractAudioInterface* loopbackAudioInterface) + { _loopbackAudioInterface = loopbackAudioInterface; } +private: + glm::vec3 _position; + float _volume; + glm::quat _orientation; + bool _shouldLoopback; + AbstractAudioInterface* _loopbackAudioInterface; }; #endif /* defined(__hifi__AudioInjectorOptions__) */ diff --git a/libraries/audio/src/AudioScriptingInterface.cpp b/libraries/audio/src/AudioScriptingInterface.cpp index 3a943914a4..fba0828c77 100644 --- a/libraries/audio/src/AudioScriptingInterface.cpp +++ b/libraries/audio/src/AudioScriptingInterface.cpp @@ -10,9 +10,9 @@ #include "AudioScriptingInterface.h" -void AudioScriptingInterface::playSound(Sound* sound, AudioInjectorOptions injectorOptions) { +void AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) { - AudioInjector* injector = new AudioInjector(sound, injectorOptions); + AudioInjector* injector = new AudioInjector(sound, *injectorOptions); QThread* injectorThread = new QThread(); diff --git a/libraries/audio/src/AudioScriptingInterface.h b/libraries/audio/src/AudioScriptingInterface.h index a36a6dc61b..9202c5a014 100644 --- a/libraries/audio/src/AudioScriptingInterface.h +++ b/libraries/audio/src/AudioScriptingInterface.h @@ -17,7 +17,7 @@ const AudioInjectorOptions DEFAULT_INJECTOR_OPTIONS; class AudioScriptingInterface : public QObject { Q_OBJECT public slots: - static void playSound(Sound* sound, AudioInjectorOptions injectorOptions = DEFAULT_INJECTOR_OPTIONS); + static void playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL); }; #endif /* defined(__hifi__AudioScriptingInterface__) */ diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 485e7ffcce..64bcb93696 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -90,6 +90,8 @@ bool ScriptEngine::setScriptContents(const QString& scriptContents) { return true; } +Q_SCRIPT_DECLARE_QMETAOBJECT(AudioInjectorOptions, QObject*) + void ScriptEngine::run() { _isRunning = true; QScriptEngine engine; @@ -109,10 +111,14 @@ void ScriptEngine::run() { QScriptValue particleScripterValue = engine.newQObject(&_particlesScriptingInterface); engine.globalObject().setProperty("Particles", particleScripterValue); + QScriptValue soundConstructorValue = engine.newFunction(soundConstructor); QScriptValue soundMetaObject = engine.newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); engine.globalObject().setProperty("Sound", soundMetaObject); + QScriptValue injectionOptionValue = engine.scriptValueFromQMetaObject(); + engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue); + QScriptValue audioScriptingInterfaceValue = engine.newQObject(&_audioScriptingInterface); engine.globalObject().setProperty("Audio", audioScriptingInterfaceValue); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index b5d3d80e2f..4d91a21be7 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -12,6 +12,7 @@ #define hifi_RegisteredMetaTypes_h #include + #include #include "SharedUtil.h"