Overte C++ Documentation
AudioMixer.h
1 //
2 // AudioMixer.h
3 // assignment-client/src/audio
4 //
5 // Created by Stephen Birarda on 8/22/13.
6 // Copyright 2013 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_AudioMixer_h
13 #define hifi_AudioMixer_h
14 
15 #include <QtCore/QSharedPointer>
16 
17 #include <AABox.h>
18 #include <AudioHRTF.h>
19 #include <AudioRingBuffer.h>
20 #include <ThreadedAssignment.h>
21 #include <UUIDHasher.h>
22 
23 #include <plugins/Forward.h>
24 
25 #include "AudioMixerStats.h"
26 #include "AudioMixerSlavePool.h"
27 
28 class PositionalAudioStream;
29 class AvatarAudioStream;
30 class AudioHRTF;
31 class AudioMixerClientData;
32 
34 class AudioMixer : public ThreadedAssignment {
35  Q_OBJECT
36 public:
37  AudioMixer(ReceivedMessage& message);
38 
39 
40  struct ZoneDescription {
41  QString name;
42  AABox area;
43  };
44  struct ZoneSettings {
45  int source;
46  int listener;
47  float coefficient;
48  };
49  struct ReverbSettings {
50  int zone;
51  float reverbTime;
52  float wetLevel;
53  };
54 
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);
62 
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();
67  }
68 
69  virtual void aboutToFinish() override;
70 
71 public slots:
72  void run() override;
73  void sendStatsPacket() override;
74 
75 private slots:
76  // packet handlers
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 
82  void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
83  void queueReplicatedAudioPacket(QSharedPointer<ReceivedMessage> packet);
84  void removeHRTFsForFinishedInjector(const QUuid& streamID);
85  void start();
86 
87 private:
88  // mixing helpers
89  std::chrono::microseconds timeFrame();
90  void throttle(std::chrono::microseconds frameDuration, int frame);
91 
92  AudioMixerClientData* getOrCreateClientData(Node* node);
93 
94  QString percentageForMixStats(int counter);
95 
96  void parseSettingsObject(const QJsonObject& settingsObject);
97  void clearDomainSettings();
98 
99  p_high_resolution_clock::time_point _idealFrameTimestamp;
100  p_high_resolution_clock::time_point _startFrameTimestamp;
101 
102  float _trailingMixRatio { 0.0f };
103  float _throttlingRatio { 0.0f };
104 
105  int _numSilentPackets { 0 };
106 
107  int _numStatFrames { 0 };
108  AudioMixerStats _stats;
109 
110  AudioMixerSlavePool _slavePool { _workerSharedData };
111 
112  class Timer {
113  public:
114  class Timing{
115  public:
116  Timing(uint64_t& sum);
117  ~Timing();
118  private:
119  p_high_resolution_clock::time_point _timing;
120  uint64_t& _sum;
121  };
122 
123  Timing timer() { return Timing(_sum); }
124  void get(uint64_t& timing, uint64_t& trailing);
125  private:
126  static const int TIMER_TRAILING_SECONDS = 10;
127 
128  uint64_t _sum { 0 };
129  uint64_t _trailing { 0 };
130  uint64_t _history[TIMER_TRAILING_SECONDS] {};
131  int _index { 0 };
132  };
133 
134  Timer _ticTiming;
135  Timer _checkTimeTiming;
136  Timer _sleepTiming;
137  Timer _frameTiming;
138  Timer _prepareTiming;
139  Timer _mixTiming;
140  Timer _eventsTiming;
141  Timer _packetsTiming;
142 
143  static int _numStaticJitterFrames; // -1 denotes dynamic jitter buffering
144  static float _noiseMutingThreshold;
145  static float _attenuationPerDoublingInDistance;
146  static std::map<QString, CodecPluginPointer> _availableCodecs;
147  static QStringList _codecPreferenceOrder;
148 
149  static std::vector<ZoneDescription> _audioZones;
150  static std::vector<ZoneSettings> _zoneSettings;
151  static std::vector<ReverbSettings> _zoneReverbSettings;
152 
153  float _throttleStartTarget = 0.9f;
154  float _throttleBackoffTarget = 0.44f;
155 
156  AudioMixerSlave::SharedData _workerSharedData;
157 };
158 
159 #endif // hifi_AudioMixer_h
Handles assignments of type AudioMixer - mixing streams of audio and re-distributing to various clien...
Definition: AudioMixer.h:34