diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0a7f4c464c..d6bcc33c02 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -74,7 +74,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : 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::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 80360cfeed..87eb5ee1ab 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -49,46 +49,52 @@ AudioMixerClientData::~AudioMixerClientData() { } void AudioMixerClientData::queuePacket(QSharedPointer message, SharedNodePointer node) { - _queuedPackets.push({ message, node }); + if (!_packetQueue.node) { + _packetQueue.node = node; + } + _packetQueue.push(message); } void AudioMixerClientData::processPackets() { - while (!_queuedPackets.empty()) { - auto& packet = _queuedPackets.back(); + SharedNodePointer node = _packetQueue.node; + assert(_packetQueue.empty() || node); + _packetQueue.node.clear(); - switch (packet.message->getType()) { + while (!_packetQueue.empty()) { + auto& packet = _packetQueue.back(); + + switch (packet->getType()) { case PacketType::MicrophoneAudioNoEcho: case PacketType::MicrophoneAudioWithEcho: case PacketType::InjectAudio: case PacketType::AudioStreamStats: case PacketType::SilentAudioFrame: { QMutexLocker lock(&getMutex()); - parseData(*packet.message); + parseData(*packet); break; } case PacketType::NegotiateAudioFormat: - negotiateAudioFormat(*packet.message, packet.node); + negotiateAudioFormat(*packet, node); break; case PacketType::RequestsDomainListData: - parseRequestsDomainListData(*packet.message); + parseRequestsDomainListData(*packet); break; case PacketType::PerAvatarGainSet: - parsePerAvatarGainSet(*packet.message, packet.node); + parsePerAvatarGainSet(*packet, node); break; case PacketType::NodeIgnoreRequest: - parseNodeIgnoreRequest(packet.message, packet.node); + parseNodeIgnoreRequest(packet, node); break; case PacketType::RadiusIgnoreRequest: - parseRadiusIgnoreRequest(packet.message, packet.node); + parseRadiusIgnoreRequest(packet, node); break; default: Q_UNREACHABLE(); } - _queuedPackets.pop(); + _packetQueue.pop(); } - - assert(_queuedPackets.empty()); + assert(_packetQueue.empty()); } void AudioMixerClientData::negotiateAudioFormat(ReceivedMessage& message, const SharedNodePointer& node) { diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 0b745253b8..1047e10570 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -116,11 +116,10 @@ public slots: void sendSelectAudioFormat(SharedNodePointer node, const QString& selectedCodecName); private: - struct Packet { - QSharedPointer message; - SharedNodePointer node; + struct PacketQueue : public std::queue> { + QWeakPointer node; }; - std::queue _queuedPackets; + PacketQueue _packetQueue; QReadWriteLock _streamsLock; AudioStreamMap _audioStreams; // microphone stream from avatar is stored under key of null UUID