blob: c68293fe12e0dc5bbd052152af2f20b5bc91e8fd [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"
16#include "webrtc/modules/interface/module_common_types.h"
17#include "webrtc/modules/utility/interface/file_player.h"
18#include "webrtc/modules/utility/interface/file_recorder.h"
19#include "webrtc/voice_engine/include/voe_base.h"
20#include "webrtc/voice_engine/level_indicator.h"
21#include "webrtc/voice_engine/monitor_module.h"
22#include "webrtc/voice_engine/voice_engine_defines.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000023
24namespace webrtc {
25
26class AudioProcessing;
27class ProcessThread;
28class VoEExternalMedia;
29class VoEMediaProcess;
30
31namespace voe {
32
33class ChannelManager;
34class MixedAudio;
35class Statistics;
36
37class TransmitMixer : public MonitorObserver,
38 public FileCallback
39
40{
41public:
pbos@webrtc.org92135212013-05-14 08:31:39 +000042 static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +000043
44 static void Destroy(TransmitMixer*& mixer);
45
pbos@webrtc.org6141e132013-04-09 10:09:10 +000046 int32_t SetEngineInformation(ProcessThread& processThread,
47 Statistics& engineStatistics,
48 ChannelManager& channelManager);
niklase@google.com470e71d2011-07-07 08:21:25 +000049
pbos@webrtc.org6141e132013-04-09 10:09:10 +000050 int32_t SetAudioProcessingModule(
niklase@google.com470e71d2011-07-07 08:21:25 +000051 AudioProcessing* audioProcessingModule);
52
pbos@webrtc.org6141e132013-04-09 10:09:10 +000053 int32_t PrepareDemux(const void* audioSamples,
pbos@webrtc.org92135212013-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);
niklase@google.com470e71d2011-07-07 08:21:25 +000061
62
pbos@webrtc.org6141e132013-04-09 10:09:10 +000063 int32_t DemuxAndMix();
xians@webrtc.org2f84afa2013-07-31 16:23:37 +000064 // Used by the Chrome to pass the recording data to the specific VoE
65 // channels for demux.
66 void DemuxAndMix(int voe_channels[], int number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000067
pbos@webrtc.org6141e132013-04-09 10:09:10 +000068 int32_t EncodeAndSend();
xians@webrtc.org2f84afa2013-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.
71 void EncodeAndSend(int voe_channels[], int number_of_voe_channels);
niklase@google.com470e71d2011-07-07 08:21:25 +000072
pbos@webrtc.org6141e132013-04-09 10:09:10 +000073 uint32_t CaptureLevel() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000074
pbos@webrtc.org6141e132013-04-09 10:09:10 +000075 int32_t StopSend();
niklase@google.com470e71d2011-07-07 08:21:25 +000076
niklase@google.com470e71d2011-07-07 08:21:25 +000077 // VoEDtmf
pbos@webrtc.org92135212013-05-14 08:31:39 +000078 void UpdateMuteMicrophoneTime(uint32_t lengthMs);
niklase@google.com470e71d2011-07-07 08:21:25 +000079
80 // 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
pbos@webrtc.org92135212013-05-14 08:31:39 +0000119 int ScaleFileAsMicrophonePlayout(float scale);
niklase@google.com470e71d2011-07-07 08:21:25 +0000120
121 int StartRecordingMicrophone(const char* fileName,
122 const CodecInst* codecInst);
123
124 int StartRecordingMicrophone(OutStream* stream,
125 const CodecInst* codecInst);
126
127 int StopRecordingMicrophone();
128
129 int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
130
131 int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
132
133 int StopRecordingCall();
134
135 void SetMixWithMicStatus(bool mix);
136
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000137 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000138
139 virtual ~TransmitMixer();
140
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000141 // MonitorObserver
niklase@google.com470e71d2011-07-07 08:21:25 +0000142 void OnPeriodicProcess();
143
144
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000145 // FileCallback
pbos@webrtc.org92135212013-05-14 08:31:39 +0000146 void PlayNotification(int32_t id,
147 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000148
pbos@webrtc.org92135212013-05-14 08:31:39 +0000149 void RecordNotification(int32_t id,
150 uint32_t durationMs);
niklase@google.com470e71d2011-07-07 08:21:25 +0000151
pbos@webrtc.org92135212013-05-14 08:31:39 +0000152 void PlayFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
pbos@webrtc.org92135212013-05-14 08:31:39 +0000154 void RecordFileEnded(int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000156#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000157 // Typing detection
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000158 int TimeSinceLastTyping(int &seconds);
niklas.enbom@webrtc.org06e722a2012-04-04 07:44:27 +0000159 int SetTypingDetectionParameters(int timeWindow,
160 int costPerTyping,
161 int reportingThreshold,
niklas.enbom@webrtc.orgf6edfef2012-05-09 13:16:12 +0000162 int penaltyDecay,
163 int typeEventDelay);
niklas.enbom@webrtc.org3dc88652012-03-30 09:53:54 +0000164#endif
165
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000166 void EnableStereoChannelSwapping(bool enable);
167 bool IsStereoChannelSwappingEnabled();
168
niklase@google.com470e71d2011-07-07 08:21:25 +0000169private:
pbos@webrtc.org92135212013-05-14 08:31:39 +0000170 TransmitMixer(uint32_t instanceId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000171
andrew@webrtc.org24120852013-03-02 00:14:46 +0000172 // Gets the maximum sample rate and number of channels over all currently
173 // sending codecs.
174 void GetSendCodecInfo(int* max_sample_rate, int* max_channels);
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000175
176 int GenerateAudioFrame(const int16_t audioSamples[],
177 int nSamples,
178 int nChannels,
179 int samplesPerSec);
pbos@webrtc.org92135212013-05-14 08:31:39 +0000180 int32_t RecordAudioToFile(uint32_t mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000182 int32_t MixOrReplaceAudioWithFile(
pbos@webrtc.org92135212013-05-14 08:31:39 +0000183 int mixingFrequency);
niklase@google.com470e71d2011-07-07 08:21:25 +0000184
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000185 void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level);
niklase@google.com470e71d2011-07-07 08:21:25 +0000186
187#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
pbos@webrtc.org92135212013-05-14 08:31:39 +0000188 int TypingDetection(bool keyPressed);
niklase@google.com470e71d2011-07-07 08:21:25 +0000189#endif
190
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000191 // uses
niklase@google.com470e71d2011-07-07 08:21:25 +0000192 Statistics* _engineStatisticsPtr;
193 ChannelManager* _channelManagerPtr;
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000194 AudioProcessing* audioproc_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000195 VoiceEngineObserver* _voiceEngineObserverPtr;
196 ProcessThread* _processThreadPtr;
197
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000198 // owns
niklase@google.com470e71d2011-07-07 08:21:25 +0000199 MonitorModule _monitorModule;
200 AudioFrame _audioFrame;
andrew@webrtc.org28e82bf2013-05-02 00:30:36 +0000201 PushResampler resampler_; // ADM sample rate -> mixing rate
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +0000202 FilePlayer* _filePlayerPtr;
niklase@google.com470e71d2011-07-07 08:21:25 +0000203 FileRecorder* _fileRecorderPtr;
204 FileRecorder* _fileCallRecorderPtr;
xians@google.com0b0665a2011-08-08 08:18:44 +0000205 int _filePlayerId;
206 int _fileRecorderId;
207 int _fileCallRecorderId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000208 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
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000217 int32_t _timeActive;
218 int32_t _timeSinceLastTyping;
219 int32_t _penaltyCounter;
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000220 bool _typingNoiseWarning;
niklas.enbom@webrtc.org06e722a2012-04-04 07:44:27 +0000221
222 // Tunable treshold values
223 int _timeWindow; // nr of10ms slots accepted to count as a hit.
224 int _costPerTyping; // Penalty added for a typing + activity coincide.
225 int _reportingThreshold; // Threshold for _penaltyCounter.
226 int _penaltyDecay; // How much we reduce _penaltyCounter every 10 ms.
niklas.enbom@webrtc.orgf6edfef2012-05-09 13:16:12 +0000227 int _typeEventDelay; // How old typing events we allow
niklas.enbom@webrtc.org06e722a2012-04-04 07:44:27 +0000228
niklase@google.com470e71d2011-07-07 08:21:25 +0000229#endif
andrew@webrtc.org6be1e932013-03-01 18:47:28 +0000230 bool _saturationWarning;
niklase@google.com470e71d2011-07-07 08:21:25 +0000231
xians@google.com0b0665a2011-08-08 08:18:44 +0000232 int _instanceId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000233 bool _mixFileWithMicrophone;
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000234 uint32_t _captureLevel;
andrew@webrtc.org21ab3ba2012-10-19 17:30:56 +0000235 VoEMediaProcess* external_postproc_ptr_;
236 VoEMediaProcess* external_preproc_ptr_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000237 bool _mute;
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000238 int32_t _remainingMuteMicTimeMs;
andrew@webrtc.org4ecea3e2012-06-27 03:25:31 +0000239 bool stereo_codec_;
andrew@webrtc.org02d71742012-04-24 19:47:00 +0000240 bool swap_stereo_channels_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000241};
242
243#endif // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
244
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000245} // namespace voe
niklase@google.com470e71d2011-07-07 08:21:25 +0000246
247} // namespace webrtc