mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 16:30:39 +02:00
refuse to handle positional audio streams with NaN position
This commit is contained in:
parent
bf5b875382
commit
ffd10b79bf
4 changed files with 36 additions and 2 deletions
|
@ -129,6 +129,12 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
|
||||||
AvatarAudioStream* listenerAudioStream = static_cast<AudioMixerClientData*>(listener->getLinkedData())->getAvatarAudioStream();
|
AvatarAudioStream* listenerAudioStream = static_cast<AudioMixerClientData*>(listener->getLinkedData())->getAvatarAudioStream();
|
||||||
AudioMixerClientData* listenerData = static_cast<AudioMixerClientData*>(listener->getLinkedData());
|
AudioMixerClientData* listenerData = static_cast<AudioMixerClientData*>(listener->getLinkedData());
|
||||||
|
|
||||||
|
// if we received an invalid position from this listener, then refuse to make them a mix
|
||||||
|
// because we don't know how to do it properly
|
||||||
|
if (!listenerAudioStream->hasValidPosition()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// zero out the mix for this listener
|
// zero out the mix for this listener
|
||||||
memset(_mixSamples, 0, sizeof(_mixSamples));
|
memset(_mixSamples, 0, sizeof(_mixSamples));
|
||||||
|
|
||||||
|
@ -244,12 +250,18 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
|
||||||
|
|
||||||
void AudioMixerSlave::throttleStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
void AudioMixerSlave::throttleStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
||||||
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
|
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
|
||||||
addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true);
|
// only throttle this stream to the mix if it has a valid position, we won't know how to mix it otherwise
|
||||||
|
if (streamToAdd.hasValidPosition()) {
|
||||||
|
addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixerSlave::mixStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
void AudioMixerSlave::mixStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
||||||
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
|
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
|
||||||
addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, false);
|
// only add the stream to the mix if it has a valid position, we won't know how to mix it otherwise
|
||||||
|
if (streamToAdd.hasValidPosition()) {
|
||||||
|
addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
|
||||||
|
|
|
@ -49,6 +49,9 @@ void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes
|
||||||
audioPacket->writePrimitive(channelFlag);
|
audioPacket->writePrimitive(channelFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// at this point we'd better be sending the mixer a valid position, or it won't consider us for mixing
|
||||||
|
assert(!isNaN(transform.getTranslation()));
|
||||||
|
|
||||||
// pack the three float positions
|
// pack the three float positions
|
||||||
audioPacket->writePrimitive(transform.getTranslation());
|
audioPacket->writePrimitive(transform.getTranslation());
|
||||||
// pack the orientation
|
// pack the orientation
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <glm/detail/func_common.hpp>
|
#include <glm/detail/func_common.hpp>
|
||||||
#include <QtCore/QDataStream>
|
#include <QtCore/QDataStream>
|
||||||
|
|
||||||
|
#include <LogHandler.h>
|
||||||
#include <Node.h>
|
#include <Node.h>
|
||||||
#include <udt/PacketHeaders.h>
|
#include <udt/PacketHeaders.h>
|
||||||
#include <UUID.h>
|
#include <UUID.h>
|
||||||
|
@ -76,6 +77,19 @@ int PositionalAudioStream::parsePositionalData(const QByteArray& positionalByteA
|
||||||
QDataStream packetStream(positionalByteArray);
|
QDataStream packetStream(positionalByteArray);
|
||||||
|
|
||||||
packetStream.readRawData(reinterpret_cast<char*>(&_position), sizeof(_position));
|
packetStream.readRawData(reinterpret_cast<char*>(&_position), sizeof(_position));
|
||||||
|
|
||||||
|
// if the client sends us a bad position, flag it so that we don't consider this stream for mixing
|
||||||
|
if (glm::isnan(_position.x) || glm::isnan(_position.y) || glm::isnan(_position.z)) {
|
||||||
|
static const QString INVALID_POSITION_REGEX = "PositionalAudioStream unpacked invalid position for node";
|
||||||
|
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(INVALID_POSITION_REGEX);
|
||||||
|
|
||||||
|
qDebug() << "PositionalAudioStream unpacked invalid position for node" << uuidStringWithoutCurlyBraces(getNodeID());
|
||||||
|
|
||||||
|
_hasValidPosition = false;
|
||||||
|
} else {
|
||||||
|
_hasValidPosition = true;
|
||||||
|
}
|
||||||
|
|
||||||
packetStream.readRawData(reinterpret_cast<char*>(&_orientation), sizeof(_orientation));
|
packetStream.readRawData(reinterpret_cast<char*>(&_orientation), sizeof(_orientation));
|
||||||
packetStream.readRawData(reinterpret_cast<char*>(&_avatarBoundingBoxCorner), sizeof(_avatarBoundingBoxCorner));
|
packetStream.readRawData(reinterpret_cast<char*>(&_avatarBoundingBoxCorner), sizeof(_avatarBoundingBoxCorner));
|
||||||
packetStream.readRawData(reinterpret_cast<char*>(&_avatarBoundingBoxScale), sizeof(_avatarBoundingBoxScale));
|
packetStream.readRawData(reinterpret_cast<char*>(&_avatarBoundingBoxScale), sizeof(_avatarBoundingBoxScale));
|
||||||
|
|
|
@ -43,12 +43,15 @@ public:
|
||||||
|
|
||||||
bool shouldLoopbackForNode() const { return _shouldLoopbackForNode; }
|
bool shouldLoopbackForNode() const { return _shouldLoopbackForNode; }
|
||||||
bool isStereo() const { return _isStereo; }
|
bool isStereo() const { return _isStereo; }
|
||||||
|
|
||||||
PositionalAudioStream::Type getType() const { return _type; }
|
PositionalAudioStream::Type getType() const { return _type; }
|
||||||
|
|
||||||
const glm::vec3& getPosition() const { return _position; }
|
const glm::vec3& getPosition() const { return _position; }
|
||||||
const glm::quat& getOrientation() const { return _orientation; }
|
const glm::quat& getOrientation() const { return _orientation; }
|
||||||
const glm::vec3& getAvatarBoundingBoxCorner() const { return _avatarBoundingBoxCorner; }
|
const glm::vec3& getAvatarBoundingBoxCorner() const { return _avatarBoundingBoxCorner; }
|
||||||
const glm::vec3& getAvatarBoundingBoxScale() const { return _avatarBoundingBoxScale; }
|
const glm::vec3& getAvatarBoundingBoxScale() const { return _avatarBoundingBoxScale; }
|
||||||
|
|
||||||
|
bool hasValidPosition() const { return _hasValidPosition; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// disallow copying of PositionalAudioStream objects
|
// disallow copying of PositionalAudioStream objects
|
||||||
|
@ -75,6 +78,8 @@ protected:
|
||||||
float _quietestTrailingFrameLoudness;
|
float _quietestTrailingFrameLoudness;
|
||||||
float _quietestFrameLoudness;
|
float _quietestFrameLoudness;
|
||||||
int _frameCounter;
|
int _frameCounter;
|
||||||
|
|
||||||
|
bool _hasValidPosition { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_PositionalAudioStream_h
|
#endif // hifi_PositionalAudioStream_h
|
||||||
|
|
Loading…
Reference in a new issue