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