mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-10 11:58:47 +02:00
add node-isolated packet parsing to client data
This commit is contained in:
parent
da5a89f582
commit
7d8a947e6d
4 changed files with 55 additions and 49 deletions
|
@ -60,21 +60,25 @@ AudioMixer::AudioMixer(ReceivedMessage& message) :
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
auto& packetReceiver = nodeList->getPacketReceiver();
|
auto& packetReceiver = nodeList->getPacketReceiver();
|
||||||
|
|
||||||
|
// packets whose consequences are limited to their own node can be parallelized
|
||||||
packetReceiver.registerListenerForTypes({
|
packetReceiver.registerListenerForTypes({
|
||||||
PacketType::MicrophoneAudioNoEcho,
|
PacketType::MicrophoneAudioNoEcho,
|
||||||
PacketType::MicrophoneAudioWithEcho,
|
PacketType::MicrophoneAudioWithEcho,
|
||||||
PacketType::InjectAudio,
|
PacketType::InjectAudio,
|
||||||
PacketType::AudioStreamStats,
|
PacketType::AudioStreamStats,
|
||||||
PacketType::SilentAudioFrame,
|
PacketType::SilentAudioFrame,
|
||||||
PacketType::NegotiateAudioFormat },
|
PacketType::NegotiateAudioFormat,
|
||||||
|
PacketType::MuteEnvironment,
|
||||||
|
PacketType::NodeIgnoreRequest,
|
||||||
|
PacketType::RadiusIgnoreRequest,
|
||||||
|
PacketType::RequestsDomainListData,
|
||||||
|
PacketType::PerAvatarGainSet },
|
||||||
this, "queueAudioPacket");
|
this, "queueAudioPacket");
|
||||||
|
|
||||||
|
// packets whose consequences are global should be processed on the main thread
|
||||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
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::NodeMuteRequest, this, "handleNodeMuteRequestPacket");
|
||||||
packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket");
|
packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket");
|
||||||
packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
|
||||||
packetReceiver.registerListener(PacketType::PerAvatarGainSet, this, "handlePerAvatarGainSetDataPacket");
|
|
||||||
|
|
||||||
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
||||||
}
|
}
|
||||||
|
@ -203,42 +207,6 @@ void AudioMixer::handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
|
||||||
nodeList->getOrCreateLinkedData(senderNode);
|
|
||||||
|
|
||||||
if (senderNode->getLinkedData()) {
|
|
||||||
AudioMixerClientData* nodeData = dynamic_cast<AudioMixerClientData*>(senderNode->getLinkedData());
|
|
||||||
if (nodeData != nullptr) {
|
|
||||||
bool isRequesting;
|
|
||||||
message->readPrimitive(&isRequesting);
|
|
||||||
nodeData->setRequestsDomainListData(isRequesting);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
|
||||||
sendingNode->parseIgnoreRequestMessage(packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioMixer::handlePerAvatarGainSetDataPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
|
||||||
auto clientData = dynamic_cast<AudioMixerClientData*>(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<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
|
||||||
sendingNode->parseIgnoreRadiusRequestMessage(packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioMixer::removeHRTFsForFinishedInjector(const QUuid& streamID) {
|
void AudioMixer::removeHRTFsForFinishedInjector(const QUuid& streamID) {
|
||||||
auto injectorClientData = qobject_cast<AudioMixerClientData*>(sender());
|
auto injectorClientData = qobject_cast<AudioMixerClientData*>(sender());
|
||||||
if (injectorClientData) {
|
if (injectorClientData) {
|
||||||
|
|
|
@ -58,13 +58,9 @@ public slots:
|
||||||
private slots:
|
private slots:
|
||||||
// packet handlers
|
// packet handlers
|
||||||
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
void handleNodeKilled(SharedNodePointer killedNode);
|
|
||||||
void handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
|
||||||
void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
|
||||||
void handleRadiusIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
|
||||||
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
|
||||||
void handleNodeMuteRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleNodeMuteRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
void handlePerAvatarGainSetDataPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleNodeKilled(SharedNodePointer killedNode);
|
||||||
|
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
|
|
||||||
void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include "InjectedAudioStream.h"
|
#include "InjectedAudioStream.h"
|
||||||
|
|
||||||
|
#include "AudioHelpers.h"
|
||||||
#include "AudioMixer.h"
|
#include "AudioMixer.h"
|
||||||
#include "AudioMixerClientData.h"
|
#include "AudioMixerClientData.h"
|
||||||
|
|
||||||
|
@ -68,6 +69,18 @@ void AudioMixerClientData::processPackets() {
|
||||||
case PacketType::NegotiateAudioFormat:
|
case PacketType::NegotiateAudioFormat:
|
||||||
negotiateAudioFormat(*packet.message, packet.node);
|
negotiateAudioFormat(*packet.message, packet.node);
|
||||||
break;
|
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:
|
default:
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
@ -91,6 +104,31 @@ void AudioMixerClientData::negotiateAudioFormat(ReceivedMessage& message, const
|
||||||
sendSelectAudioFormat(node, codec.first);
|
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<ReceivedMessage> message, const SharedNodePointer& node) {
|
||||||
|
node->parseIgnoreRequestMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node) {
|
||||||
|
node->parseIgnoreRadiusRequestMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() {
|
AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() {
|
||||||
QReadLocker readLocker { &_streamsLock };
|
QReadLocker readLocker { &_streamsLock };
|
||||||
|
|
||||||
|
|
|
@ -61,9 +61,13 @@ public:
|
||||||
|
|
||||||
void removeAgentAvatarAudioStream();
|
void removeAgentAvatarAudioStream();
|
||||||
|
|
||||||
// packet processors
|
// packet parsers
|
||||||
int parseData(ReceivedMessage& message) override;
|
int parseData(ReceivedMessage& message) override;
|
||||||
void negotiateAudioFormat(ReceivedMessage& message, const SharedNodePointer& node);
|
void negotiateAudioFormat(ReceivedMessage& message, const SharedNodePointer& node);
|
||||||
|
void parseRequestsDomainListData(ReceivedMessage& message);
|
||||||
|
void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node);
|
||||||
|
void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
|
||||||
|
void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
|
||||||
|
|
||||||
// attempt to pop a frame from each audio stream, and return the number of streams from this client
|
// attempt to pop a frame from each audio stream, and return the number of streams from this client
|
||||||
int checkBuffersBeforeFrameSend();
|
int checkBuffersBeforeFrameSend();
|
||||||
|
|
Loading…
Reference in a new issue