blob: f697d3adedb75496af563be6417a4ddfe6353629 [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
kwiberg5a25d952016-08-17 07:31:12 -070014#include <memory>
15
tommi31fc21f2016-01-21 10:37:37 -080016#include "webrtc/base/criticalsection.h"
andrew@webrtc.org28e82bf2013-05-02 00:30:36 +000017#include "webrtc/common_audio/resampler/include/push_resampler.h"
18#include "webrtc/common_types.h"
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +000019#include "webrtc/modules/audio_processing/typing_detection.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010020#include "webrtc/modules/include/module_common_types.h"
kwiberg9d7eb132016-08-16 04:08:30 -070021#include "webrtc/modules/utility/include/file_player.h"
22#include "webrtc/modules/utility/include/file_recorder.h"
andrew@webrtc.org28e82bf2013-05-02 00:30:36 +000023#include "webrtc/voice_engine/include/voe_base.h"
24#include "webrtc/voice_engine/level_indicator.h"
25#include "webrtc/voice_engine/monitor_module.h"
26#include "webrtc/voice_engine/voice_engine_defines.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000027
28namespace webrtc {
29
30class AudioProcessing;
31class ProcessThread;
32class VoEExternalMedia;
33class VoEMediaProcess;
34
35namespace voe {
36
37class ChannelManager;
38class MixedAudio;
39class Statistics;
40
41class TransmitMixer : public MonitorObserver,
andrew@webrtc.org40ee3d02014-04-03 21:56:01 +000042 public FileCallback {
niklase@google.com470e71d2011-07-07 08:21:25 +000043public:
pbos@webrtc.org92135212013-05-14 08:31:39 +000044 static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +000045
46 static void Destroy(TransmitMixer*& mixer);
47
pbos@webrtc.org6141e132013-04-09 10:09:10 +000048 int32_t SetEngineInformation(ProcessThread& processThread,
49 Statistics& engineStatistics,
50 ChannelManager& channelManager);
niklase@google.com470e71d2011-07-07 08:21:25 +000051
pbos@webrtc.org6141e132013-04-09 10:09:10 +000052 int32_t SetAudioProcessingModule(
niklase@google.com470e71d2011-07-07 08:21:25 +000053 AudioProcessing* audioProcessingModule);
54
pbos@webrtc.org6141e132013-04-09 10:09:10 +000055 int32_t PrepareDemux(const void* audioSamples,
Peter Kastingdce40cf2015-08-24 14:52:23 -070056 size_t nSamples,
Peter Kasting69558702016-01-12 16:26:35 -080057 size_t nChannels,
pbos@webrtc.org92135212013-05-14 08:31:39 +000058 uint32_t samplesPerSec,
59 uint16_t totalDelayMS,
60 int32_t clockDrift,
61 uint16_t currentMicLevel,
62 bool keyPressed);
niklase@google.com470e71d2011-07-07 08:21:25 +000063
64
pbos@webrtc.org6141e132013-04-09 10:09:10 +000065 int32_t DemuxAndMix();
xians@webrtc.org2f84afa2013-07-31 16:23:37 +000066 // Used by the Chrome to pass the recording data to the specific VoE
67 // channels for demux.
Peter Kasting69558702016-01-12 16:26:35 -080068 void DemuxAndMix(const int voe_channels[], size_t number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000069
pbos@webrtc.org6141e132013-04-09 10:09:10 +000070 int32_t EncodeAndSend();
xians@webrtc.org2f84afa2013-07-31 16:23:37 +000071 // Used by the Chrome to pass the recording data to the specific VoE
72 // channels for encoding and sending to the network.
Peter Kasting69558702016-01-12 16:26:35 -080073 void EncodeAndSend(const int voe_channels[], size_t number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000074
andrew@webrtc.org023cc5a2014-01-11 01:25:53 +000075 // Must be called on the same thread as PrepareDemux().
pbos@webrtc.org6141e132013-04-09 10:09:10 +000076 uint32_t CaptureLevel() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000077
pbos@webrtc.org6141e132013-04-09 10:09:10 +000078 int32_t StopSend();
niklase@google.com470e71d2011-07-07 08:21:25 +000079
niklase@google.com470e71d2011-07-07 08:21:25 +000080 // VoEExternalMedia
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +000081 int RegisterExternalMediaProcessing(VoEMediaProcess* object,
82 ProcessingTypes type);
83 int DeRegisterExternalMediaProcessing(ProcessingTypes type);
niklase@google.com470e71d2011-07-07 08:21:25 +000084
xians@google.com0b0665a2011-08-08 08:18:44 +000085 int GetMixingFrequency();
niklase@google.com470e71d2011-07-07 08:21:25 +000086
87 // VoEVolumeControl
pbos@webrtc.org92135212013-05-14 08:31:39 +000088 int SetMute(bool enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000089
90 bool Mute() const;
91
pbos@webrtc.org6141e132013-04-09 10:09:10 +000092 int8_t AudioLevel() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000093
pbos@webrtc.org6141e132013-04-09 10:09:10 +000094 int16_t AudioLevelFullRange() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000095
96 bool IsRecordingCall();
97
98 bool IsRecordingMic();
99
100 int StartPlayingFileAsMicrophone(const char* fileName,
pbos@webrtc.org92135212013-05-14 08:31:39 +0000101 bool loop,
102 FileFormats format,
103 int startPosition,
104 float volumeScaling,
105 int stopPosition,
niklase@google.com470e71d2011-07-07 08:21:25 +0000106 const CodecInst* codecInst);
107
108 int StartPlayingFileAsMicrophone(InStream* stream,
pbos@webrtc.org92135212013-05-14 08:31:39 +0000109 FileFormats format,
110 int startPosition,
111 float volumeScaling,
112 int stopPosition,
niklase@google.com470e71d2011-07-07 08:21:25 +0000113 const CodecInst* codecInst);
114
115 int StopPlayingFileAsMicrophone();
116
117 int IsPlayingFileAsMicrophone() const;
118
niklase@google.com470e71d2011-07-07 08:21:25 +0000119 int StartRecordingMicrophone(const char* fileName,
120 const CodecInst* codecInst);
121
122 int StartRecordingMicrophone(OutStream* stream,
123 const CodecInst* codecInst);
124
125 int StopRecordingMicrophone();
126
127 int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
128
129 int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
130
131 int StopRecordingCall();
132
133 void SetMixWithMicStatus(bool mix);
134
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000135 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000136
137 virtual ~TransmitMixer();
138
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000139 // MonitorObserver
niklase@google.com470e71d2011-07-07 08:21:25 +0000140 void OnPeriodicProcess();
141
142
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000143 // FileCallback
pbos@webrtc.org92135212013-05-14 08:31:39 +0000144 void PlayNotification(int32_t id,
145 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000146
pbos@webrtc.org92135212013-05-14 08:31:39 +0000147 void RecordNotification(int32_t id,
148 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000149
pbos@webrtc.org92135212013-05-14 08:31:39 +0000150 void PlayFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000151
pbos@webrtc.org92135212013-05-14 08:31:39 +0000152 void RecordFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000154#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000155 // Typing detection
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000156 int TimeSinceLastTyping(int &seconds);
niklas.enbom@webrtc.org06e722a2012-04-04 07:44:27 +0000157 int SetTypingDetectionParameters(int timeWindow,
158 int costPerTyping,
159 int reportingThreshold,
niklas.enbom@webrtc.orgf6edfef2012-05-09 13:16:12 +0000160 int penaltyDecay,
161 int typeEventDelay);
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000162#endif
163
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000164 void EnableStereoChannelSwapping(bool enable);
165 bool IsStereoChannelSwappingEnabled();
166
niklase@google.com470e71d2011-07-07 08:21:25 +0000167private:
pbos@webrtc.org92135212013-05-14 08:31:39 +0000168 TransmitMixer(uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000169
andrew@webrtc.org24120852013-03-02 00:14:46 +0000170 // Gets the maximum sample rate and number of channels over all currently
171 // sending codecs.
Peter Kasting69558702016-01-12 16:26:35 -0800172 void GetSendCodecInfo(int* max_sample_rate, size_t* max_channels);
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000173
andrew@webrtc.org40ee3d02014-04-03 21:56:01 +0000174 void GenerateAudioFrame(const int16_t audioSamples[],
Peter Kastingdce40cf2015-08-24 14:52:23 -0700175 size_t nSamples,
Peter Kasting69558702016-01-12 16:26:35 -0800176 size_t nChannels,
andrew@webrtc.org40ee3d02014-04-03 21:56:01 +0000177 int samplesPerSec);
pbos@webrtc.org92135212013-05-14 08:31:39 +0000178 int32_t RecordAudioToFile(uint32_t mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000179
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000180 int32_t MixOrReplaceAudioWithFile(
pbos@webrtc.org92135212013-05-14 08:31:39 +0000181 int mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000182
andrew@webrtc.org75dd2882014-02-11 20:52:30 +0000183 void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level,
184 bool key_pressed);
niklase@google.com470e71d2011-07-07 08:21:25 +0000185
186#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +0000187 void TypingDetection(bool keyPressed);
niklase@google.com470e71d2011-07-07 08:21:25 +0000188#endif
189
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000190 // uses
niklase@google.com470e71d2011-07-07 08:21:25 +0000191 Statistics* _engineStatisticsPtr;
192 ChannelManager* _channelManagerPtr;
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000193 AudioProcessing* audioproc_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000194 VoiceEngineObserver* _voiceEngineObserverPtr;
195 ProcessThread* _processThreadPtr;
196
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000197 // owns
niklase@google.com470e71d2011-07-07 08:21:25 +0000198 MonitorModule _monitorModule;
199 AudioFrame _audioFrame;
andrew@webrtc.orgf5a33f12014-04-19 00:32:07 +0000200 PushResampler<int16_t> resampler_; // ADM sample rate -> mixing rate
kwiberg5a25d952016-08-17 07:31:12 -0700201 std::unique_ptr<FilePlayer> file_player_;
202 std::unique_ptr<FileRecorder> file_recorder_;
203 std::unique_ptr<FileRecorder> file_call_recorder_;
xians@google.com0b0665a2011-08-08 08:18:44 +0000204 int _filePlayerId;
205 int _fileRecorderId;
206 int _fileCallRecorderId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000207 bool _filePlaying;
208 bool _fileRecording;
209 bool _fileCallRecording;
210 voe::AudioLevel _audioLevel;
211 // protect file instances and their variables in MixedParticipants()
tommi31fc21f2016-01-21 10:37:37 -0800212 rtc::CriticalSection _critSect;
213 rtc::CriticalSection _callbackCritSect;
niklase@google.com470e71d2011-07-07 08:21:25 +0000214
215#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
henrikg@webrtc.orgc6937042014-01-30 09:50:46 +0000216 webrtc::TypingDetection _typingDetection;
jiayl@webrtc.orgbf007402013-09-17 18:09:20 +0000217 bool _typingNoiseWarningPending;
218 bool _typingNoiseDetected;
niklase@google.com470e71d2011-07-07 08:21:25 +0000219#endif
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000220 bool _saturationWarning;
niklase@google.com470e71d2011-07-07 08:21:25 +0000221
xians@google.com0b0665a2011-08-08 08:18:44 +0000222 int _instanceId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000223 bool _mixFileWithMicrophone;
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000224 uint32_t _captureLevel;
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +0000225 VoEMediaProcess* external_postproc_ptr_;
226 VoEMediaProcess* external_preproc_ptr_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000227 bool _mute;
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000228 bool stereo_codec_;
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000229 bool swap_stereo_channels_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000230};
231
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000232} // namespace voe
niklase@google.com470e71d2011-07-07 08:21:25 +0000233
234} // namespace webrtc
braveyao@webrtc.orga7cfa672013-12-24 03:39:10 +0000235
braveyao@webrtc.org0062a6d2013-12-24 03:58:51 +0000236#endif // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H