diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index f9a28d91d7..e31929da37 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -60,21 +60,25 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : auto nodeList = DependencyManager::get(); auto& packetReceiver = nodeList->getPacketReceiver(); + // packets whose consequences are limited to their own node can be parallelized packetReceiver.registerListenerForTypes({ PacketType::MicrophoneAudioNoEcho, PacketType::MicrophoneAudioWithEcho, PacketType::InjectAudio, PacketType::AudioStreamStats, PacketType::SilentAudioFrame, - PacketType::NegotiateAudioFormat }, + PacketType::NegotiateAudioFormat, + PacketType::MuteEnvironment, + PacketType::NodeIgnoreRequest, + PacketType::RadiusIgnoreRequest, + PacketType::RequestsDomainListData, + PacketType::PerAvatarGainSet }, this, "queueAudioPacket"); + + // packets whose consequences are global should be processed on the main thread packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); - packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); - packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket"); - packetReceiver.registerListener(PacketType::PerAvatarGainSet, this, "handlePerAvatarGainSetDataPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled); } @@ -203,42 +207,6 @@ void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, } } -void AudioMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { - auto nodeList = DependencyManager::get(); - nodeList->getOrCreateLinkedData(senderNode); - - if (senderNode->getLinkedData()) { - AudioMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); - if (nodeData != nullptr) { - bool isRequesting; - message->readPrimitive(&isRequesting); - nodeData->setRequestsDomainListData(isRequesting); - } - } -} - -void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - sendingNode->parseIgnoreRequestMessage(packet); -} - -void AudioMixer::handlePerAvatarGainSetDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - auto clientData = dynamic_cast(sendingNode->getLinkedData()); - if (clientData) { - QUuid listeningNodeUUID = sendingNode->getUUID(); - // parse the UUID from the packet - QUuid audioSourceUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - uint8_t packedGain; - packet->readPrimitive(&packedGain); - float gain = unpackFloatGainFromByte(packedGain); - clientData->hrtfForStream(audioSourceUUID, QUuid()).setGainAdjustment(gain); - qDebug() << "Setting gain adjustment for hrtf[" << listeningNodeUUID << "][" << audioSourceUUID << "] to " << gain; - } -} - -void AudioMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - sendingNode->parseIgnoreRadiusRequestMessage(packet); -} - void AudioMixer::removeHRTFsForFinishedInjector(const QUuid& streamID) { auto injectorClientData = qobject_cast(sender()); if (injectorClientData) { diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 08f3bf287f..a2f2cd0235 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -58,13 +58,9 @@ public slots: private slots: // packet handlers void handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleNodeKilled(SharedNodePointer killedNode); - void handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); - void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handlePerAvatarGainSetDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNodeKilled(SharedNodePointer killedNode); + void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void queueAudioPacket(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 b2b01a571b..a43c354212 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -19,6 +19,7 @@ #include "InjectedAudioStream.h" +#include "AudioHelpers.h" #include "AudioMixer.h" #include "AudioMixerClientData.h" @@ -68,6 +69,18 @@ void AudioMixerClientData::processPackets() { case PacketType::NegotiateAudioFormat: negotiateAudioFormat(*packet.message, packet.node); break; + case PacketType::RequestsDomainListData: + parseRequestsDomainListData(*packet.message); + break; + case PacketType::PerAvatarGainSet: + parsePerAvatarGainSet(*packet.message, packet.node); + break; + case PacketType::NodeIgnoreRequest: + parseNodeIgnoreRequest(packet.message, packet.node); + break; + case PacketType::RadiusIgnoreRequest: + parseRadiusIgnoreRequest(packet.message, packet.node); + break; default: Q_UNREACHABLE(); } @@ -91,6 +104,31 @@ void AudioMixerClientData::negotiateAudioFormat(ReceivedMessage& message, const sendSelectAudioFormat(node, codec.first); } +void AudioMixerClientData::parseRequestsDomainListData(ReceivedMessage& message) { + bool isRequesting; + message.readPrimitive(&isRequesting); + setRequestsDomainListData(isRequesting); +} + +void AudioMixerClientData::parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node) { + QUuid uuid = node->getUUID(); + // parse the UUID from the packet + QUuid avatarUuid = QUuid::fromRfc4122(message.readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + uint8_t packedGain; + message.readPrimitive(&packedGain); + float gain = unpackFloatGainFromByte(packedGain); + hrtfForStream(avatarUuid, QUuid()).setGainAdjustment(gain); + qDebug() << "Setting gain adjustment for hrtf[" << uuid << "][" << avatarUuid << "] to " << gain; +} + +void AudioMixerClientData::parseNodeIgnoreRequest(QSharedPointer message, const SharedNodePointer& node) { + node->parseIgnoreRequestMessage(message); +} + +void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer message, const SharedNodePointer& node) { + node->parseIgnoreRadiusRequestMessage(message); +} + AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() { QReadLocker readLocker { &_streamsLock }; diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index cdc2bc352e..0b745253b8 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -61,9 +61,13 @@ public: void removeAgentAvatarAudioStream(); - // packet processors + // packet parsers int parseData(ReceivedMessage& message) override; void negotiateAudioFormat(ReceivedMessage& message, const SharedNodePointer& node); + void parseRequestsDomainListData(ReceivedMessage& message); + void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node); + void parseNodeIgnoreRequest(QSharedPointer message, const SharedNodePointer& node); + void parseRadiusIgnoreRequest(QSharedPointer message, const SharedNodePointer& node); // attempt to pop a frame from each audio stream, and return the number of streams from this client int checkBuffersBeforeFrameSend();