diff options
Diffstat (limited to 'webrtc/modules/audio_device/mac/audio_device_mac.h')
-rw-r--r-- | webrtc/modules/audio_device/mac/audio_device_mac.h | 587 |
1 files changed, 298 insertions, 289 deletions
diff --git a/webrtc/modules/audio_device/mac/audio_device_mac.h b/webrtc/modules/audio_device/mac/audio_device_mac.h index f2b66b4d06..ca3a51997d 100644 --- a/webrtc/modules/audio_device/mac/audio_device_mac.h +++ b/webrtc/modules/audio_device/mac/audio_device_mac.h @@ -23,350 +23,359 @@ struct PaUtilRingBuffer; -namespace webrtc -{ +namespace rtc { +class PlatformThread; +} // namespace rtc + +namespace webrtc { class EventWrapper; -class ThreadWrapper; const uint32_t N_REC_SAMPLES_PER_SEC = 48000; const uint32_t N_PLAY_SAMPLES_PER_SEC = 48000; -const uint32_t N_REC_CHANNELS = 1; // default is mono recording -const uint32_t N_PLAY_CHANNELS = 2; // default is stereo playout +const uint32_t N_REC_CHANNELS = 1; // default is mono recording +const uint32_t N_PLAY_CHANNELS = 2; // default is stereo playout const uint32_t N_DEVICE_CHANNELS = 64; -const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = (N_REC_SAMPLES_PER_SEC / 100); -const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES = (N_PLAY_SAMPLES_PER_SEC / 100); +const int kBufferSizeMs = 10; + +const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES = + N_REC_SAMPLES_PER_SEC * kBufferSizeMs / 1000; +const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES = + N_PLAY_SAMPLES_PER_SEC * kBufferSizeMs / 1000; const int N_BLOCKS_IO = 2; -const int N_BUFFERS_IN = 2; // Must be at least N_BLOCKS_IO. +const int N_BUFFERS_IN = 2; // Must be at least N_BLOCKS_IO. const int N_BUFFERS_OUT = 3; // Must be at least N_BLOCKS_IO. -const uint32_t TIMER_PERIOD_MS = (2 * 10 * N_BLOCKS_IO * 1000000); +const uint32_t TIMER_PERIOD_MS = 2 * 10 * N_BLOCKS_IO * 1000000; const uint32_t REC_BUF_SIZE_IN_SAMPLES = ENGINE_REC_BUF_SIZE_IN_SAMPLES * N_DEVICE_CHANNELS * N_BUFFERS_IN; const uint32_t PLAY_BUF_SIZE_IN_SAMPLES = ENGINE_PLAY_BUF_SIZE_IN_SAMPLES * N_PLAY_CHANNELS * N_BUFFERS_OUT; -class AudioDeviceMac: public AudioDeviceGeneric -{ -public: - AudioDeviceMac(const int32_t id); - ~AudioDeviceMac(); - - // Retrieve the currently utilized audio layer - virtual int32_t - ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const; - - // Main initializaton and termination - virtual int32_t Init(); - virtual int32_t Terminate(); - virtual bool Initialized() const; - - // Device enumeration - virtual int16_t PlayoutDevices(); - virtual int16_t RecordingDevices(); - virtual int32_t PlayoutDeviceName( - uint16_t index, - char name[kAdmMaxDeviceNameSize], - char guid[kAdmMaxGuidSize]); - virtual int32_t RecordingDeviceName( - uint16_t index, - char name[kAdmMaxDeviceNameSize], - char guid[kAdmMaxGuidSize]); - - // Device selection - virtual int32_t SetPlayoutDevice(uint16_t index); - virtual int32_t SetPlayoutDevice( - AudioDeviceModule::WindowsDeviceType device); - virtual int32_t SetRecordingDevice(uint16_t index); - virtual int32_t SetRecordingDevice( - AudioDeviceModule::WindowsDeviceType device); - - // Audio transport initialization - virtual int32_t PlayoutIsAvailable(bool& available); - virtual int32_t InitPlayout(); - virtual bool PlayoutIsInitialized() const; - virtual int32_t RecordingIsAvailable(bool& available); - virtual int32_t InitRecording(); - virtual bool RecordingIsInitialized() const; - - // Audio transport control - virtual int32_t StartPlayout(); - virtual int32_t StopPlayout(); - virtual bool Playing() const; - virtual int32_t StartRecording(); - virtual int32_t StopRecording(); - virtual bool Recording() const; - - // Microphone Automatic Gain Control (AGC) - virtual int32_t SetAGC(bool enable); - virtual bool AGC() const; - - // Volume control based on the Windows Wave API (Windows only) - virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); - virtual int32_t WaveOutVolume(uint16_t& volumeLeft, - uint16_t& volumeRight) const; - - // Audio mixer initialization - virtual int32_t InitSpeaker(); - virtual bool SpeakerIsInitialized() const; - virtual int32_t InitMicrophone(); - virtual bool MicrophoneIsInitialized() const; - - // Speaker volume controls - virtual int32_t SpeakerVolumeIsAvailable(bool& available); - virtual int32_t SetSpeakerVolume(uint32_t volume); - virtual int32_t SpeakerVolume(uint32_t& volume) const; - virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; - virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; - virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; - - // Microphone volume controls - virtual int32_t MicrophoneVolumeIsAvailable(bool& available); - virtual int32_t SetMicrophoneVolume(uint32_t volume); - virtual int32_t MicrophoneVolume(uint32_t& volume) const; - virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; - virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; - virtual int32_t - MicrophoneVolumeStepSize(uint16_t& stepSize) const; - - // Microphone mute control - virtual int32_t MicrophoneMuteIsAvailable(bool& available); - virtual int32_t SetMicrophoneMute(bool enable); - virtual int32_t MicrophoneMute(bool& enabled) const; - - // Speaker mute control - virtual int32_t SpeakerMuteIsAvailable(bool& available); - virtual int32_t SetSpeakerMute(bool enable); - virtual int32_t SpeakerMute(bool& enabled) const; - - // Microphone boost control - virtual int32_t MicrophoneBoostIsAvailable(bool& available); - virtual int32_t SetMicrophoneBoost(bool enable); - virtual int32_t MicrophoneBoost(bool& enabled) const; - - // Stereo support - virtual int32_t StereoPlayoutIsAvailable(bool& available); - virtual int32_t SetStereoPlayout(bool enable); - virtual int32_t StereoPlayout(bool& enabled) const; - virtual int32_t StereoRecordingIsAvailable(bool& available); - virtual int32_t SetStereoRecording(bool enable); - virtual int32_t StereoRecording(bool& enabled) const; - - // Delay information and control - virtual int32_t - SetPlayoutBuffer(const AudioDeviceModule::BufferType type, - uint16_t sizeMS); - virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, - uint16_t& sizeMS) const; - virtual int32_t PlayoutDelay(uint16_t& delayMS) const; - virtual int32_t RecordingDelay(uint16_t& delayMS) const; - - // CPU load - virtual int32_t CPULoad(uint16_t& load) const; - - virtual bool PlayoutWarning() const; - virtual bool PlayoutError() const; - virtual bool RecordingWarning() const; - virtual bool RecordingError() const; - virtual void ClearPlayoutWarning(); - virtual void ClearPlayoutError(); - virtual void ClearRecordingWarning(); - virtual void ClearRecordingError(); - - virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); - -private: - virtual int32_t MicrophoneIsAvailable(bool& available); - virtual int32_t SpeakerIsAvailable(bool& available); - - static void AtomicSet32(int32_t* theValue, int32_t newValue); - static int32_t AtomicGet32(int32_t* theValue); - - static void logCAMsg(const TraceLevel level, - const TraceModule module, - const int32_t id, const char *msg, - const char *err); - - int32_t GetNumberDevices(const AudioObjectPropertyScope scope, - AudioDeviceID scopedDeviceIds[], - const uint32_t deviceListLength); - - int32_t GetDeviceName(const AudioObjectPropertyScope scope, - const uint16_t index, char* name); - - int32_t InitDevice(uint16_t userDeviceIndex, - AudioDeviceID& deviceId, bool isInput); - - // Always work with our preferred playout format inside VoE. - // Then convert the output to the OS setting using an AudioConverter. - OSStatus SetDesiredPlayoutFormat(); - - static OSStatus - objectListenerProc(AudioObjectID objectId, UInt32 numberAddresses, - const AudioObjectPropertyAddress addresses[], - void* clientData); - - OSStatus - implObjectListenerProc(AudioObjectID objectId, UInt32 numberAddresses, - const AudioObjectPropertyAddress addresses[]); - - int32_t HandleDeviceChange(); - - int32_t - HandleStreamFormatChange(AudioObjectID objectId, +const int kGetMicVolumeIntervalMs = 1000; + +class AudioDeviceMac : public AudioDeviceGeneric { + public: + AudioDeviceMac(const int32_t id); + ~AudioDeviceMac(); + + // Retrieve the currently utilized audio layer + virtual int32_t ActiveAudioLayer( + AudioDeviceModule::AudioLayer& audioLayer) const; + + // Main initializaton and termination + virtual int32_t Init(); + virtual int32_t Terminate(); + virtual bool Initialized() const; + + // Device enumeration + virtual int16_t PlayoutDevices(); + virtual int16_t RecordingDevices(); + virtual int32_t PlayoutDeviceName(uint16_t index, + char name[kAdmMaxDeviceNameSize], + char guid[kAdmMaxGuidSize]); + virtual int32_t RecordingDeviceName(uint16_t index, + char name[kAdmMaxDeviceNameSize], + char guid[kAdmMaxGuidSize]); + + // Device selection + virtual int32_t SetPlayoutDevice(uint16_t index); + virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device); + virtual int32_t SetRecordingDevice(uint16_t index); + virtual int32_t SetRecordingDevice( + AudioDeviceModule::WindowsDeviceType device); + + // Audio transport initialization + virtual int32_t PlayoutIsAvailable(bool& available); + virtual int32_t InitPlayout(); + virtual bool PlayoutIsInitialized() const; + virtual int32_t RecordingIsAvailable(bool& available); + virtual int32_t InitRecording(); + virtual bool RecordingIsInitialized() const; + + // Audio transport control + virtual int32_t StartPlayout(); + virtual int32_t StopPlayout(); + virtual bool Playing() const; + virtual int32_t StartRecording(); + virtual int32_t StopRecording(); + virtual bool Recording() const; + + // Microphone Automatic Gain Control (AGC) + virtual int32_t SetAGC(bool enable); + virtual bool AGC() const; + + // Volume control based on the Windows Wave API (Windows only) + virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); + virtual int32_t WaveOutVolume(uint16_t& volumeLeft, + uint16_t& volumeRight) const; + + // Audio mixer initialization + virtual int32_t InitSpeaker(); + virtual bool SpeakerIsInitialized() const; + virtual int32_t InitMicrophone(); + virtual bool MicrophoneIsInitialized() const; + + // Speaker volume controls + virtual int32_t SpeakerVolumeIsAvailable(bool& available); + virtual int32_t SetSpeakerVolume(uint32_t volume); + virtual int32_t SpeakerVolume(uint32_t& volume) const; + virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; + virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; + virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; + + // Microphone volume controls + virtual int32_t MicrophoneVolumeIsAvailable(bool& available); + virtual int32_t SetMicrophoneVolume(uint32_t volume); + virtual int32_t MicrophoneVolume(uint32_t& volume) const; + virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; + virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; + virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; + + // Microphone mute control + virtual int32_t MicrophoneMuteIsAvailable(bool& available); + virtual int32_t SetMicrophoneMute(bool enable); + virtual int32_t MicrophoneMute(bool& enabled) const; + + // Speaker mute control + virtual int32_t SpeakerMuteIsAvailable(bool& available); + virtual int32_t SetSpeakerMute(bool enable); + virtual int32_t SpeakerMute(bool& enabled) const; + + // Microphone boost control + virtual int32_t MicrophoneBoostIsAvailable(bool& available); + virtual int32_t SetMicrophoneBoost(bool enable); + virtual int32_t MicrophoneBoost(bool& enabled) const; + + // Stereo support + virtual int32_t StereoPlayoutIsAvailable(bool& available); + virtual int32_t SetStereoPlayout(bool enable); + virtual int32_t StereoPlayout(bool& enabled) const; + virtual int32_t StereoRecordingIsAvailable(bool& available); + virtual int32_t SetStereoRecording(bool enable); + virtual int32_t StereoRecording(bool& enabled) const; + + // Delay information and control + virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, + uint16_t sizeMS); + virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, + uint16_t& sizeMS) const; + virtual int32_t PlayoutDelay(uint16_t& delayMS) const; + virtual int32_t RecordingDelay(uint16_t& delayMS) const; + + // CPU load + virtual int32_t CPULoad(uint16_t& load) const; + + virtual bool PlayoutWarning() const; + virtual bool PlayoutError() const; + virtual bool RecordingWarning() const; + virtual bool RecordingError() const; + virtual void ClearPlayoutWarning(); + virtual void ClearPlayoutError(); + virtual void ClearRecordingWarning(); + virtual void ClearRecordingError(); + + virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); + + private: + virtual int32_t MicrophoneIsAvailable(bool& available); + virtual int32_t SpeakerIsAvailable(bool& available); + + static void AtomicSet32(int32_t* theValue, int32_t newValue); + static int32_t AtomicGet32(int32_t* theValue); + + static void logCAMsg(const TraceLevel level, + const TraceModule module, + const int32_t id, + const char* msg, + const char* err); + + int32_t GetNumberDevices(const AudioObjectPropertyScope scope, + AudioDeviceID scopedDeviceIds[], + const uint32_t deviceListLength); + + int32_t GetDeviceName(const AudioObjectPropertyScope scope, + const uint16_t index, + char* name); + + int32_t InitDevice(uint16_t userDeviceIndex, + AudioDeviceID& deviceId, + bool isInput); + + // Always work with our preferred playout format inside VoE. + // Then convert the output to the OS setting using an AudioConverter. + OSStatus SetDesiredPlayoutFormat(); + + static OSStatus objectListenerProc( + AudioObjectID objectId, + UInt32 numberAddresses, + const AudioObjectPropertyAddress addresses[], + void* clientData); + + OSStatus implObjectListenerProc(AudioObjectID objectId, + UInt32 numberAddresses, + const AudioObjectPropertyAddress addresses[]); + + int32_t HandleDeviceChange(); + + int32_t HandleStreamFormatChange(AudioObjectID objectId, + AudioObjectPropertyAddress propertyAddress); + + int32_t HandleDataSourceChange(AudioObjectID objectId, AudioObjectPropertyAddress propertyAddress); - int32_t - HandleDataSourceChange(AudioObjectID objectId, - AudioObjectPropertyAddress propertyAddress); - - int32_t - HandleProcessorOverload(AudioObjectPropertyAddress propertyAddress); - - static OSStatus deviceIOProc(AudioDeviceID device, - const AudioTimeStamp *now, - const AudioBufferList *inputData, - const AudioTimeStamp *inputTime, - AudioBufferList *outputData, + int32_t HandleProcessorOverload(AudioObjectPropertyAddress propertyAddress); + + static OSStatus deviceIOProc(AudioDeviceID device, + const AudioTimeStamp* now, + const AudioBufferList* inputData, + const AudioTimeStamp* inputTime, + AudioBufferList* outputData, + const AudioTimeStamp* outputTime, + void* clientData); + + static OSStatus outConverterProc( + AudioConverterRef audioConverter, + UInt32* numberDataPackets, + AudioBufferList* data, + AudioStreamPacketDescription** dataPacketDescription, + void* userData); + + static OSStatus inDeviceIOProc(AudioDeviceID device, + const AudioTimeStamp* now, + const AudioBufferList* inputData, + const AudioTimeStamp* inputTime, + AudioBufferList* outputData, const AudioTimeStamp* outputTime, - void *clientData); + void* clientData); - static OSStatus - outConverterProc(AudioConverterRef audioConverter, - UInt32 *numberDataPackets, AudioBufferList *data, - AudioStreamPacketDescription **dataPacketDescription, - void *userData); + static OSStatus inConverterProc( + AudioConverterRef audioConverter, + UInt32* numberDataPackets, + AudioBufferList* data, + AudioStreamPacketDescription** dataPacketDescription, + void* inUserData); - static OSStatus inDeviceIOProc(AudioDeviceID device, - const AudioTimeStamp *now, - const AudioBufferList *inputData, - const AudioTimeStamp *inputTime, - AudioBufferList *outputData, - const AudioTimeStamp *outputTime, - void *clientData); + OSStatus implDeviceIOProc(const AudioBufferList* inputData, + const AudioTimeStamp* inputTime, + AudioBufferList* outputData, + const AudioTimeStamp* outputTime); - static OSStatus - inConverterProc(AudioConverterRef audioConverter, - UInt32 *numberDataPackets, AudioBufferList *data, - AudioStreamPacketDescription **dataPacketDescription, - void *inUserData); + OSStatus implOutConverterProc(UInt32* numberDataPackets, + AudioBufferList* data); - OSStatus implDeviceIOProc(const AudioBufferList *inputData, - const AudioTimeStamp *inputTime, - AudioBufferList *outputData, - const AudioTimeStamp *outputTime); + OSStatus implInDeviceIOProc(const AudioBufferList* inputData, + const AudioTimeStamp* inputTime); - OSStatus implOutConverterProc(UInt32 *numberDataPackets, - AudioBufferList *data); + OSStatus implInConverterProc(UInt32* numberDataPackets, + AudioBufferList* data); - OSStatus implInDeviceIOProc(const AudioBufferList *inputData, - const AudioTimeStamp *inputTime); + static bool RunCapture(void*); + static bool RunRender(void*); + bool CaptureWorkerThread(); + bool RenderWorkerThread(); - OSStatus implInConverterProc(UInt32 *numberDataPackets, - AudioBufferList *data); + bool KeyPressed(); - static bool RunCapture(void*); - static bool RunRender(void*); - bool CaptureWorkerThread(); - bool RenderWorkerThread(); + AudioDeviceBuffer* _ptrAudioBuffer; - bool KeyPressed(); + CriticalSectionWrapper& _critSect; - AudioDeviceBuffer* _ptrAudioBuffer; + EventWrapper& _stopEventRec; + EventWrapper& _stopEvent; - CriticalSectionWrapper& _critSect; + // TODO(pbos): Replace with direct members, just start/stop, no need to + // recreate the thread. + // Only valid/running between calls to StartRecording and StopRecording. + rtc::scoped_ptr<rtc::PlatformThread> capture_worker_thread_; - EventWrapper& _stopEventRec; - EventWrapper& _stopEvent; + // Only valid/running between calls to StartPlayout and StopPlayout. + rtc::scoped_ptr<rtc::PlatformThread> render_worker_thread_; - // Only valid/running between calls to StartRecording and StopRecording. - rtc::scoped_ptr<ThreadWrapper> capture_worker_thread_; + int32_t _id; - // Only valid/running between calls to StartPlayout and StopPlayout. - rtc::scoped_ptr<ThreadWrapper> render_worker_thread_; + AudioMixerManagerMac _mixerManager; - int32_t _id; - - AudioMixerManagerMac _mixerManager; - - uint16_t _inputDeviceIndex; - uint16_t _outputDeviceIndex; - AudioDeviceID _inputDeviceID; - AudioDeviceID _outputDeviceID; + uint16_t _inputDeviceIndex; + uint16_t _outputDeviceIndex; + AudioDeviceID _inputDeviceID; + AudioDeviceID _outputDeviceID; #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 - AudioDeviceIOProcID _inDeviceIOProcID; - AudioDeviceIOProcID _deviceIOProcID; + AudioDeviceIOProcID _inDeviceIOProcID; + AudioDeviceIOProcID _deviceIOProcID; #endif - bool _inputDeviceIsSpecified; - bool _outputDeviceIsSpecified; + bool _inputDeviceIsSpecified; + bool _outputDeviceIsSpecified; + + uint8_t _recChannels; + uint8_t _playChannels; - uint8_t _recChannels; - uint8_t _playChannels; + Float32* _captureBufData; + SInt16* _renderBufData; - Float32* _captureBufData; - SInt16* _renderBufData; + SInt16 _renderConvertData[PLAY_BUF_SIZE_IN_SAMPLES]; - SInt16 _renderConvertData[PLAY_BUF_SIZE_IN_SAMPLES]; + AudioDeviceModule::BufferType _playBufType; - AudioDeviceModule::BufferType _playBufType; + bool _initialized; + bool _isShutDown; + bool _recording; + bool _playing; + bool _recIsInitialized; + bool _playIsInitialized; + bool _AGC; - bool _initialized; - bool _isShutDown; - bool _recording; - bool _playing; - bool _recIsInitialized; - bool _playIsInitialized; - bool _AGC; + // Atomically set varaibles + int32_t _renderDeviceIsAlive; + int32_t _captureDeviceIsAlive; - // Atomically set varaibles - int32_t _renderDeviceIsAlive; - int32_t _captureDeviceIsAlive; + bool _twoDevices; + bool _doStop; // For play if not shared device or play+rec if shared device + bool _doStopRec; // For rec if not shared device + bool _macBookPro; + bool _macBookProPanRight; - bool _twoDevices; - bool _doStop; // For play if not shared device or play+rec if shared device - bool _doStopRec; // For rec if not shared device - bool _macBookPro; - bool _macBookProPanRight; + AudioConverterRef _captureConverter; + AudioConverterRef _renderConverter; - AudioConverterRef _captureConverter; - AudioConverterRef _renderConverter; + AudioStreamBasicDescription _outStreamFormat; + AudioStreamBasicDescription _outDesiredFormat; + AudioStreamBasicDescription _inStreamFormat; + AudioStreamBasicDescription _inDesiredFormat; - AudioStreamBasicDescription _outStreamFormat; - AudioStreamBasicDescription _outDesiredFormat; - AudioStreamBasicDescription _inStreamFormat; - AudioStreamBasicDescription _inDesiredFormat; + uint32_t _captureLatencyUs; + uint32_t _renderLatencyUs; - uint32_t _captureLatencyUs; - uint32_t _renderLatencyUs; + // Atomically set variables + mutable int32_t _captureDelayUs; + mutable int32_t _renderDelayUs; - // Atomically set variables - mutable int32_t _captureDelayUs; - mutable int32_t _renderDelayUs; + int32_t _renderDelayOffsetSamples; - int32_t _renderDelayOffsetSamples; + uint16_t _playBufDelayFixed; // fixed playback delay - uint16_t _playBufDelayFixed; // fixed playback delay + uint16_t _playWarning; + uint16_t _playError; + uint16_t _recWarning; + uint16_t _recError; - uint16_t _playWarning; - uint16_t _playError; - uint16_t _recWarning; - uint16_t _recError; + PaUtilRingBuffer* _paCaptureBuffer; + PaUtilRingBuffer* _paRenderBuffer; - PaUtilRingBuffer* _paCaptureBuffer; - PaUtilRingBuffer* _paRenderBuffer; + semaphore_t _renderSemaphore; + semaphore_t _captureSemaphore; - semaphore_t _renderSemaphore; - semaphore_t _captureSemaphore; + int _captureBufSizeSamples; + int _renderBufSizeSamples; - int _captureBufSizeSamples; - int _renderBufSizeSamples; + // Typing detection + // 0x5c is key "9", after that comes function keys. + bool prev_key_state_[0x5d]; - // Typing detection - // 0x5c is key "9", after that comes function keys. - bool prev_key_state_[0x5d]; + int get_mic_volume_counter_ms_; }; } // namespace webrtc |