Overte C++ Documentation
AudioMixerWorker.h
1 //
2 // AudioMixerWorker.h
3 // assignment-client/src/audio
4 //
5 // Created by Zach Pomerantz on 11/22/16.
6 // Copyright 2016 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_AudioMixerWorker_h
13 #define hifi_AudioMixerWorker_h
14 
15 #include <AABox.h>
16 #include <AudioHRTF.h>
17 #include <AudioRingBuffer.h>
18 #include <ThreadedAssignment.h>
19 #include <UUIDHasher.h>
20 #include <NodeList.h>
21 #include <PositionalAudioStream.h>
22 #include <TBBHelpers.h>
23 
24 #include "AudioMixerClientData.h"
25 #include "AudioMixerStats.h"
26 
27 class AvatarAudioStream;
28 class AudioHRTF;
29 
30 class AudioMixerWorker {
31 public:
32  using ConstIter = NodeList::const_iterator;
33 
34  struct SharedData {
35  AudioMixerClientData::ConcurrentAddedStreams addedStreams;
36  std::vector<Node::LocalID> removedNodes;
37  std::vector<NodeIDStreamID> removedStreams;
38  };
39 
40  AudioMixerWorker(SharedData& sharedData) : _sharedData(sharedData) {};
41 
42  // process packets for a given node (requires no configuration)
43  void processPackets(const SharedNodePointer& node);
44 
45  // configure a round of mixing
46  void configureMix(ConstIter begin, ConstIter end, unsigned int frame, int numToRetain);
47 
48  // mix and broadcast non-ignored streams to the node (requires configuration using configureMix, above)
49  // returns true if a mixed packet was sent to the node
50  void mix(const SharedNodePointer& node);
51 
52  AudioMixerStats stats;
53 
54 private:
55  // create mix, returns true if mix has audio
56  bool prepareMix(const SharedNodePointer& listener);
57  void addStream(AudioMixerClientData::MixableStream& mixableStream,
58  AvatarAudioStream& listeningNodeStream,
59  float primaryAvatarGain,
60  float primaryInjectorGain,
61  bool isSoloing);
62  void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream,
63  AvatarAudioStream& listeningNodeStream,
64  float primaryAvatarGain,
65  float primaryInjectorGain);
66  void resetHRTFState(AudioMixerClientData::MixableStream& mixableStream);
67 
68  void addStreams(Node& listener, AudioMixerClientData& listenerData);
69 
70  // mixing buffers
71  float _mixSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO];
72  int16_t _bufferSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO];
73 
74  // frame state
75  ConstIter _begin;
76  ConstIter _end;
77  unsigned int _frame { 0 };
78  int _numToRetain { -1 };
79 
80  SharedData& _sharedData;
81 };
82 
83 #endif // hifi_AudioMixerWorker_h