12 #ifndef hifi_PositionalAudioStream_h
13 #define hifi_PositionalAudioStream_h
15 #include <glm/gtx/quaternion.hpp>
18 #include "InboundAudioStream.h"
20 const int AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY = 100;
22 using StreamID = QUuid;
23 const int NUM_STREAM_ID_BYTES = NUM_BYTES_RFC4122_UUID;
25 struct NodeIDStreamID {
27 Node::LocalID nodeLocalID;
30 NodeIDStreamID(QUuid nodeID, Node::LocalID nodeLocalID, StreamID streamID)
31 : nodeID(nodeID), nodeLocalID(nodeLocalID), streamID(streamID) {};
33 bool operator==(
const NodeIDStreamID& other)
const {
34 return (nodeLocalID == other.nodeLocalID || nodeID == other.nodeID) && streamID == other.streamID;
38 using ChannelFlag = quint8;
40 class PositionalAudioStream :
public InboundAudioStream {
48 PositionalAudioStream(PositionalAudioStream::Type type,
bool isStereo,
int numStaticJitterFrames = -1);
50 const QUuid DEFAULT_STREAM_IDENTIFIER = QUuid();
51 virtual const StreamID& getStreamIdentifier()
const {
return DEFAULT_STREAM_IDENTIFIER; }
53 virtual void resetStats()
override;
55 virtual AudioStreamStats getAudioStreamStats()
const override;
57 void updateLastPopOutputLoudnessAndTrailingLoudness();
58 float getLastPopOutputTrailingLoudness()
const {
return _lastPopOutputTrailingLoudness; }
59 float getLastPopOutputLoudness()
const {
return _lastPopOutputLoudness; }
60 float getQuietestFrameLoudness()
const {
return _quietestFrameLoudness; }
62 bool shouldLoopbackForNode()
const {
return _shouldLoopbackForNode; }
63 bool isStereo()
const {
return _isStereo; }
65 PositionalAudioStream::Type getType()
const {
return _type; }
67 const glm::vec3& getPosition()
const {
return _position; }
68 const glm::quat& getOrientation()
const {
return _orientation; }
69 const glm::vec3& getAvatarBoundingBoxCorner()
const {
return _avatarBoundingBoxCorner; }
70 const glm::vec3& getAvatarBoundingBoxScale()
const {
return _avatarBoundingBoxScale; }
72 using IgnoreBox = AABox;
75 void enableIgnoreBox();
76 void disableIgnoreBox() { _isIgnoreBoxEnabled =
false; }
79 bool isIgnoreBoxEnabled()
const {
return _isIgnoreBoxEnabled; }
80 const IgnoreBox& getIgnoreBox()
const {
return _ignoreBox; }
84 PositionalAudioStream(
const PositionalAudioStream&);
85 PositionalAudioStream& operator= (
const PositionalAudioStream&);
87 int parsePositionalData(
const QByteArray& positionalByteArray);
90 void calculateIgnoreBox();
94 glm::quat _orientation;
96 glm::vec3 _avatarBoundingBoxCorner;
97 glm::vec3 _avatarBoundingBoxScale;
99 bool _shouldLoopbackForNode;
102 bool _ignorePenumbra;
104 float _lastPopOutputTrailingLoudness;
105 float _lastPopOutputLoudness;
106 float _quietestTrailingFrameLoudness;
107 float _quietestFrameLoudness;
110 bool _isIgnoreBoxEnabled {
false };
111 IgnoreBox _ignoreBox;