From 80e38c395ecf100d6948dd5f59beaa2b1eb951e3 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 31 Oct 2016 10:35:16 -0700 Subject: [PATCH 1/9] Send KillAvatar to AudioMixer too So it can remove the listening agent avatar audio streams. Otherwise they stick around forever, and eventually swamp the audio mixer. --- assignment-client/src/Agent.cpp | 3 ++- assignment-client/src/audio/AudioMixer.cpp | 9 +++++++++ assignment-client/src/audio/AudioMixer.h | 1 + assignment-client/src/audio/AudioMixerClientData.cpp | 9 +++++++++ assignment-client/src/audio/AudioMixerClientData.h | 2 ++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 23bee2c91a..7515dda13d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -439,7 +439,8 @@ void Agent::setIsAvatar(bool isAvatar) { packetList->write(getSessionUUID().toRfc4122()); nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { - return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); + return (node->getType() == NodeType::AvatarMixer || node->getType() == NodeType::AudioMixer) + && node->getActiveSocket(); }, [&](const SharedNodePointer& node) { nodeList->sendPacketList(std::move(packetList), *node); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bc356b8ce1..e5a2c9def5 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -93,6 +93,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat"); packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled); } @@ -598,6 +599,14 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) { }); } +void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + auto clientData = dynamic_cast(sendingNode->getLinkedData()); + if (clientData) { + clientData->removeAgentAvatarAudioStream(); + } +} + + void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRequestMessage(packet); } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 764c54c6cb..3c68e4c6af 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -48,6 +48,7 @@ private slots: void handleNegotiateAudioFormat(QSharedPointer message, SharedNodePointer sendingNode); void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void removeHRTFsForFinishedInjector(const QUuid& streamID); diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 58d89697af..72914da075 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -73,6 +73,15 @@ void AudioMixerClientData::removeHRTFForStream(const QUuid& nodeID, const QUuid& } } +void AudioMixerClientData::removeAgentAvatarAudioStream() { + QWriteLocker writeLocker { &_streamsLock }; + auto it = _audioStreams.find(QUuid()); + if (it != _audioStreams.end()) { + _audioStreams.erase(it); + } + writeLocker.unlock(); +} + int AudioMixerClientData::parseData(ReceivedMessage& message) { PacketType packetType = message.getType(); diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 34263f9cbe..52c659c240 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -50,6 +50,8 @@ public: // removes an AudioHRTF object for a given stream void removeHRTFForStream(const QUuid& nodeID, const QUuid& streamID = QUuid()); + void removeAgentAvatarAudioStream(); + int parseData(ReceivedMessage& message) override; // attempt to pop a frame from each audio stream, and return the number of streams from this client From e63e9bc0176cdfd5b12b0c974000b0fc0c9110e1 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 31 Oct 2016 13:25:22 -0700 Subject: [PATCH 2/9] Remove HRTFs for Avatar too Turns out there was already a function for that, if you just call removeHRTFForStream without a 2nd param, it appears to just delete the audio with uuid of QUuid() which is the avatar's mic. That is what we want, so cool. --- assignment-client/src/audio/AudioMixer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index e5a2c9def5..602dd233ad 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -603,6 +603,9 @@ void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, 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()); } } From 5714063eff61701955e4006cc1ba86fa3a967337 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 31 Oct 2016 16:38:01 -0700 Subject: [PATCH 3/9] Make more reliable Need to be sure we don't change the _isAvatar or _isListeningToAudioStream from one thread while processing audio in another. Also, fixed issue sending NLPacketList. --- assignment-client/src/Agent.cpp | 35 +++++++++++++++++++++++++++++++-- assignment-client/src/Agent.h | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 7515dda13d..02d86b5e56 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -404,8 +404,38 @@ QUuid Agent::getSessionUUID() const { return DependencyManager::get()->getSessionUUID(); } +void Agent::setIsListeningToAudioStream(bool isListeningToAudioStream) { + // this must happen on Agent's main thread + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setIsListeningToAudioStream", Q_ARG(bool, isListeningToAudioStream)); + return; + } + if (_isListeningToAudioStream) { + // have to tell just the audio mixer to KillAvatar. + + auto nodeList = DependencyManager::get(); + nodeList->eachMatchingNode( + [&](const SharedNodePointer& node)->bool { + return (node->getType() == NodeType::AudioMixer) + && node->getActiveSocket(); + }, + [&](const SharedNodePointer& node) { + qDebug() << "sending KillAvatar message to Avatar and Audio Mixers"; + auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); + packetList->write(getSessionUUID().toRfc4122()); + nodeList->sendPacketList(std::move(packetList), *node); + }); + + } + _isListeningToAudioStream = isListeningToAudioStream; +} void Agent::setIsAvatar(bool isAvatar) { + // this must happen on Agent's main thread + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setIsAvatar", Q_ARG(bool, isAvatar)); + return; + } _isAvatar = isAvatar; if (_isAvatar && !_avatarIdentityTimer) { @@ -435,14 +465,15 @@ void Agent::setIsAvatar(bool isAvatar) { // when we stop sending identity, but then get woken up again by the mixer itself, which sends // identity packets to everyone. Here we explicitly tell the mixer to kill the entry for us. auto nodeList = DependencyManager::get(); - auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); - packetList->write(getSessionUUID().toRfc4122()); nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { return (node->getType() == NodeType::AvatarMixer || node->getType() == NodeType::AudioMixer) && node->getActiveSocket(); }, [&](const SharedNodePointer& node) { + qDebug() << "sending KillAvatar message to Avatar and Audio Mixers"; + auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); + packetList->write(getSessionUUID().toRfc4122()); nodeList->sendPacketList(std::move(packetList), *node); }); } diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 939b51625a..c9b1707101 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -49,7 +49,7 @@ public: bool isPlayingAvatarSound() const { return _avatarSound != NULL; } bool isListeningToAudioStream() const { return _isListeningToAudioStream; } - void setIsListeningToAudioStream(bool isListeningToAudioStream) { _isListeningToAudioStream = isListeningToAudioStream; } + void setIsListeningToAudioStream(bool isListeningToAudioStream); float getLastReceivedAudioLoudness() const { return _lastReceivedAudioLoudness; } QUuid getSessionUUID() const; From fb2968a4191675610451b185d51fd0c1e362e4c8 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 09:12:35 -0700 Subject: [PATCH 4/9] Reset bytes sent counter when setting avatar sound It could be past the end of the buffer if you changed sounds, and the new one is shorter. Won't happen with our current tests, but that could change, and in general no reason it couldn't happen. --- assignment-client/src/Agent.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 02d86b5e56..1da33f5bd7 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -88,6 +88,7 @@ void Agent::playAvatarSound(SharedSoundPointer sound) { QMetaObject::invokeMethod(this, "playAvatarSound", Q_ARG(SharedSoundPointer, sound)); return; } else { + _numAvatarSoundSentBytes = 0; setAvatarSound(sound); } } From 404c08b0c73f0edf974126f3d06e0dc807404f2e Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 10:46:22 -0700 Subject: [PATCH 5/9] Un-do of previous commit Seems to add an artifact when using our test scripts. Will work on that as a separate issue, as it would be an existing issue in any case. --- assignment-client/src/Agent.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 1da33f5bd7..0ec9b4a172 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -88,7 +88,10 @@ void Agent::playAvatarSound(SharedSoundPointer sound) { QMetaObject::invokeMethod(this, "playAvatarSound", Q_ARG(SharedSoundPointer, sound)); return; } else { - _numAvatarSoundSentBytes = 0; + // TODO: seems to add occasional artifact in tests. I believe it is + // correct to do this, but need to figure out for sure, so commenting this + // out until I verify. + // _numAvatarSoundSentBytes = 0; setAvatarSound(sound); } } From 0b80610e65c352f0cbc0b11d79b751e0aac2430e Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 15:09:14 -0700 Subject: [PATCH 6/9] 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; From c1feac971b009e0a0815b9dc7acdbe6de199e1d1 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 15:17:07 -0700 Subject: [PATCH 7/9] CR feedback --- assignment-client/src/Agent.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0ec9b4a172..5ca5fc748d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -420,11 +420,10 @@ void Agent::setIsListeningToAudioStream(bool isListeningToAudioStream) { auto nodeList = DependencyManager::get(); nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { - return (node->getType() == NodeType::AudioMixer) - && node->getActiveSocket(); + return (node->getType() == NodeType::AudioMixer) && node->getActiveSocket(); }, [&](const SharedNodePointer& node) { - qDebug() << "sending KillAvatar message to Avatar and Audio Mixers"; + qDebug() << "sending KillAvatar message to Audio Mixers"; auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); packetList->write(getSessionUUID().toRfc4122()); nodeList->sendPacketList(std::move(packetList), *node); From ec0382daf75e3d8be61926b95e42651bd4c45ed5 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 1 Nov 2016 18:29:31 -0700 Subject: [PATCH 8/9] PR feedback Completely deleting hrtfs incorrectly. This seems to be better, we only want to delete HRTF for the QUuid() stream for the killed node in each node's list of HRTFs. --- assignment-client/src/Agent.cpp | 12 ++++++------ assignment-client/src/audio/AudioMixer.cpp | 18 ++++++++---------- .../src/audio/AudioMixerClientData.cpp | 9 +-------- .../src/audio/AudioMixerClientData.h | 2 +- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 5ca5fc748d..4472b21e9b 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -424,9 +424,9 @@ void Agent::setIsListeningToAudioStream(bool isListeningToAudioStream) { }, [&](const SharedNodePointer& node) { qDebug() << "sending KillAvatar message to Audio Mixers"; - auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); - packetList->write(getSessionUUID().toRfc4122()); - nodeList->sendPacketList(std::move(packetList), *node); + auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); + packet->write(getSessionUUID().toRfc4122()); + nodeList->sendPacket(std::move(packet), *node); }); } @@ -475,9 +475,9 @@ void Agent::setIsAvatar(bool isAvatar) { }, [&](const SharedNodePointer& node) { qDebug() << "sending KillAvatar message to Avatar and Audio Mixers"; - auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); - packetList->write(getSessionUUID().toRfc4122()); - nodeList->sendPacketList(std::move(packetList), *node); + auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); + packet->write(getSessionUUID().toRfc4122()); + nodeList->sendPacket(std::move(packet), *node); }); } emit stopAvatarAudioTimer(); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index a8b0d61299..6390ebd302 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -602,16 +602,14 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) { void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto clientData = dynamic_cast(sendingNode->getLinkedData()); if (clientData) { - 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); - } - }); - } + clientData->removeAgentAvatarAudioStream(); + auto nodeList = DependencyManager::get(); + nodeList->eachNode([sendingNode](const SharedNodePointer& node){ + auto listenerClientData = dynamic_cast(node->getLinkedData()); + if (listenerClientData) { + listenerClientData->removeHRTFForStream(sendingNode->getUUID(), QUuid()); + } + }); } } diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 4896724f8d..5b8c4aa105 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -73,20 +73,13 @@ void AudioMixerClientData::removeHRTFForStream(const QUuid& nodeID, const QUuid& } } -QUuid AudioMixerClientData::removeAgentAvatarAudioStream() { +void 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) { diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 0c5c49d331..52c659c240 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()); - QUuid removeAgentAvatarAudioStream(); + void removeAgentAvatarAudioStream(); int parseData(ReceivedMessage& message) override; From 920cd90afae8e8826196e779d54cc681ca9fbe3f Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 3 Nov 2016 13:23:05 -0700 Subject: [PATCH 9/9] CR feedback --- assignment-client/src/Agent.cpp | 4 ++-- assignment-client/src/audio/AudioMixer.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 4472b21e9b..4156619bb2 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -424,7 +424,7 @@ void Agent::setIsListeningToAudioStream(bool isListeningToAudioStream) { }, [&](const SharedNodePointer& node) { qDebug() << "sending KillAvatar message to Audio Mixers"; - auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); + auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID, true); packet->write(getSessionUUID().toRfc4122()); nodeList->sendPacket(std::move(packet), *node); }); @@ -475,7 +475,7 @@ void Agent::setIsAvatar(bool isAvatar) { }, [&](const SharedNodePointer& node) { qDebug() << "sending KillAvatar message to Avatar and Audio Mixers"; - auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); + auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID, true); packet->write(getSessionUUID().toRfc4122()); nodeList->sendPacket(std::move(packet), *node); }); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 6390ebd302..2ea1c978c8 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -607,7 +607,7 @@ void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, nodeList->eachNode([sendingNode](const SharedNodePointer& node){ auto listenerClientData = dynamic_cast(node->getLinkedData()); if (listenerClientData) { - listenerClientData->removeHRTFForStream(sendingNode->getUUID(), QUuid()); + listenerClientData->removeHRTFForStream(sendingNode->getUUID()); } }); }