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 <Transform.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 "AudioMixerWorkerPool.h"
27 
28 #include "../entities/EntityTreeHeadlessViewer.h"
29 
30 class PositionalAudioStream;
31 class AvatarAudioStream;
32 class AudioHRTF;
33 class AudioMixerClientData;
34 
36 class AudioMixer : public ThreadedAssignment {
37  Q_OBJECT
38 public:
39  AudioMixer(ReceivedMessage& message);
40 
41  struct ZoneSettings {
42  glm::mat4 inverseTransform;
43  float volume { FLT_MAX };
44 
45  bool reverbEnabled { false };
46  float reverbTime { 0.0f };
47  float wetLevel { 0.0f };
48 
49  std::vector<QString> listeners;
50  std::vector<float> coefficients;
51  };
52 
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);
58 
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();
63  }
64 
65  virtual void aboutToFinish() override;
66 
67 public slots:
68  void run() override;
69  void sendStatsPacket() override;
70 
71  // Audio zone possibly changed
72  void entityAdded(EntityItem* entity);
73  void entityRemoved(EntityItem* entity);
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  void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
82 
83  void queueAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
84  void queueReplicatedAudioPacket(QSharedPointer<ReceivedMessage> packet);
85  void removeHRTFsForFinishedInjector(const QUuid& streamID);
86  void start();
87 
88 private:
89  // mixing helpers
90  std::chrono::microseconds timeFrame();
91  void throttle(std::chrono::microseconds frameDuration, int frame);
92 
93  AudioMixerClientData* getOrCreateClientData(Node* node);
94 
95  QString percentageForMixStats(int counter);
96 
97  void parseSettingsObject(const QJsonObject& settingsObject);
98  void clearDomainSettings();
99 
100  p_high_resolution_clock::time_point _idealFrameTimestamp;
101  p_high_resolution_clock::time_point _startFrameTimestamp;
102 
103  float _trailingMixRatio { 0.0f };
104  float _throttlingRatio { 0.0f };
105 
106  int _numSilentPackets { 0 };
107 
108  int _numStatFrames { 0 };
109  AudioMixerStats _stats;
110 
111  AudioMixerWorkerPool _workerPool { _workerSharedData };
112 
113  class Timer {
114  public:
115  class Timing{
116  public:
117  Timing(uint64_t& sum);
118  ~Timing();
119  private:
120  p_high_resolution_clock::time_point _timing;
121  uint64_t& _sum;
122  };
123 
124  Timing timer() { return Timing(_sum); }
125  void get(uint64_t& timing, uint64_t& trailing);
126  private:
127  static const int TIMER_TRAILING_SECONDS = 10;
128 
129  uint64_t _sum { 0 };
130  uint64_t _trailing { 0 };
131  uint64_t _history[TIMER_TRAILING_SECONDS] {};
132  int _index { 0 };
133  };
134 
135  Timer _ticTiming;
136  Timer _checkTimeTiming;
137  Timer _sleepTiming;
138  Timer _frameTiming;
139  Timer _prepareTiming;
140  Timer _mixTiming;
141  Timer _eventsTiming;
142  Timer _packetsTiming;
143 
144  static int _numStaticJitterFrames; // -1 denotes dynamic jitter buffering
145  static float _noiseMutingThreshold;
146  static float _attenuationPerDoublingInDistance;
147  static std::map<QString, CodecPluginPointer> _availableCodecs;
148  static QStringList _codecPreferenceOrder;
149 
150  static std::unordered_map<QString, ZoneSettings> _audioZones;
151 
152  float _throttleStartTarget = 0.9f;
153  float _throttleBackoffTarget = 0.44f;
154 
155  AudioMixerWorker::SharedData _workerSharedData;
156 
157  void setupEntityQuery();
158 
159  // Attach to entity tree for audio zone info.
160  EntityTreeHeadlessViewer _entityViewer;
161 };
162 
163 #endif // hifi_AudioMixer_h
Handles assignments of type AudioMixer - mixing streams of audio and re-distributing to various clien...
Definition: AudioMixer.h:36