blob: afeec3ac88501d467578ed0162168213c6694e25 [file] [log] [blame]
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +00001/*
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_TRANSMIT_MIXER_H
12#define WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
13
andrew@webrtc.org4a68e952013-05-02 00:30:36 +000014#include "webrtc/common_audio/resampler/include/push_resampler.h"
15#include "webrtc/common_types.h"
henrikg@webrtc.orgc13a5372014-01-30 09:50:46 +000016#include "webrtc/modules/audio_processing/typing_detection.h"
andrew@webrtc.org4a68e952013-05-02 00:30:36 +000017#include "webrtc/modules/interface/module_common_types.h"
18#include "webrtc/modules/utility/interface/file_player.h"
19#include "webrtc/modules/utility/interface/file_recorder.h"
andrew@webrtc.orgf7c73b52014-04-03 21:56:01 +000020#include "webrtc/system_wrappers/interface/scoped_ptr.h"
andrew@webrtc.org4a68e952013-05-02 00:30:36 +000021#include "webrtc/voice_engine/include/voe_base.h"
22#include "webrtc/voice_engine/level_indicator.h"
23#include "webrtc/voice_engine/monitor_module.h"
24#include "webrtc/voice_engine/voice_engine_defines.h"
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000025
26namespace webrtc {
27
28class AudioProcessing;
29class ProcessThread;
30class VoEExternalMedia;
31class VoEMediaProcess;
32
33namespace voe {
34
35class ChannelManager;
36class MixedAudio;
37class Statistics;
38
39class TransmitMixer : public MonitorObserver,
andrew@webrtc.orgf7c73b52014-04-03 21:56:01 +000040 public FileCallback {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000041public:
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +000042 static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000043
44 static void Destroy(TransmitMixer*& mixer);
45
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000046 int32_t SetEngineInformation(ProcessThread& processThread,
47 Statistics& engineStatistics,
48 ChannelManager& channelManager);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000049
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000050 int32_t SetAudioProcessingModule(
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000051 AudioProcessing* audioProcessingModule);
52
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000053 int32_t PrepareDemux(const void* audioSamples,
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +000054 uint32_t nSamples,
55 uint8_t nChannels,
56 uint32_t samplesPerSec,
57 uint16_t totalDelayMS,
58 int32_t clockDrift,
59 uint16_t currentMicLevel,
60 bool keyPressed);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000061
62
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000063 int32_t DemuxAndMix();
xians@webrtc.org44f12392013-07-31 16:23:37 +000064 // Used by the Chrome to pass the recording data to the specific VoE
65 // channels for demux.
xians@webrtc.org0e6fa8c2013-07-31 16:27:42 +000066 void DemuxAndMix(const int voe_channels[], int number_of_voe_channels);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000067
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000068 int32_t EncodeAndSend();
xians@webrtc.org44f12392013-07-31 16:23:37 +000069 // Used by the Chrome to pass the recording data to the specific VoE
70 // channels for encoding and sending to the network.
xians@webrtc.org0e6fa8c2013-07-31 16:27:42 +000071 void EncodeAndSend(const int voe_channels[], int number_of_voe_channels);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000072
andrew@webrtc.org22470b52014-01-11 01:25:53 +000073 // Must be called on the same thread as PrepareDemux().
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000074 uint32_t CaptureLevel() const;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000075
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000076 int32_t StopSend();
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000077
78 // VoEDtmf
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +000079 void UpdateMuteMicrophoneTime(uint32_t lengthMs);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000080
81 // VoEExternalMedia
82 int RegisterExternalMediaProcessing(VoEMediaProcess* object,
83 ProcessingTypes type);
84 int DeRegisterExternalMediaProcessing(ProcessingTypes type);
85
86 int GetMixingFrequency();
87
88 // VoEVolumeControl
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +000089 int SetMute(bool enable);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000090
91 bool Mute() const;
92
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000093 int8_t AudioLevel() const;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000094
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +000095 int16_t AudioLevelFullRange() const;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000096
97 bool IsRecordingCall();
98
99 bool IsRecordingMic();
100
101 int StartPlayingFileAsMicrophone(const char* fileName,
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000102 bool loop,
103 FileFormats format,
104 int startPosition,
105 float volumeScaling,
106 int stopPosition,
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000107 const CodecInst* codecInst);
108
109 int StartPlayingFileAsMicrophone(InStream* stream,
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000110 FileFormats format,
111 int startPosition,
112 float volumeScaling,
113 int stopPosition,
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000114 const CodecInst* codecInst);
115
116 int StopPlayingFileAsMicrophone();
117
118 int IsPlayingFileAsMicrophone() const;
119
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000120 int StartRecordingMicrophone(const char* fileName,
121 const CodecInst* codecInst);
122
123 int StartRecordingMicrophone(OutStream* stream,
124 const CodecInst* codecInst);
125
126 int StopRecordingMicrophone();
127
128 int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
129
130 int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
131
132 int StopRecordingCall();
133
134 void SetMixWithMicStatus(bool mix);
135
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +0000136 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000137
138 virtual ~TransmitMixer();
139
140 // MonitorObserver
141 void OnPeriodicProcess();
142
143
144 // FileCallback
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000145 void PlayNotification(int32_t id,
146 uint32_t durationMs);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000147
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000148 void RecordNotification(int32_t id,
149 uint32_t durationMs);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000150
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000151 void PlayFileEnded(int32_t id);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000152
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000153 void RecordFileEnded(int32_t id);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000154
155#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
156 // Typing detection
157 int TimeSinceLastTyping(int &seconds);
158 int SetTypingDetectionParameters(int timeWindow,
159 int costPerTyping,
160 int reportingThreshold,
161 int penaltyDecay,
162 int typeEventDelay);
163#endif
164
165 void EnableStereoChannelSwapping(bool enable);
166 bool IsStereoChannelSwappingEnabled();
167
168private:
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000169 TransmitMixer(uint32_t instanceId);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000170
andrew@webrtc.org4de0a102013-03-02 00:14:46 +0000171 // Gets the maximum sample rate and number of channels over all currently
172 // sending codecs.
173 void GetSendCodecInfo(int* max_sample_rate, int* max_channels);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000174
andrew@webrtc.orgf7c73b52014-04-03 21:56:01 +0000175 void GenerateAudioFrame(const int16_t audioSamples[],
176 int nSamples,
177 int nChannels,
178 int samplesPerSec);
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000179 int32_t RecordAudioToFile(uint32_t mixingFrequency);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000180
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +0000181 int32_t MixOrReplaceAudioWithFile(
pbos@webrtc.orgca7a9a22013-05-14 08:31:39 +0000182 int mixingFrequency);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000183
andrew@webrtc.org22c954a2014-02-11 20:52:30 +0000184 void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level,
185 bool key_pressed);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000186
187#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc13a5372014-01-30 09:50:46 +0000188 void TypingDetection(bool keyPressed);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000189#endif
190
191 // uses
192 Statistics* _engineStatisticsPtr;
193 ChannelManager* _channelManagerPtr;
andrew@webrtc.orgb563e5e2013-03-01 18:47:28 +0000194 AudioProcessing* audioproc_;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000195 VoiceEngineObserver* _voiceEngineObserverPtr;
196 ProcessThread* _processThreadPtr;
197
198 // owns
199 MonitorModule _monitorModule;
200 AudioFrame _audioFrame;
andrew@webrtc.org708ff4d2014-04-19 00:32:07 +0000201 PushResampler<int16_t> resampler_; // ADM sample rate -> mixing rate
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000202 FilePlayer* _filePlayerPtr;
203 FileRecorder* _fileRecorderPtr;
204 FileRecorder* _fileCallRecorderPtr;
205 int _filePlayerId;
206 int _fileRecorderId;
207 int _fileCallRecorderId;
208 bool _filePlaying;
209 bool _fileRecording;
210 bool _fileCallRecording;
211 voe::AudioLevel _audioLevel;
212 // protect file instances and their variables in MixedParticipants()
213 CriticalSectionWrapper& _critSect;
214 CriticalSectionWrapper& _callbackCritSect;
215
216#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc13a5372014-01-30 09:50:46 +0000217 webrtc::TypingDetection _typingDetection;
jiayl@webrtc.org39e22a12013-09-17 18:09:20 +0000218 bool _typingNoiseWarningPending;
219 bool _typingNoiseDetected;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000220#endif
andrew@webrtc.orgb563e5e2013-03-01 18:47:28 +0000221 bool _saturationWarning;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000222
223 int _instanceId;
224 bool _mixFileWithMicrophone;
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +0000225 uint32_t _captureLevel;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000226 VoEMediaProcess* external_postproc_ptr_;
227 VoEMediaProcess* external_preproc_ptr_;
228 bool _mute;
pbos@webrtc.org54f03bc2013-04-09 10:09:10 +0000229 int32_t _remainingMuteMicTimeMs;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000230 bool stereo_codec_;
231 bool swap_stereo_channels_;
andrew@webrtc.orgf7c73b52014-04-03 21:56:01 +0000232 scoped_ptr<int16_t[]> mono_buffer_;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000233};
234
pbos@webrtc.org3b89e102013-07-03 15:12:26 +0000235} // namespace voe
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000236
237} // namespace webrtc
braveyao@webrtc.org5d7992f2013-12-24 03:39:10 +0000238
braveyao@webrtc.org1a6b2742013-12-24 03:58:51 +0000239#endif // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H