12 #ifndef hifi_AudioMixer_h
13 #define hifi_AudioMixer_h
15 #include <QtCore/QSharedPointer>
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 "AudioMixerSlavePool.h"
28 class PositionalAudioStream;
29 class AvatarAudioStream;
31 class AudioMixerClientData;
40 struct ZoneDescription {
49 struct ReverbSettings {
55 static int getStaticJitterFrames() {
return _numStaticJitterFrames; }
56 static bool shouldMute(
float quietestFrame) {
return quietestFrame > _noiseMutingThreshold; }
57 static float getAttenuationPerDoublingInDistance() {
return _attenuationPerDoublingInDistance; }
58 static const std::vector<ZoneDescription>& getAudioZones() {
return _audioZones; }
59 static const std::vector<ZoneSettings>& getZoneSettings() {
return _zoneSettings; }
60 static const std::vector<ReverbSettings>& getReverbSettings() {
return _zoneReverbSettings; }
61 static const std::pair<QString, CodecPluginPointer> negotiateCodec(std::vector<QString> codecs);
63 static bool shouldReplicateTo(
const Node& from,
const Node& to) {
64 return to.getType() == NodeType::DownstreamAudioMixer &&
65 to.getPublicSocket() != from.getPublicSocket() &&
66 to.getLocalSocket() != from.getLocalSocket();
69 virtual void aboutToFinish()
override;
73 void sendStatsPacket()
override;
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);
82 void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
83 void queueReplicatedAudioPacket(QSharedPointer<ReceivedMessage> packet);
84 void removeHRTFsForFinishedInjector(
const QUuid& streamID);
89 std::chrono::microseconds timeFrame();
90 void throttle(std::chrono::microseconds frameDuration,
int frame);
92 AudioMixerClientData* getOrCreateClientData(Node* node);
94 QString percentageForMixStats(
int counter);
96 void parseSettingsObject(
const QJsonObject& settingsObject);
97 void clearDomainSettings();
99 p_high_resolution_clock::time_point _idealFrameTimestamp;
100 p_high_resolution_clock::time_point _startFrameTimestamp;
102 float _trailingMixRatio { 0.0f };
103 float _throttlingRatio { 0.0f };
105 int _numSilentPackets { 0 };
107 int _numStatFrames { 0 };
108 AudioMixerStats _stats;
110 AudioMixerSlavePool _slavePool { _workerSharedData };
116 Timing(uint64_t& sum);
119 p_high_resolution_clock::time_point _timing;
123 Timing timer() {
return Timing(_sum); }
124 void get(uint64_t& timing, uint64_t& trailing);
126 static const int TIMER_TRAILING_SECONDS = 10;
129 uint64_t _trailing { 0 };
130 uint64_t _history[TIMER_TRAILING_SECONDS] {};
135 Timer _checkTimeTiming;
138 Timer _prepareTiming;
141 Timer _packetsTiming;
143 static int _numStaticJitterFrames;
144 static float _noiseMutingThreshold;
145 static float _attenuationPerDoublingInDistance;
146 static std::map<QString, CodecPluginPointer> _availableCodecs;
147 static QStringList _codecPreferenceOrder;
149 static std::vector<ZoneDescription> _audioZones;
150 static std::vector<ZoneSettings> _zoneSettings;
151 static std::vector<ReverbSettings> _zoneReverbSettings;
153 float _throttleStartTarget = 0.9f;
154 float _throttleBackoffTarget = 0.44f;
156 AudioMixerSlave::SharedData _workerSharedData;
Handles assignments of type AudioMixer - mixing streams of audio and re-distributing to various clien...
Definition: AudioMixer.h:34