1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_VOICE_ENGINE_OUTPUT_MIXER_H_
12 #define WEBRTC_VOICE_ENGINE_OUTPUT_MIXER_H_
13 
14 #include "webrtc/common_audio/resampler/include/push_resampler.h"
15 #include "webrtc/common_types.h"
16 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer.h"
17 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer_defines.h"
18 #include "webrtc/modules/utility/interface/file_recorder.h"
19 #include "webrtc/voice_engine/dtmf_inband.h"
20 #include "webrtc/voice_engine/level_indicator.h"
21 #include "webrtc/voice_engine/voice_engine_defines.h"
22 
23 namespace webrtc {
24 
25 class AudioProcessing;
26 class CriticalSectionWrapper;
27 class FileWrapper;
28 class VoEMediaProcess;
29 
30 namespace voe {
31 
32 class Statistics;
33 
34 class OutputMixer : public AudioMixerOutputReceiver,
35                     public AudioMixerStatusReceiver,
36                     public FileCallback
37 {
38 public:
39     static int32_t Create(OutputMixer*& mixer, uint32_t instanceId);
40 
41     static void Destroy(OutputMixer*& mixer);
42 
43     int32_t SetEngineInformation(Statistics& engineStatistics);
44 
45     int32_t SetAudioProcessingModule(
46         AudioProcessing* audioProcessingModule);
47 
48     // VoEExternalMedia
49     int RegisterExternalMediaProcessing(
50         VoEMediaProcess& proccess_object);
51 
52     int DeRegisterExternalMediaProcessing();
53 
54     // VoEDtmf
55     int PlayDtmfTone(uint8_t eventCode, int lengthMs, int attenuationDb);
56 
57     int32_t MixActiveChannels();
58 
59     int32_t DoOperationsOnCombinedSignal(bool feed_data_to_apm);
60 
61     int32_t SetMixabilityStatus(MixerParticipant& participant,
62                                 bool mixable);
63 
64     int32_t SetAnonymousMixabilityStatus(MixerParticipant& participant,
65                                          bool mixable);
66 
67     int GetMixedAudio(int sample_rate_hz, int num_channels,
68                       AudioFrame* audioFrame);
69 
70     // VoEVolumeControl
71     int GetSpeechOutputLevel(uint32_t& level);
72 
73     int GetSpeechOutputLevelFullRange(uint32_t& level);
74 
75     int SetOutputVolumePan(float left, float right);
76 
77     int GetOutputVolumePan(float& left, float& right);
78 
79     // VoEFile
80     int StartRecordingPlayout(const char* fileName,
81                               const CodecInst* codecInst);
82 
83     int StartRecordingPlayout(OutStream* stream,
84                               const CodecInst* codecInst);
85     int StopRecordingPlayout();
86 
87     virtual ~OutputMixer();
88 
89     // from AudioMixerOutputReceiver
90     virtual void NewMixedAudio(
91         int32_t id,
92         const AudioFrame& generalAudioFrame,
93         const AudioFrame** uniqueAudioFrames,
94         uint32_t size);
95 
96     // from AudioMixerStatusReceiver
97     virtual void MixedParticipants(
98         int32_t id,
99         const ParticipantStatistics* participantStatistics,
100         uint32_t size);
101 
102     virtual void VADPositiveParticipants(
103         int32_t id,
104         const ParticipantStatistics* participantStatistics,
105         uint32_t size);
106 
107     virtual void MixedAudioLevel(int32_t id, uint32_t level);
108 
109     // For file recording
110     void PlayNotification(int32_t id, uint32_t durationMs);
111 
112     void RecordNotification(int32_t id, uint32_t durationMs);
113 
114     void PlayFileEnded(int32_t id);
115     void RecordFileEnded(int32_t id);
116 
117     // so ExternalPlayoutData() can insert far-end audio from the audio drivers
118     void APMAnalyzeReverseStream(AudioFrame &audioFrame);
119 
120     int GetOutputChannelCount();
121 
122 private:
123     OutputMixer(uint32_t instanceId);
124     int InsertInbandDtmfTone();
125 
126     // uses
127     Statistics* _engineStatisticsPtr;
128     AudioProcessing* _audioProcessingModulePtr;
129 
130     // owns
131     CriticalSectionWrapper& _callbackCritSect;
132     // protect the _outputFileRecorderPtr and _outputFileRecording
133     CriticalSectionWrapper& _fileCritSect;
134     AudioConferenceMixer& _mixerModule;
135     AudioFrame _audioFrame;
136     // Converts mixed audio to the audio device output rate.
137     PushResampler<int16_t> resampler_;
138     // Converts mixed audio to the audio processing rate.
139     PushResampler<int16_t> audioproc_resampler_;
140     AudioLevel _audioLevel;    // measures audio level for the combined signal
141     DtmfInband _dtmfGenerator;
142     int _instanceId;
143     VoEMediaProcess* _externalMediaCallbackPtr;
144     bool _externalMedia;
145     float _panLeft;
146     float _panRight;
147     int _mixingFrequencyHz;
148     FileRecorder* _outputFileRecorderPtr;
149     bool _outputFileRecording;
150 };
151 
152 }  // namespace voe
153 
154 }  // namespace werbtc
155 
156 #endif  // VOICE_ENGINE_OUTPUT_MIXER_H_
157