From 6d1b7f1d376ff79cb21718c63fb2e98e98144559 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 6 Apr 2016 11:32:17 -0700 Subject: [PATCH] Wrap sound script object to hold a strong ref --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/Agent.h | 6 +-- libraries/audio/src/AudioInjector.cpp | 4 +- libraries/audio/src/AudioInjector.h | 2 +- libraries/audio/src/Sound.cpp | 20 ++++------ libraries/audio/src/Sound.h | 37 +++++++++++++------ .../src/AudioScriptingInterface.cpp | 6 +-- .../src/AudioScriptingInterface.h | 2 +- 8 files changed, 44 insertions(+), 35 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 2734cdf01f..740f456595 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -397,7 +397,7 @@ void Agent::processAgentAvatarAndAudio(float deltaTime) { if (_numAvatarSoundSentBytes == soundByteArray.size()) { // we're done with this sound object - so set our pointer back to NULL // and our sent bytes back to zero - _avatarSound = NULL; + _avatarSound.clear(); _numAvatarSoundSentBytes = 0; } } diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index fbaec7efe6..d86b99db33 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -56,7 +56,7 @@ public: public slots: void run(); - void playAvatarSound(Sound* avatarSound) { setAvatarSound(avatarSound); } + void playAvatarSound(SharedSoundPointer avatarSound) { setAvatarSound(avatarSound); } private slots: void requestScript(); @@ -77,7 +77,7 @@ private: MixedAudioStream _receivedAudioStream; float _lastReceivedAudioLoudness; - void setAvatarSound(Sound* avatarSound) { _avatarSound = avatarSound; } + void setAvatarSound(SharedSoundPointer avatarSound) { _avatarSound = avatarSound; } void sendAvatarIdentityPacket(); void sendAvatarBillboardPacket(); @@ -85,7 +85,7 @@ private: QString _scriptContents; QTimer* _scriptRequestTimeout { nullptr }; bool _isListeningToAudioStream = false; - Sound* _avatarSound = nullptr; + SharedSoundPointer _avatarSound; int _numAvatarSoundSentBytes = 0; bool _isAvatar = false; QTimer* _avatarIdentityTimer = nullptr; diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index ad6b436d02..a6515f5f65 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -32,8 +32,8 @@ AudioInjector::AudioInjector(QObject* parent) : } -AudioInjector::AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions) : - _audioData(sound->getByteArray()), +AudioInjector::AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions) : + _audioData(sound.getByteArray()), _options(injectorOptions) { diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 79e2e645dd..2dad2856b9 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -45,7 +45,7 @@ public: }; AudioInjector(QObject* parent); - AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); + AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions); AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions); bool isFinished() const { return _state == State::Finished; } diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 9816b1b61d..806e33819e 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -27,22 +27,18 @@ #include "AudioLogging.h" #include "Sound.h" -static int soundMetaTypeId = qRegisterMetaType(); - -QScriptValue soundSharedPointerToScriptValue(QScriptEngine* engine, SharedSoundPointer const& in) { - return engine->newQObject(in.data()); +QScriptValue soundSharedPointerToScriptValue(QScriptEngine* engine, const SharedSoundPointer& in) { + return engine->newQObject(new SoundScriptingInterface(in), QScriptEngine::ScriptOwnership); } -void soundSharedPointerFromScriptValue(const QScriptValue& object, SharedSoundPointer &out) { - out = SharedSoundPointer(qobject_cast(object.toQObject())); +void soundSharedPointerFromScriptValue(const QScriptValue& object, SharedSoundPointer& out) { + if (auto soundInterface = qobject_cast(object.toQObject())) { + out = soundInterface->getSound(); + } } -QScriptValue soundPointerToScriptValue(QScriptEngine* engine, Sound* const& in) { - return engine->newQObject(in); -} - -void soundPointerFromScriptValue(const QScriptValue &object, Sound* &out) { - out = qobject_cast(object.toQObject()); +SoundScriptingInterface::SoundScriptingInterface(SharedSoundPointer sound) : _sound(sound) { + QObject::connect(sound.data(), &Sound::ready, this, &SoundScriptingInterface::ready); } Sound::Sound(const QUrl& url, bool isStereo) : diff --git a/libraries/audio/src/Sound.h b/libraries/audio/src/Sound.h index 91456f2fff..23ef92aa6a 100644 --- a/libraries/audio/src/Sound.h +++ b/libraries/audio/src/Sound.h @@ -20,18 +20,16 @@ class Sound : public Resource { Q_OBJECT - - Q_PROPERTY(bool downloaded READ isReady) - Q_PROPERTY(float duration READ getDuration) + public: Sound(const QUrl& url, bool isStereo = false); bool isStereo() const { return _isStereo; } bool isReady() const { return _isReady; } - float getDuration() { return _duration; } + float getDuration() const { return _duration; } - const QByteArray& getByteArray() { return _byteArray; } + const QByteArray& getByteArray() const { return _byteArray; } signals: void ready(); @@ -50,13 +48,28 @@ private: typedef QSharedPointer SharedSoundPointer; +class SoundScriptingInterface : public QObject { + Q_OBJECT + + Q_PROPERTY(bool downloaded READ isReady) + Q_PROPERTY(float duration READ getDuration) + +public: + SoundScriptingInterface(SharedSoundPointer sound); + SharedSoundPointer getSound() { return _sound; } + + bool isReady() const { return _sound->isReady(); } + float getDuration() { return _sound->getDuration(); } + +signals: + void ready(); + +private: + SharedSoundPointer _sound; +}; + Q_DECLARE_METATYPE(SharedSoundPointer) -QScriptValue soundSharedPointerToScriptValue(QScriptEngine* engine, SharedSoundPointer const& in); -void soundSharedPointerFromScriptValue(const QScriptValue& object, SharedSoundPointer &out); - -Q_DECLARE_METATYPE(Sound*) -QScriptValue soundPointerToScriptValue(QScriptEngine* engine, Sound* const& in); -void soundPointerFromScriptValue(const QScriptValue& object, Sound* &out); - +QScriptValue soundSharedPointerToScriptValue(QScriptEngine* engine, const SharedSoundPointer& in); +void soundSharedPointerFromScriptValue(const QScriptValue& object, SharedSoundPointer& out); #endif // hifi_Sound_h diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index 7e7ca77b88..f7cc04b209 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -17,7 +17,6 @@ void registerAudioMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue); qScriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue); - qScriptRegisterMetaType(engine, soundPointerToScriptValue, soundPointerFromScriptValue); } AudioScriptingInterface& AudioScriptingInterface::getInstance() { @@ -31,13 +30,14 @@ AudioScriptingInterface::AudioScriptingInterface() : } -ScriptAudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions& injectorOptions) { +ScriptAudioInjector* AudioScriptingInterface::playSound(SharedSoundPointer sound, const AudioInjectorOptions& injectorOptions) { if (QThread::currentThread() != thread()) { ScriptAudioInjector* injector = NULL; QMetaObject::invokeMethod(this, "playSound", Qt::BlockingQueuedConnection, Q_RETURN_ARG(ScriptAudioInjector*, injector), - Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions)); + Q_ARG(SharedSoundPointer, sound), + Q_ARG(const AudioInjectorOptions&, injectorOptions)); return injector; } diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index 0b0b6587a2..07a6b171f4 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -27,7 +27,7 @@ public: protected: // this method is protected to stop C++ callers from calling, but invokable from script - Q_INVOKABLE ScriptAudioInjector* playSound(Sound* sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions()); + Q_INVOKABLE ScriptAudioInjector* playSound(SharedSoundPointer sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions()); Q_INVOKABLE void setStereoInput(bool stereo);