12 #ifndef hifi_AudioMixer_h
13 #define hifi_AudioMixer_h
15 #include <QtCore/QSharedPointer>
17 #include <Transform.h>
18 #include <AudioHRTF.h>
19 #include <AudioRingBuffer.h>
20 #include <ThreadedAssignment.h>
21 #include <UUIDHasher.h>
23 #include <plugins/Forward.h>
25 #include "AudioMixerStats.h"
26 #include "AudioMixerWorkerPool.h"
28 #include "../entities/EntityTreeHeadlessViewer.h"
30 class PositionalAudioStream;
31 class AvatarAudioStream;
33 class AudioMixerClientData;
42 glm::mat4 inverseTransform;
43 float volume { FLT_MAX };
45 bool reverbEnabled {
false };
46 float reverbTime { 0.0f };
47 float wetLevel { 0.0f };
49 std::vector<QString> listeners;
50 std::vector<float> coefficients;
53 static int getStaticJitterFrames() {
return _numStaticJitterFrames; }
54 static bool shouldMute(
float quietestFrame) {
return quietestFrame > _noiseMutingThreshold; }
55 static float getAttenuationPerDoublingInDistance() {
return _attenuationPerDoublingInDistance; }
56 static const std::unordered_map<QString, ZoneSettings>& getAudioZones() {
return _audioZones; }
57 static const std::pair<QString, CodecPluginPointer> negotiateCodec(std::vector<QString> codecs);
59 static bool shouldReplicateTo(
const Node& from,
const Node& to) {
60 return to.getType() == NodeType::DownstreamAudioMixer &&
61 to.getPublicSocket() != from.getPublicSocket() &&
62 to.getLocalSocket() != from.getLocalSocket();
65 virtual void aboutToFinish()
override;
69 void sendStatsPacket()
override;
72 void entityAdded(EntityItem* entity);
73 void entityRemoved(EntityItem* entity);
77 void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
78 void handleNodeMuteRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
79 void handleNodeKilled(SharedNodePointer killedNode);
80 void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
81 void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
83 void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
84 void queueReplicatedAudioPacket(QSharedPointer<ReceivedMessage> packet);
85 void removeHRTFsForFinishedInjector(
const QUuid& streamID);
90 std::chrono::microseconds timeFrame();
91 void throttle(std::chrono::microseconds frameDuration,
int frame);
93 AudioMixerClientData* getOrCreateClientData(Node* node);
95 QString percentageForMixStats(
int counter);
97 void parseSettingsObject(
const QJsonObject& settingsObject);
98 void clearDomainSettings();
100 p_high_resolution_clock::time_point _idealFrameTimestamp;
101 p_high_resolution_clock::time_point _startFrameTimestamp;
103 float _trailingMixRatio { 0.0f };
104 float _throttlingRatio { 0.0f };
106 int _numSilentPackets { 0 };
108 int _numStatFrames { 0 };
109 AudioMixerStats _stats;
111 AudioMixerWorkerPool _workerPool { _workerSharedData };
117 Timing(uint64_t& sum);
120 p_high_resolution_clock::time_point _timing;
124 Timing timer() {
return Timing(_sum); }
125 void get(uint64_t& timing, uint64_t& trailing);
127 static const int TIMER_TRAILING_SECONDS = 10;
130 uint64_t _trailing { 0 };
131 uint64_t _history[TIMER_TRAILING_SECONDS] {};
136 Timer _checkTimeTiming;
139 Timer _prepareTiming;
142 Timer _packetsTiming;
144 static int _numStaticJitterFrames;
145 static float _noiseMutingThreshold;
146 static float _attenuationPerDoublingInDistance;
147 static std::map<QString, CodecPluginPointer> _availableCodecs;
148 static QStringList _codecPreferenceOrder;
150 static std::unordered_map<QString, ZoneSettings> _audioZones;
152 float _throttleStartTarget = 0.9f;
153 float _throttleBackoffTarget = 0.44f;
155 AudioMixerWorker::SharedData _workerSharedData;
157 void setupEntityQuery();
160 EntityTreeHeadlessViewer _entityViewer;
Handles assignments of type AudioMixer - mixing streams of audio and re-distributing to various clien...
Definition: AudioMixer.h:36