From 0b80610e65c352f0cbc0b11d79b751e0aac2430e Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 15:09:14 -0700 Subject: [PATCH] Needed to properly remove hrtfs for avatar audio --- assignment-client/src/audio/AudioMixer.cpp | 14 ++++++++++---- .../src/audio/AudioMixerClientData.cpp | 10 ++++++++-- assignment-client/src/audio/AudioMixerClientData.h | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 602dd233ad..a8b0d61299 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -602,10 +602,16 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) { void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto clientData = dynamic_cast(sendingNode->getLinkedData()); if (clientData) { - clientData->removeAgentAvatarAudioStream(); - // when you don't specify a stream, this removes just the QUuid() - // stream (which is the avatar's mic stream) - clientData->removeHRTFForStream(sendingNode->getUUID()); + QUuid streamID = clientData->removeAgentAvatarAudioStream(); + if (streamID != QUuid()) { + auto nodeList = DependencyManager::get(); + nodeList->eachNode([sendingNode, &streamID](const SharedNodePointer& node){ + auto listenerClientData = dynamic_cast(node->getLinkedData()); + if (listenerClientData) { + listenerClientData->removeHRTFForStream(sendingNode->getUUID(), streamID); + } + }); + } } } diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 72914da075..4896724f8d 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -73,20 +73,26 @@ void AudioMixerClientData::removeHRTFForStream(const QUuid& nodeID, const QUuid& } } -void AudioMixerClientData::removeAgentAvatarAudioStream() { +QUuid AudioMixerClientData::removeAgentAvatarAudioStream() { QWriteLocker writeLocker { &_streamsLock }; + QUuid streamId; auto it = _audioStreams.find(QUuid()); if (it != _audioStreams.end()) { + AvatarAudioStream* stream = dynamic_cast(it->second.get()); + if (stream) { + streamId = stream->getStreamIdentifier(); + } _audioStreams.erase(it); } writeLocker.unlock(); + + return streamId; } int AudioMixerClientData::parseData(ReceivedMessage& message) { PacketType packetType = message.getType(); if (packetType == PacketType::AudioStreamStats) { - // skip over header, appendFlag, and num stats packed message.seek(sizeof(quint8) + sizeof(quint16)); diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 52c659c240..0c5c49d331 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -50,7 +50,7 @@ public: // removes an AudioHRTF object for a given stream void removeHRTFForStream(const QUuid& nodeID, const QUuid& streamID = QUuid()); - void removeAgentAvatarAudioStream(); + QUuid removeAgentAvatarAudioStream(); int parseData(ReceivedMessage& message) override;