1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_WAVE_WIN_H 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_WAVE_WIN_H 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_generic.h" 15bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/win/audio_mixer_manager_win.h" 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma comment( lib, "winmm.lib" ) 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper; 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper; 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t TIMER_PERIOD_MS = 2; 2464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t REC_CHECK_TIME_PERIOD_MS = 4; 2564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint16_t REC_PUT_BACK_DELAY = 4; 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t N_REC_SAMPLES_PER_SEC = 48000; 2864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t N_PLAY_SAMPLES_PER_SEC = 48000; 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t N_REC_CHANNELS = 1; // default is mono recording 3164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t N_PLAY_CHANNELS = 2; // default is stereo playout 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// NOTE - CPU load will not be correct for other sizes than 10ms 3464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t REC_BUF_SIZE_IN_SAMPLES = (N_REC_SAMPLES_PER_SEC/100); 3564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint32_t PLAY_BUF_SIZE_IN_SAMPLES = (N_PLAY_SAMPLES_PER_SEC/100); 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum { N_BUFFERS_IN = 200 }; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum { N_BUFFERS_OUT = 200 }; 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioDeviceWindowsWave : public AudioDeviceGeneric 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 4364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org AudioDeviceWindowsWave(const int32_t id); 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~AudioDeviceWindowsWave(); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Retrieve the currently utilized audio layer 4764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const; 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Main initializaton and termination 5064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t Init(); 5164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t Terminate(); 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Initialized() const; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Device enumeration 5564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int16_t PlayoutDevices(); 5664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int16_t RecordingDevices(); 5764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutDeviceName( 5864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t index, 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char name[kAdmMaxDeviceNameSize], 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char guid[kAdmMaxGuidSize]); 6164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingDeviceName( 6264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t index, 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char name[kAdmMaxDeviceNameSize], 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char guid[kAdmMaxGuidSize]); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Device selection 6764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutDevice(uint16_t index); 6864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device); 6964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetRecordingDevice(uint16_t index); 7064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetRecordingDevice(AudioDeviceModule::WindowsDeviceType device); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio transport initialization 7364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutIsAvailable(bool& available); 7464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitPlayout(); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutIsInitialized() const; 7664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingIsAvailable(bool& available); 7764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitRecording(); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingIsInitialized() const; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio transport control 8164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StartPlayout(); 8264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StopPlayout(); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Playing() const; 8464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StartRecording(); 8564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StopRecording(); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Recording() const; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone Automatic Gain Control (AGC) 8964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetAGC(bool enable); 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool AGC() const; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Volume control based on the Windows Wave API (Windows only) 9364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); 9464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t WaveOutVolume(uint16_t& volumeLeft, uint16_t& volumeRight) const; 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio mixer initialization 9764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitSpeaker(); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool SpeakerIsInitialized() const; 9964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitMicrophone(); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool MicrophoneIsInitialized() const; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Speaker volume controls 10364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolumeIsAvailable(bool& available); 10464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetSpeakerVolume(uint32_t volume); 10564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolume(uint32_t& volume) const; 10664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; 10764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; 10864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone volume controls 11164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolumeIsAvailable(bool& available); 11264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneVolume(uint32_t volume); 11364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolume(uint32_t& volume) const; 11464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; 11564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; 11664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Speaker mute control 11964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerMuteIsAvailable(bool& available); 12064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetSpeakerMute(bool enable); 12164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerMute(bool& enabled) const; 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone mute control 12464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneMuteIsAvailable(bool& available); 12564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneMute(bool enable); 12664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneMute(bool& enabled) const; 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone boost control 12964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneBoostIsAvailable(bool& available); 13064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneBoost(bool enable); 13164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneBoost(bool& enabled) const; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stereo support 13464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoPlayoutIsAvailable(bool& available); 13564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetStereoPlayout(bool enable); 13664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoPlayout(bool& enabled) const; 13764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoRecordingIsAvailable(bool& available); 13864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetStereoRecording(bool enable); 13964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoRecording(bool& enabled) const; 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delay information and control 14264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, uint16_t sizeMS); 14364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, uint16_t& sizeMS) const; 14464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutDelay(uint16_t& delayMS) const; 14564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingDelay(uint16_t& delayMS) const; 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // CPU load 14864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t CPULoad(uint16_t& load) const; 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutWarning() const; 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutError() const; 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingWarning() const; 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingError() const; 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearPlayoutWarning(); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearPlayoutError(); 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearRecordingWarning(); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearRecordingError(); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void Lock() { _critSect.Enter(); }; 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void UnLock() { _critSect.Leave(); }; 16664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t Id() {return _id;} 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool IsUsingOutputDeviceIndex() const {return _usingOutputDeviceIndex;} 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType OutputDevice() const {return _outputDevice;} 16964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t OutputDeviceIndex() const {return _outputDeviceIndex;} 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool IsUsingInputDeviceIndex() const {return _usingInputDeviceIndex;} 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType InputDevice() const {return _inputDevice;} 17264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t InputDeviceIndex() const {return _inputDeviceIndex;} 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 17564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org inline int32_t InputSanityCheckAfterUnlockedPeriod() const; 17664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org inline int32_t OutputSanityCheckAfterUnlockedPeriod() const; 17728832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org 17828832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.orgprivate: 17928832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org bool KeyPressed() const; 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 18264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t EnumeratePlayoutDevices(); 18364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t EnumerateRecordingDevices(); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void TraceSupportFlags(DWORD dwSupport) const; 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void TraceWaveInError(MMRESULT error) const; 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void TraceWaveOutError(MMRESULT error) const; 18764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t PrepareStartRecording(); 18864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t PrepareStartPlayout(); 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t RecProc(LONGLONG& consumedTime); 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int PlayProc(LONGLONG& consumedTime); 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t GetPlayoutBufferDelay(uint32_t& writtenSamples, uint32_t& playedSamples); 19464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t GetRecordingBufferDelay(uint32_t& readSamples, uint32_t& recSamples); 19564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t Write(int8_t* data, uint16_t nSamples); 19664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t GetClockDrift(const uint32_t plSamp, const uint32_t rcSamp); 19764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MonitorRecording(const uint32_t time); 19864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t RestartTimerIfNeeded(const uint32_t time); 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static bool ThreadFunc(void*); 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool ThreadProcess(); 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI GetCaptureVolumeThread(LPVOID context); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoGetCaptureVolumeThread(); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI SetCaptureVolumeThread(LPVOID context); 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoSetCaptureVolumeThread(); 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceBuffer* _ptrAudioBuffer; 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _critSect; 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventWrapper& _timeEvent; 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventWrapper& _recStartEvent; 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventWrapper& _playStartEvent; 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hGetCaptureVolumeThread; 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hShutdownGetVolumeEvent; 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hSetCaptureVolumeThread; 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hShutdownSetVolumeEvent; 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hSetCaptureVolumeEvent; 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ThreadWrapper* _ptrThread; 22564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _threadID; 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _critSectCb; 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _id; 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioMixerManager _mixerManager; 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _usingInputDeviceIndex; 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _usingOutputDeviceIndex; 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType _inputDevice; 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType _outputDevice; 23764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _inputDeviceIndex; 23864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _outputDeviceIndex; 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _inputDeviceIsSpecified; 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _outputDeviceIsSpecified; 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WAVEFORMATEX _waveFormatIn; 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WAVEFORMATEX _waveFormatOut; 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HWAVEIN _hWaveIn; 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HWAVEOUT _hWaveOut; 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WAVEHDR _waveHeaderIn[N_BUFFERS_IN]; 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WAVEHDR _waveHeaderOut[N_BUFFERS_OUT]; 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint8_t _recChannels; 25264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint8_t _playChannels; 25364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recBufCount; 25464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recDelayCount; 25564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recPutBackDelay; 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int8_t _recBuffer[N_BUFFERS_IN][4*REC_BUF_SIZE_IN_SAMPLES]; 25864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int8_t _playBuffer[N_BUFFERS_OUT][4*PLAY_BUF_SIZE_IN_SAMPLES]; 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::BufferType _playBufType; 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _initialized; 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _recording; 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _playing; 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _recIsInitialized; 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _playIsInitialized; 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _startRec; 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _stopRec; 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _startPlay; 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _stopPlay; 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _AGC; 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 27564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _prevPlayTime; 27664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _prevRecTime; 27764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _prevTimerCheckTime; 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playBufCount; // playout buffer index 28064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _dTcheckPlayBufDelay; // dT for check of play buffer, {2,5,10} [ms] 28164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playBufDelay; // playback delay 28264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playBufDelayFixed; // fixed playback delay 28364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _minPlayBufDelay; // minimum playback delay 28464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _MAX_minBuffer; // level of (adaptive) min threshold must be < _MAX_minBuffer 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 28664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _erZeroCounter; // counts "buffer-is-empty" events 28764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _intro; 28864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _waitCounter; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _writtenSamples; 29164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _writtenSamplesOld; 29264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _playedSamplesOld; 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _sndCardPlayDelay; 29564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _sndCardRecDelay; 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _plSampOld; 29864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _rcSampOld; 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 30064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _read_samples; 30164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _read_samples_old; 30264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _rec_samples_old; 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // State that detects driver problems: 30564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _dc_diff_mean; 30664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _dc_y_prev; 30764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _dc_penalty_counter; 30864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _dc_prevtime; 30964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _dc_prevplay; 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _recordedBytes; // accumulated #recorded bytes (reset periodically) 31264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _prevRecByteCheckTime; // time when we last checked the recording process 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // CPU load measurements 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LARGE_INTEGER _perfFreq; 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LONGLONG _playAcc; // accumulated time for playout callback 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float _avgCPULoad; // average total (rec+play) CPU load 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _wrapCounter; 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _useHeader; 32264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int16_t _timesdwBytes; 32364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _no_of_msecleft_warnings; 32464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _writeErrors; 32564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _timerFaults; 32664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _timerRestartAttempts; 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playWarning; 32964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playError; 33064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recWarning; 33164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recError; 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 33364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _newMicLevel; 33464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _minMicVolume; 33564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _maxMicVolume; 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_WAVE_WIN_H 341