mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 16:36:54 +02:00
Merge pull request #8966 from davidkelly/dk/noMoAgentAudioStreams
Send KillAvatar message to AudioMixer
This commit is contained in:
commit
388c1c8efe
6 changed files with 68 additions and 6 deletions
|
@ -88,6 +88,10 @@ void Agent::playAvatarSound(SharedSoundPointer sound) {
|
||||||
QMetaObject::invokeMethod(this, "playAvatarSound", Q_ARG(SharedSoundPointer, sound));
|
QMetaObject::invokeMethod(this, "playAvatarSound", Q_ARG(SharedSoundPointer, sound));
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
// 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);
|
setAvatarSound(sound);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -404,8 +408,37 @@ QUuid Agent::getSessionUUID() const {
|
||||||
return DependencyManager::get<NodeList>()->getSessionUUID();
|
return DependencyManager::get<NodeList>()->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>();
|
||||||
|
nodeList->eachMatchingNode(
|
||||||
|
[&](const SharedNodePointer& node)->bool {
|
||||||
|
return (node->getType() == NodeType::AudioMixer) && node->getActiveSocket();
|
||||||
|
},
|
||||||
|
[&](const SharedNodePointer& node) {
|
||||||
|
qDebug() << "sending KillAvatar message to Audio Mixers";
|
||||||
|
auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID, true);
|
||||||
|
packet->write(getSessionUUID().toRfc4122());
|
||||||
|
nodeList->sendPacket(std::move(packet), *node);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
_isListeningToAudioStream = isListeningToAudioStream;
|
||||||
|
}
|
||||||
|
|
||||||
void Agent::setIsAvatar(bool isAvatar) {
|
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;
|
_isAvatar = isAvatar;
|
||||||
|
|
||||||
if (_isAvatar && !_avatarIdentityTimer) {
|
if (_isAvatar && !_avatarIdentityTimer) {
|
||||||
|
@ -435,14 +468,16 @@ void Agent::setIsAvatar(bool isAvatar) {
|
||||||
// when we stop sending identity, but then get woken up again by the mixer itself, which sends
|
// 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.
|
// identity packets to everyone. Here we explicitly tell the mixer to kill the entry for us.
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true);
|
|
||||||
packetList->write(getSessionUUID().toRfc4122());
|
|
||||||
nodeList->eachMatchingNode(
|
nodeList->eachMatchingNode(
|
||||||
[&](const SharedNodePointer& node)->bool {
|
[&](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) {
|
[&](const SharedNodePointer& node) {
|
||||||
nodeList->sendPacketList(std::move(packetList), *node);
|
qDebug() << "sending KillAvatar message to Avatar and Audio Mixers";
|
||||||
|
auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID, true);
|
||||||
|
packet->write(getSessionUUID().toRfc4122());
|
||||||
|
nodeList->sendPacket(std::move(packet), *node);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
emit stopAvatarAudioTimer();
|
emit stopAvatarAudioTimer();
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
bool isPlayingAvatarSound() const { return _avatarSound != NULL; }
|
bool isPlayingAvatarSound() const { return _avatarSound != NULL; }
|
||||||
|
|
||||||
bool isListeningToAudioStream() const { return _isListeningToAudioStream; }
|
bool isListeningToAudioStream() const { return _isListeningToAudioStream; }
|
||||||
void setIsListeningToAudioStream(bool isListeningToAudioStream) { _isListeningToAudioStream = isListeningToAudioStream; }
|
void setIsListeningToAudioStream(bool isListeningToAudioStream);
|
||||||
|
|
||||||
float getLastReceivedAudioLoudness() const { return _lastReceivedAudioLoudness; }
|
float getLastReceivedAudioLoudness() const { return _lastReceivedAudioLoudness; }
|
||||||
QUuid getSessionUUID() const;
|
QUuid getSessionUUID() const;
|
||||||
|
|
|
@ -93,6 +93,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) :
|
||||||
packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat");
|
packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat");
|
||||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||||
packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket");
|
packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket");
|
||||||
|
packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket");
|
||||||
|
|
||||||
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
||||||
}
|
}
|
||||||
|
@ -598,6 +599,21 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioMixer::handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
||||||
|
auto clientData = dynamic_cast<AudioMixerClientData*>(sendingNode->getLinkedData());
|
||||||
|
if (clientData) {
|
||||||
|
clientData->removeAgentAvatarAudioStream();
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
nodeList->eachNode([sendingNode](const SharedNodePointer& node){
|
||||||
|
auto listenerClientData = dynamic_cast<AudioMixerClientData*>(node->getLinkedData());
|
||||||
|
if (listenerClientData) {
|
||||||
|
listenerClientData->removeHRTFForStream(sendingNode->getUUID());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode) {
|
||||||
sendingNode->parseIgnoreRequestMessage(packet);
|
sendingNode->parseIgnoreRequestMessage(packet);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ private slots:
|
||||||
void handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
void handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
||||||
void handleNodeKilled(SharedNodePointer killedNode);
|
void handleNodeKilled(SharedNodePointer killedNode);
|
||||||
void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
|
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
|
|
||||||
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
||||||
|
|
||||||
|
|
|
@ -73,11 +73,19 @@ 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) {
|
int AudioMixerClientData::parseData(ReceivedMessage& message) {
|
||||||
PacketType packetType = message.getType();
|
PacketType packetType = message.getType();
|
||||||
|
|
||||||
if (packetType == PacketType::AudioStreamStats) {
|
if (packetType == PacketType::AudioStreamStats) {
|
||||||
|
|
||||||
// skip over header, appendFlag, and num stats packed
|
// skip over header, appendFlag, and num stats packed
|
||||||
message.seek(sizeof(quint8) + sizeof(quint16));
|
message.seek(sizeof(quint8) + sizeof(quint16));
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,8 @@ public:
|
||||||
// removes an AudioHRTF object for a given stream
|
// removes an AudioHRTF object for a given stream
|
||||||
void removeHRTFForStream(const QUuid& nodeID, const QUuid& streamID = QUuid());
|
void removeHRTFForStream(const QUuid& nodeID, const QUuid& streamID = QUuid());
|
||||||
|
|
||||||
|
void removeAgentAvatarAudioStream();
|
||||||
|
|
||||||
int parseData(ReceivedMessage& message) override;
|
int parseData(ReceivedMessage& message) override;
|
||||||
|
|
||||||
// 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
|
||||||
|
|
Loading…
Reference in a new issue