From fe668b1bb11d6ad49784abf4c90f7df00448c442 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 12 Jun 2017 12:14:59 -0700 Subject: [PATCH] make codec negotiation stateless for replicated agents --- assignment-client/src/audio/AudioMixer.cpp | 9 +++-- .../src/audio/AudioMixerClientData.cpp | 33 ++++++++++++++++--- .../src/audio/AudioMixerClientData.h | 2 ++ libraries/networking/src/Node.cpp | 1 + libraries/networking/src/Node.h | 5 --- libraries/networking/src/NodeType.h | 1 + .../networking/src/udt/PacketHeaders.cpp | 3 +- libraries/networking/src/udt/PacketHeaders.h | 1 - 8 files changed, 38 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0927e02655..d997c3504b 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -97,8 +97,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : PacketType::ReplicatedMicrophoneAudioNoEcho, PacketType::ReplicatedMicrophoneAudioWithEcho, PacketType::ReplicatedInjectAudio, - PacketType::ReplicatedSilentAudioFrame, - PacketType::ReplicatedNegotiateAudioFormat + PacketType::ReplicatedSilentAudioFrame }, this, "queueReplicatedAudioPacket" ); @@ -121,10 +120,10 @@ void AudioMixer::queueReplicatedAudioPacket(QSharedPointer mess QUuid nodeID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - auto node = nodeList->addOrUpdateNode(nodeID, NodeType::Agent, - message->getSenderSockAddr(), message->getSenderSockAddr()); + auto node = nodeList->addOrUpdateNode(nodeID, NodeType::ReplicatedAgent, + message->getSenderSockAddr(), message->getSenderSockAddr(), + DEFAULT_AGENT_PERMISSIONS, true); node->setIsUpstream(true); - node->setIsMirror(true); node->setLastHeardMicrostamp(usecTimestampNow()); getOrCreateClientData(node.data())->queuePacket(message, node); diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index f28e8dfa0b..8ee7f9f383 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -73,6 +73,11 @@ void AudioMixerClientData::processPackets() { case PacketType::ReplicatedMicrophoneAudioWithEcho: case PacketType::ReplicatedInjectAudio: case PacketType::ReplicatedSilentAudioFrame: { + + if (node->getType() == NodeType::ReplicatedAgent && !_codec) { + setupCodecForReplicatedAgent(packet); + } + QMutexLocker lock(&getMutex()); parseData(*packet); @@ -81,9 +86,7 @@ void AudioMixerClientData::processPackets() { break; } case PacketType::NegotiateAudioFormat: - case PacketType::ReplicatedNegotiateAudioFormat: negotiateAudioFormat(*packet, node); - replicatePacket(*packet); break; case PacketType::RequestsDomainListData: parseRequestsDomainListData(*packet); @@ -119,15 +122,20 @@ void AudioMixerClientData::replicatePacket(ReceivedMessage& message) { mirroredType = PacketType::ReplicatedInjectAudio; } else if (message.getType() == PacketType::SilentAudioFrame) { mirroredType = PacketType::ReplicatedSilentAudioFrame; - } else if (message.getType() == PacketType::NegotiateAudioFormat) { - mirroredType = PacketType::ReplicatedNegotiateAudioFormat; } else { return; } // construct an NLPacket to send to the replicant that has the contents of the received packet auto packet = NLPacket::create(mirroredType, message.getSize() + NUM_BYTES_RFC4122_UUID); + + // since this packet will be non-sourced, we add the replicated node's ID here packet->write(message.getSourceID().toRfc4122()); + + // we won't negotiate an audio format with the replicant, because we aren't a listener + // so pack the codec string here so that it can statelessly setup a decoder for this string when it needs + packet->writeString(_selectedCodecName); + packet->write(message.getMessage()); // enumerate the replicant audio mixers and send them the replicated version of this packet @@ -311,7 +319,12 @@ int AudioMixerClientData::parseData(ReceivedMessage& message) { || packetType == PacketType::ReplicatedMicrophoneAudioNoEcho || packetType == PacketType::ReplicatedSilentAudioFrame || packetType == PacketType::ReplicatedInjectAudio) { + + // skip past source ID for the replicated packet message.seek(NUM_BYTES_RFC4122_UUID); + + // skip past the codec string + message.readString(); } // check the overflow count before we parse data @@ -660,3 +673,15 @@ bool AudioMixerClientData::shouldIgnore(const SharedNodePointer self, const Shar return shouldIgnore; } + +void AudioMixerClientData::setupCodecForReplicatedAgent(QSharedPointer message) { + // first pull the codec string from the packet + + // read the string for the codec + auto codecString = message->readString(); + + qDebug() << "Manually setting codec for replicated agent" << codecString; + + const std::pair codec = AudioMixer::negotiateCodec({ codecString }); + setupCodec(codec.second, codec.first); +} diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 5ab55dd48e..72761e64f2 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -108,6 +108,8 @@ public: bool getRequestsDomainListData() { return _requestsDomainListData; } void setRequestsDomainListData(bool requesting) { _requestsDomainListData = requesting; } + void setupCodecForReplicatedAgent(QSharedPointer message); + signals: void injectorStreamFinished(const QUuid& streamIdentifier); diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index a023e488c4..a6b6bc18b2 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -44,6 +44,7 @@ void NodeType::init() { TypeNameHash.insert(NodeType::EntityScriptServer, "Entity Script Server"); TypeNameHash.insert(NodeType::ReplicantAudioMixer, "Replicant Audio Mixer"); TypeNameHash.insert(NodeType::ReplicantAvatarMixer, "Replicant Avatar Mixer"); + TypeNameHash.insert(NodeType::ReplicatedAgent, "Replicated Agent"); TypeNameHash.insert(NodeType::Unassigned, "Unassigned"); } diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 11f88b0f52..c905c9d551 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -86,9 +86,6 @@ public: bool isIgnoreRadiusEnabled() const { return _ignoreRadiusEnabled; } - bool isMirror() const { return _isMirror; } - void setIsMirror(bool isMirror) { _isMirror = isMirror; } - private: // privatize copy and assignment operator to disallow Node copying Node(const Node &otherNode); @@ -109,8 +106,6 @@ private: mutable QReadWriteLock _ignoredNodeIDSetLock; std::atomic_bool _ignoreRadiusEnabled; - - bool _isMirror { false }; }; Q_DECLARE_METATYPE(Node*) diff --git a/libraries/networking/src/NodeType.h b/libraries/networking/src/NodeType.h index 7324dcaf14..7c327e08f7 100644 --- a/libraries/networking/src/NodeType.h +++ b/libraries/networking/src/NodeType.h @@ -27,6 +27,7 @@ namespace NodeType { const NodeType_t EntityScriptServer = 'S'; const NodeType_t ReplicantAudioMixer = 'a'; const NodeType_t ReplicantAvatarMixer = 'w'; + const NodeType_t ReplicatedAgent = 'z'; const NodeType_t Unassigned = 1; void init(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index ebc8e80e45..f2f0062861 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -41,8 +41,7 @@ const QSet NON_SOURCED_PACKETS = QSet() << PacketType::ICEServerHeartbeatDenied << PacketType::AssignmentClientStatus << PacketType::StopNode << PacketType::DomainServerRemovedNode << PacketType::UsernameFromIDReply << PacketType::OctreeFileReplacement << PacketType::ReplicatedMicrophoneAudioNoEcho << PacketType::ReplicatedMicrophoneAudioWithEcho - << PacketType::ReplicatedInjectAudio << PacketType::ReplicatedSilentAudioFrame - << PacketType::ReplicatedNegotiateAudioFormat; + << PacketType::ReplicatedInjectAudio << PacketType::ReplicatedSilentAudioFrame; PacketVersion versionForPacketType(PacketType packetType) { switch (packetType) { diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 3ace60d502..448ae812ff 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -115,7 +115,6 @@ public: AdjustAvatarSorting, OctreeFileReplacement, CollisionEventChanges, - ReplicatedNegotiateAudioFormat, ReplicatedMicrophoneAudioNoEcho, ReplicatedMicrophoneAudioWithEcho, ReplicatedInjectAudio,