1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
23dc886561c2b6472112e9b5e58d80f7e9b77052bniklas.enbom@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1528e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/common_audio/resampler/include/push_resampler.h"
1628e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/common_types.h"
17c693704cc209083ae439c312ff89bec5a2cf23d0henrikg@webrtc.org#include "webrtc/modules/audio_processing/typing_detection.h"
18ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
19ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/utility/include/file_player.h"
20ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/utility/include/file_recorder.h"
2128e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/voice_engine/include/voe_base.h"
2228e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/voice_engine/level_indicator.h"
2328e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/voice_engine/monitor_module.h"
2428e82bfec6db40aa9bb9aeeb3248f5d6d72e0b84andrew@webrtc.org#include "webrtc/voice_engine/voice_engine_defines.h"
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc {
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass AudioProcessing;
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ProcessThread;
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEExternalMedia;
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass VoEMediaProcess;
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace voe {
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass ChannelManager;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass MixedAudio;
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass Statistics;
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass TransmitMixer : public MonitorObserver,
4040ee3d07eda24b8e8214429d9885d9ad9a2c04f7andrew@webrtc.org                      public FileCallback {
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.compublic:
429213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    static void Destroy(TransmitMixer*& mixer);
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
466141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t SetEngineInformation(ProcessThread& processThread,
476141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org                                 Statistics& engineStatistics,
486141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org                                 ChannelManager& channelManager);
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
506141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t SetAudioProcessingModule(
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        AudioProcessing* audioProcessingModule);
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
536141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t PrepareDemux(const void* audioSamples,
54dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                         size_t nSamples,
556955870806624479723addfae6dcf5d13968796cPeter Kasting                         size_t nChannels,
569213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                         uint32_t samplesPerSec,
579213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                         uint16_t totalDelayMS,
589213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                         int32_t  clockDrift,
599213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                         uint16_t currentMicLevel,
609213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                         bool keyPressed);
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
636141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t DemuxAndMix();
642f84afad30b088ddebb4063bc47ac9a79d735a2bxians@webrtc.org    // Used by the Chrome to pass the recording data to the specific VoE
652f84afad30b088ddebb4063bc47ac9a79d735a2bxians@webrtc.org    // channels for demux.
666955870806624479723addfae6dcf5d13968796cPeter Kasting    void DemuxAndMix(const int voe_channels[], size_t number_of_voe_channels);
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
686141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t EncodeAndSend();
692f84afad30b088ddebb4063bc47ac9a79d735a2bxians@webrtc.org    // Used by the Chrome to pass the recording data to the specific VoE
702f84afad30b088ddebb4063bc47ac9a79d735a2bxians@webrtc.org    // channels for encoding and sending to the network.
716955870806624479723addfae6dcf5d13968796cPeter Kasting    void EncodeAndSend(const int voe_channels[], size_t number_of_voe_channels);
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
73023cc5abc7d25fb3133b4d0206b67dcc6204b6e8andrew@webrtc.org    // Must be called on the same thread as PrepareDemux().
746141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    uint32_t CaptureLevel() const;
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
766141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t StopSend();
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // VoEDtmf
799213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    void UpdateMuteMicrophoneTime(uint32_t lengthMs);
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // VoEExternalMedia
8221ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org    int RegisterExternalMediaProcessing(VoEMediaProcess* object,
8321ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org                                        ProcessingTypes type);
8421ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org    int DeRegisterExternalMediaProcessing(ProcessingTypes type);
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
860b0665acc1464d68e878f203bbc8772a0e32402dxians@google.com    int GetMixingFrequency();
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // VoEVolumeControl
899213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    int SetMute(bool enable);
90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool Mute() const;
92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
936141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int8_t AudioLevel() const;
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
956141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int16_t AudioLevelFullRange() const;
96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool IsRecordingCall();
98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool IsRecordingMic();
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartPlayingFileAsMicrophone(const char* fileName,
1029213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     bool loop,
1039213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     FileFormats format,
1049213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     int startPosition,
1059213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     float volumeScaling,
1069213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     int stopPosition,
107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     const CodecInst* codecInst);
108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartPlayingFileAsMicrophone(InStream* stream,
1109213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     FileFormats format,
1119213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     int startPosition,
1129213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     float volumeScaling,
1139213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                                     int stopPosition,
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     const CodecInst* codecInst);
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StopPlayingFileAsMicrophone();
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int IsPlayingFileAsMicrophone() const;
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartRecordingMicrophone(const char* fileName,
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                 const CodecInst* codecInst);
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartRecordingMicrophone(OutStream* stream,
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                 const CodecInst* codecInst);
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StopRecordingMicrophone();
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int StopRecordingCall();
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    void SetMixWithMicStatus(bool mix);
135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1366141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    virtual ~TransmitMixer();
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
14002d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    // MonitorObserver
141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    void OnPeriodicProcess();
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
14402d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    // FileCallback
1459213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    void PlayNotification(int32_t id,
1469213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                          uint32_t durationMs);
147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1489213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    void RecordNotification(int32_t id,
1499213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org                            uint32_t durationMs);
150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1519213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    void PlayFileEnded(int32_t id);
152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1539213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    void RecordFileEnded(int32_t id);
154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1553dc886561c2b6472112e9b5e58d80f7e9b77052bniklas.enbom@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
15602d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    // Typing detection
1573dc886561c2b6472112e9b5e58d80f7e9b77052bniklas.enbom@webrtc.org    int TimeSinceLastTyping(int &seconds);
15806e722ae77004fdb9f20004ccc0cddc1e4af31ddniklas.enbom@webrtc.org    int SetTypingDetectionParameters(int timeWindow,
15906e722ae77004fdb9f20004ccc0cddc1e4af31ddniklas.enbom@webrtc.org                                     int costPerTyping,
16006e722ae77004fdb9f20004ccc0cddc1e4af31ddniklas.enbom@webrtc.org                                     int reportingThreshold,
161f6edfeff63fd41b2caec0f108f2c5788e47d10b8niklas.enbom@webrtc.org                                     int penaltyDecay,
162f6edfeff63fd41b2caec0f108f2c5788e47d10b8niklas.enbom@webrtc.org                                     int typeEventDelay);
1633dc886561c2b6472112e9b5e58d80f7e9b77052bniklas.enbom@webrtc.org#endif
1643dc886561c2b6472112e9b5e58d80f7e9b77052bniklas.enbom@webrtc.org
16502d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org  void EnableStereoChannelSwapping(bool enable);
16602d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org  bool IsStereoChannelSwappingEnabled();
16702d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org
168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comprivate:
1699213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    TransmitMixer(uint32_t instanceId);
170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1712412085bc1d95bcae2ee6987206b73bd1c2f5080andrew@webrtc.org    // Gets the maximum sample rate and number of channels over all currently
1722412085bc1d95bcae2ee6987206b73bd1c2f5080andrew@webrtc.org    // sending codecs.
1736955870806624479723addfae6dcf5d13968796cPeter Kasting    void GetSendCodecInfo(int* max_sample_rate, size_t* max_channels);
1744ecea3e1057eebf846af9b93abf8faf8571bc576andrew@webrtc.org
17540ee3d07eda24b8e8214429d9885d9ad9a2c04f7andrew@webrtc.org    void GenerateAudioFrame(const int16_t audioSamples[],
176dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                            size_t nSamples,
1776955870806624479723addfae6dcf5d13968796cPeter Kasting                            size_t nChannels,
17840ee3d07eda24b8e8214429d9885d9ad9a2c04f7andrew@webrtc.org                            int samplesPerSec);
1799213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org    int32_t RecordAudioToFile(uint32_t mixingFrequency);
180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1816141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t MixOrReplaceAudioWithFile(
1829213521ea98b0977c7cdabd2853060835af226f3pbos@webrtc.org        int mixingFrequency);
183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
18475dd2885c5e8fe1db6ea4384fe744e0bdecdcaebandrew@webrtc.org    void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level,
18575dd2885c5e8fe1db6ea4384fe744e0bdecdcaebandrew@webrtc.org                      bool key_pressed);
186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
188c693704cc209083ae439c312ff89bec5a2cf23d0henrikg@webrtc.org    void TypingDetection(bool keyPressed);
189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19102d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    // uses
192470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    Statistics* _engineStatisticsPtr;
193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ChannelManager* _channelManagerPtr;
1946be1e934ad48ccdac734b5cbd50528235ec93816andrew@webrtc.org    AudioProcessing* audioproc_;
195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    VoiceEngineObserver* _voiceEngineObserverPtr;
196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ProcessThread* _processThreadPtr;
197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19802d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    // owns
199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    MonitorModule _monitorModule;
200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    AudioFrame _audioFrame;
201f5a33f145b74d9c6058c670baf7b6201b78f6e48andrew@webrtc.org    PushResampler<int16_t> resampler_;  // ADM sample rate -> mixing rate
20221ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org    FilePlayer* _filePlayerPtr;
203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    FileRecorder* _fileRecorderPtr;
204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    FileRecorder* _fileCallRecorderPtr;
2050b0665acc1464d68e878f203bbc8772a0e32402dxians@google.com    int _filePlayerId;
2060b0665acc1464d68e878f203bbc8772a0e32402dxians@google.com    int _fileRecorderId;
2070b0665acc1464d68e878f203bbc8772a0e32402dxians@google.com    int _fileCallRecorderId;
208470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool _filePlaying;
209470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool _fileRecording;
210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool _fileCallRecording;
211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    voe::AudioLevel _audioLevel;
212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    // protect file instances and their variables in MixedParticipants()
213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    CriticalSectionWrapper& _critSect;
214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    CriticalSectionWrapper& _callbackCritSect;
215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
217c693704cc209083ae439c312ff89bec5a2cf23d0henrikg@webrtc.org    webrtc::TypingDetection _typingDetection;
218bf00740c92839865f3656fb4ee02b144f26b2012jiayl@webrtc.org    bool _typingNoiseWarningPending;
219bf00740c92839865f3656fb4ee02b144f26b2012jiayl@webrtc.org    bool _typingNoiseDetected;
220470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
2216be1e934ad48ccdac734b5cbd50528235ec93816andrew@webrtc.org    bool _saturationWarning;
222470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2230b0665acc1464d68e878f203bbc8772a0e32402dxians@google.com    int _instanceId;
224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool _mixFileWithMicrophone;
2256141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    uint32_t _captureLevel;
22621ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org    VoEMediaProcess* external_postproc_ptr_;
22721ab3ba8f8fb49c2fae62b09e7ff346ce55a89f3andrew@webrtc.org    VoEMediaProcess* external_preproc_ptr_;
228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    bool _mute;
2296141e13873d0fdea626de08dfec2efa2c9171c76pbos@webrtc.org    int32_t _remainingMuteMicTimeMs;
2304ecea3e1057eebf846af9b93abf8faf8571bc576andrew@webrtc.org    bool stereo_codec_;
23102d7174722cd6155c5c42da92c012ad8bd5e32c7andrew@webrtc.org    bool swap_stereo_channels_;
232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
234d900e8bea84c474696bf0219aed1353ce65ffd8epbos@webrtc.org}  // namespace voe
235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
236470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}  // namespace webrtc
237a7cfa6704af8ac20acec4d195088053f7043b66fbraveyao@webrtc.org
2380062a6d0995c24f423504aba83b3f086cabec924braveyao@webrtc.org#endif  // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
239