From 96ee33e80e3ec8e5606414ede7e6b9a348daf804 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 15 Apr 2016 14:30:06 -0700 Subject: [PATCH] Fix avatars collision sounds --- interface/src/avatar/AvatarManager.cpp | 6 +++--- interface/src/avatar/MyAvatar.cpp | 17 +++++++++++++---- interface/src/avatar/MyAvatar.h | 5 +++++ libraries/audio/src/AudioInjector.cpp | 16 ++++------------ libraries/audio/src/AudioInjector.h | 2 +- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 402245d0c3..a1302a934e 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -309,8 +309,8 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents // my avatar. (Other user machines will make a similar analysis and inject sound for their collisions.) if (collision.idA.isNull() || collision.idB.isNull()) { MyAvatar* myAvatar = getMyAvatar(); - const QString& collisionSoundURL = myAvatar->getCollisionSoundURL(); - if (!collisionSoundURL.isEmpty()) { + auto collisionSound = myAvatar->getCollisionSound(); + if (collisionSound) { const float velocityChange = glm::length(collision.velocityChange); const float MIN_AVATAR_COLLISION_ACCELERATION = 0.01f; const bool isSound = (collision.type == CONTACT_EVENT_TYPE_START) && (velocityChange > MIN_AVATAR_COLLISION_ACCELERATION); @@ -327,7 +327,7 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents // but most avatars are roughly the same size, so let's not be so fancy yet. const float AVATAR_STRETCH_FACTOR = 1.0f; - AudioInjector::playSound(collisionSoundURL, energyFactorOfFull, AVATAR_STRETCH_FACTOR, myAvatar->getPosition()); + AudioInjector::playSound(collisionSound, energyFactorOfFull, AVATAR_STRETCH_FACTOR, myAvatar->getPosition()); myAvatar->collisionWithEntity(collision); return; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index bad60643ec..f0e5f2f19e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -32,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -1232,12 +1232,21 @@ void MyAvatar::clearScriptableSettings() { } void MyAvatar::setCollisionSoundURL(const QString& url) { - _collisionSoundURL = url; - if (!url.isEmpty() && (url != _collisionSoundURL)) { - emit newCollisionSoundURL(QUrl(url)); + if (url != _collisionSoundURL) { + _collisionSoundURL = url; + _collisionSound = DependencyManager::get()->getSound(_collisionSoundURL); + + emit newCollisionSoundURL(QUrl(_collisionSoundURL)); } } +SharedSoundPointer MyAvatar::getCollisionSound() { + if (!_collisionSound) { + _collisionSound = DependencyManager::get()->getSound(_collisionSoundURL); + } + return _collisionSound; +} + void MyAvatar::attach(const QString& modelURL, const QString& jointName, const glm::vec3& translation, const glm::quat& rotation, float scale, bool isSoft, diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index fee1a9add3..e72d12ef26 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -16,6 +16,7 @@ #include #include +#include #include @@ -222,6 +223,8 @@ public: const QString& getCollisionSoundURL() { return _collisionSoundURL; } void setCollisionSoundURL(const QString& url); + SharedSoundPointer getCollisionSound(); + void clearScriptableSettings(); float getBoomLength() const { return _boomLength; } @@ -362,6 +365,8 @@ private: quint32 _motionBehaviors; QString _collisionSoundURL; + SharedSoundPointer _collisionSound; + MyCharacterController _characterController; AvatarWeakPointer _lookAtTargetAvatar; diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index a6515f5f65..073753c525 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -365,17 +365,9 @@ void AudioInjector::stopAndDeleteLater() { QMetaObject::invokeMethod(this, "deleteLater", Qt::QueuedConnection); } -AudioInjector* AudioInjector::playSound(const QString& soundUrl, const float volume, const float stretchFactor, const glm::vec3 position) { - if (soundUrl.isEmpty()) { - return NULL; - } - auto soundCache = DependencyManager::get(); - if (soundCache.isNull()) { - return NULL; - } - SharedSoundPointer sound = soundCache->getSound(QUrl(soundUrl)); - if (sound.isNull() || !sound->isReady()) { - return NULL; +AudioInjector* AudioInjector::playSound(SharedSoundPointer sound, const float volume, const float stretchFactor, const glm::vec3 position) { + if (!sound || !sound->isReady()) { + return nullptr; } AudioInjectorOptions options; @@ -385,7 +377,7 @@ AudioInjector* AudioInjector::playSound(const QString& soundUrl, const float vol QByteArray samples = sound->getByteArray(); if (stretchFactor == 1.0f) { - return playSoundAndDelete(samples, options, NULL); + return playSoundAndDelete(samples, options, nullptr); } const int standardRate = AudioConstants::SAMPLE_RATE; diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 2dad2856b9..c90256429d 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -60,7 +60,7 @@ public: static AudioInjector* playSoundAndDelete(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface); static AudioInjector* playSound(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface); - static AudioInjector* playSound(const QString& soundUrl, const float volume, const float stretchFactor, const glm::vec3 position); + static AudioInjector* playSound(SharedSoundPointer sound, const float volume, const float stretchFactor, const glm::vec3 position); public slots: void restart();