blob: 225d4acae7f5ab923ef8b00d4c9a9bdeb6a59900 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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.org28e82bf2013-05-02 00:30:36 +000014#include "webrtc/common_audio/resampler/include/push_resampler.h"
15#include "webrtc/common_types.h"
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +000016#include "webrtc/modules/audio_processing/typing_detection.h"
andrew@webrtc.org28e82bf2013-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"
20#include "webrtc/voice_engine/include/voe_base.h"
21#include "webrtc/voice_engine/level_indicator.h"
22#include "webrtc/voice_engine/monitor_module.h"
23#include "webrtc/voice_engine/voice_engine_defines.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000024
25namespace webrtc {
26
27class AudioProcessing;
28class ProcessThread;
29class VoEExternalMedia;
30class VoEMediaProcess;
31
32namespace voe {
33
34class ChannelManager;
35class MixedAudio;
36class Statistics;
37
38class TransmitMixer : public MonitorObserver,
39 public FileCallback
40
41{
42public:
pbos@webrtc.org92135212013-05-14 08:31:39 +000043 static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +000044
45 static void Destroy(TransmitMixer*& mixer);
46
pbos@webrtc.org6141e132013-04-09 10:09:10 +000047 int32_t SetEngineInformation(ProcessThread& processThread,
48 Statistics& engineStatistics,
49 ChannelManager& channelManager);
niklase@google.com470e71d2011-07-07 08:21:25 +000050
pbos@webrtc.org6141e132013-04-09 10:09:10 +000051 int32_t SetAudioProcessingModule(
niklase@google.com470e71d2011-07-07 08:21:25 +000052 AudioProcessing* audioProcessingModule);
53
pbos@webrtc.org6141e132013-04-09 10:09:10 +000054 int32_t PrepareDemux(const void* audioSamples,
pbos@webrtc.org92135212013-05-14 08:31:39 +000055 uint32_t nSamples,
56 uint8_t nChannels,
57 uint32_t samplesPerSec,
58 uint16_t totalDelayMS,
59 int32_t clockDrift,
60 uint16_t currentMicLevel,
61 bool keyPressed);
niklase@google.com470e71d2011-07-07 08:21:25 +000062
63
pbos@webrtc.org6141e132013-04-09 10:09:10 +000064 int32_t DemuxAndMix();
xians@webrtc.org2f84afa2013-07-31 16:23:37 +000065 // Used by the Chrome to pass the recording data to the specific VoE
66 // channels for demux.
xians@webrtc.org8fff1f02013-07-31 16:27:42 +000067 void DemuxAndMix(const int voe_channels[], int number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000068
pbos@webrtc.org6141e132013-04-09 10:09:10 +000069 int32_t EncodeAndSend();
xians@webrtc.org2f84afa2013-07-31 16:23:37 +000070 // Used by the Chrome to pass the recording data to the specific VoE
71 // channels for encoding and sending to the network.
xians@webrtc.org8fff1f02013-07-31 16:27:42 +000072 void EncodeAndSend(const int voe_channels[], int number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000073
andrew@webrtc.org023cc5a2014-01-11 01:25:53 +000074 // Must be called on the same thread as PrepareDemux().
pbos@webrtc.org6141e132013-04-09 10:09:10 +000075 uint32_t CaptureLevel() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000076
pbos@webrtc.org6141e132013-04-09 10:09:10 +000077 int32_t StopSend();
niklase@google.com470e71d2011-07-07 08:21:25 +000078
niklase@google.com470e71d2011-07-07 08:21:25 +000079 // VoEDtmf
pbos@webrtc.org92135212013-05-14 08:31:39 +000080 void UpdateMuteMicrophoneTime(uint32_t lengthMs);
niklase@google.com470e71d2011-07-07 08:21:25 +000081
82 // VoEExternalMedia
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +000083 int RegisterExternalMediaProcessing(VoEMediaProcess* object,
84 ProcessingTypes type);
85 int DeRegisterExternalMediaProcessing(ProcessingTypes type);
niklase@google.com470e71d2011-07-07 08:21:25 +000086
xians@google.com0b0665a2011-08-08 08:18:44 +000087 int GetMixingFrequency();
niklase@google.com470e71d2011-07-07 08:21:25 +000088
89 // VoEVolumeControl
pbos@webrtc.org92135212013-05-14 08:31:39 +000090 int SetMute(bool enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000091
92 bool Mute() const;
93
pbos@webrtc.org6141e132013-04-09 10:09:10 +000094 int8_t AudioLevel() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000095
pbos@webrtc.org6141e132013-04-09 10:09:10 +000096 int16_t AudioLevelFullRange() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000097
98 bool IsRecordingCall();
99
100 bool IsRecordingMic();
101
102 int StartPlayingFileAsMicrophone(const char* fileName,
pbos@webrtc.org92135212013-05-14 08:31:39 +0000103 bool loop,
104 FileFormats format,
105 int startPosition,
106 float volumeScaling,
107 int stopPosition,
niklase@google.com470e71d2011-07-07 08:21:25 +0000108 const CodecInst* codecInst);
109
110 int StartPlayingFileAsMicrophone(InStream* stream,
pbos@webrtc.org92135212013-05-14 08:31:39 +0000111 FileFormats format,
112 int startPosition,
113 float volumeScaling,
114 int stopPosition,
niklase@google.com470e71d2011-07-07 08:21:25 +0000115 const CodecInst* codecInst);
116
117 int StopPlayingFileAsMicrophone();
118
119 int IsPlayingFileAsMicrophone() const;
120
pbos@webrtc.org92135212013-05-14 08:31:39 +0000121 int ScaleFileAsMicrophonePlayout(float scale);
niklase@google.com470e71d2011-07-07 08:21:25 +0000122
123 int StartRecordingMicrophone(const char* fileName,
124 const CodecInst* codecInst);
125
126 int StartRecordingMicrophone(OutStream* stream,
127 const CodecInst* codecInst);
128
129 int StopRecordingMicrophone();
130
131 int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
132
133 int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
134
135 int StopRecordingCall();
136
137 void SetMixWithMicStatus(bool mix);
138
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000139 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000140
141 virtual ~TransmitMixer();
142
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000143 // MonitorObserver
niklase@google.com470e71d2011-07-07 08:21:25 +0000144 void OnPeriodicProcess();
145
146
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000147 // FileCallback
pbos@webrtc.org92135212013-05-14 08:31:39 +0000148 void PlayNotification(int32_t id,
149 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000150
pbos@webrtc.org92135212013-05-14 08:31:39 +0000151 void RecordNotification(int32_t id,
152 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
pbos@webrtc.org92135212013-05-14 08:31:39 +0000154 void PlayFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
pbos@webrtc.org92135212013-05-14 08:31:39 +0000156 void RecordFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000157
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000158#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000159 // Typing detection
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000160 int TimeSinceLastTyping(int &seconds);
niklas.enbom@webrtc.org06e722a2012-04-04 07:44:27 +0000161 int SetTypingDetectionParameters(int timeWindow,
162 int costPerTyping,
163 int reportingThreshold,
niklas.enbom@webrtc.orgf6edfef2012-05-09 13:16:12 +0000164 int penaltyDecay,
165 int typeEventDelay);
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000166#endif
167
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000168 void EnableStereoChannelSwapping(bool enable);
169 bool IsStereoChannelSwappingEnabled();
170
niklase@google.com470e71d2011-07-07 08:21:25 +0000171private:
pbos@webrtc.org92135212013-05-14 08:31:39 +0000172 TransmitMixer(uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000173
andrew@webrtc.org24120852013-03-02 00:14:46 +0000174 // Gets the maximum sample rate and number of channels over all currently
175 // sending codecs.
176 void GetSendCodecInfo(int* max_sample_rate, int* max_channels);
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000177
178 int GenerateAudioFrame(const int16_t audioSamples[],
179 int nSamples,
180 int nChannels,
181 int samplesPerSec);
pbos@webrtc.org92135212013-05-14 08:31:39 +0000182 int32_t RecordAudioToFile(uint32_t mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000183
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000184 int32_t MixOrReplaceAudioWithFile(
pbos@webrtc.org92135212013-05-14 08:31:39 +0000185 int mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000186
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000187 void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level);
niklase@google.com470e71d2011-07-07 08:21:25 +0000188
189#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +0000190 void TypingDetection(bool keyPressed);
niklase@google.com470e71d2011-07-07 08:21:25 +0000191#endif
192
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000193 // uses
niklase@google.com470e71d2011-07-07 08:21:25 +0000194 Statistics* _engineStatisticsPtr;
195 ChannelManager* _channelManagerPtr;
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000196 AudioProcessing* audioproc_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000197 VoiceEngineObserver* _voiceEngineObserverPtr;
198 ProcessThread* _processThreadPtr;
199
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000200 // owns
niklase@google.com470e71d2011-07-07 08:21:25 +0000201 MonitorModule _monitorModule;
202 AudioFrame _audioFrame;
andrew@webrtc.org28e82bf2013-05-02 00:30:36 +0000203 PushResampler resampler_; // ADM sample rate -> mixing rate
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +0000204 FilePlayer* _filePlayerPtr;
niklase@google.com470e71d2011-07-07 08:21:25 +0000205 FileRecorder* _fileRecorderPtr;
206 FileRecorder* _fileCallRecorderPtr;
xians@google.com0b0665a2011-08-08 08:18:44 +0000207 int _filePlayerId;
208 int _fileRecorderId;
209 int _fileCallRecorderId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000210 bool _filePlaying;
211 bool _fileRecording;
212 bool _fileCallRecording;
213 voe::AudioLevel _audioLevel;
214 // protect file instances and their variables in MixedParticipants()
215 CriticalSectionWrapper& _critSect;
216 CriticalSectionWrapper& _callbackCritSect;
217
218#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +0000219 webrtc::TypingDetection _typingDetection;
jiayl@webrtc.orgbf007402013-09-17 18:09:20 +0000220 bool _typingNoiseWarningPending;
221 bool _typingNoiseDetected;
niklase@google.com470e71d2011-07-07 08:21:25 +0000222#endif
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000223 bool _saturationWarning;
niklase@google.com470e71d2011-07-07 08:21:25 +0000224
xians@google.com0b0665a2011-08-08 08:18:44 +0000225 int _instanceId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000226 bool _mixFileWithMicrophone;
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000227 uint32_t _captureLevel;
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +0000228 VoEMediaProcess* external_postproc_ptr_;
229 VoEMediaProcess* external_preproc_ptr_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000230 bool _mute;
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000231 int32_t _remainingMuteMicTimeMs;
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000232 bool stereo_codec_;
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000233 bool swap_stereo_channels_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000234};
235
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000236} // namespace voe
niklase@google.com470e71d2011-07-07 08:21:25 +0000237
238} // namespace webrtc
braveyao@webrtc.orga7cfa672013-12-24 03:39:10 +0000239
braveyao@webrtc.org0062a6d2013-12-24 03:58:51 +0000240#endif // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H