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 1150a4d9fd6f704bb113915cb2f773818af5628eeapbos@webrtc.org#ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_ 1250a4d9fd6f704bb113915cb2f773818af5628eeapbos@webrtc.org#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (_MSC_VER >= 1400) // only include for VS 2005 and higher 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/audio_device_generic.h" 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <wmcodecdsp.h> // CLSID_CWMAudioAEC 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // (must be before audioclient.h) 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <Audioclient.h> // WASAPI 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <Audiopolicy.h> 22bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include <Mmdeviceapi.h> // MMDevice 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <avrt.h> // Avrt 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <endpointvolume.h> 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <mediaobj.h> // IMediaObject 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 28bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_refptr.h" 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Use Multimedia Class Scheduler Service (MMCSS) to boost the thread priority 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma comment( lib, "avrt.lib" ) 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// AVRT function pointers 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef BOOL (WINAPI *PAvRevertMmThreadCharacteristics)(HANDLE); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef HANDLE (WINAPI *PAvSetMmThreadCharacteristicsA)(LPCSTR, LPDWORD); 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef BOOL (WINAPI *PAvSetMmThreadPriority)(HANDLE, AVRT_PRIORITY); 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float MAX_CORE_SPEAKER_VOLUME = 255.0f; 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float MIN_CORE_SPEAKER_VOLUME = 0.0f; 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float MAX_CORE_MICROPHONE_VOLUME = 255.0f; 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float MIN_CORE_MICROPHONE_VOLUME = 0.0f; 4364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint16_t CORE_SPEAKER_VOLUME_STEP_SIZE = 1; 4464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.orgconst uint16_t CORE_MICROPHONE_VOLUME_STEP_SIZE = 1; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Utility class which initializes COM in the constructor (STA or MTA), 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// and uninitializes COM in the destructor. 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ScopedCOMInitializer { 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Enum value provided to initialize the thread as an MTA instead of STA. 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enum SelectMTA { kMTA }; 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Constructor for STA initialization. 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ScopedCOMInitializer() { 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Initialize(COINIT_APARTMENTTHREADED); 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Constructor for MTA initialization. 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org explicit ScopedCOMInitializer(SelectMTA mta) { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Initialize(COINIT_MULTITHREADED); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ScopedCOMInitializer::~ScopedCOMInitializer() { 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (SUCCEEDED(hr_)) 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CoUninitialize(); 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool succeeded() const { return SUCCEEDED(hr_); } 698cfa49594feb82a0c1f91d1a661b22cc43ca44ceandrew@webrtc.org 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void Initialize(COINIT init) { 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org hr_ = CoInitializeEx(NULL, init); 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HRESULT hr_; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ScopedCOMInitializer(const ScopedCOMInitializer&); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void operator=(const ScopedCOMInitializer&); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioDeviceWindowsCore : public AudioDeviceGeneric 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 8564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org AudioDeviceWindowsCore(const int32_t id); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~AudioDeviceWindowsCore(); 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static bool CoreAudioIsSupported(); 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Retrieve the currently utilized audio layer 9164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Main initializaton and termination 9464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t Init(); 9564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t Terminate(); 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Initialized() const; 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Device enumeration 9964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int16_t PlayoutDevices(); 10064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int16_t RecordingDevices(); 10164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutDeviceName( 10264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t index, 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char name[kAdmMaxDeviceNameSize], 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char guid[kAdmMaxGuidSize]); 10564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingDeviceName( 10664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t index, 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char name[kAdmMaxDeviceNameSize], 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char guid[kAdmMaxGuidSize]); 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Device selection 11164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutDevice(uint16_t index); 11264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device); 11364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetRecordingDevice(uint16_t index); 11464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetRecordingDevice(AudioDeviceModule::WindowsDeviceType device); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio transport initialization 11764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutIsAvailable(bool& available); 11864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitPlayout(); 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutIsInitialized() const; 12064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingIsAvailable(bool& available); 12164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitRecording(); 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingIsInitialized() const; 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio transport control 12564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StartPlayout(); 12664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StopPlayout(); 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Playing() const; 12864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StartRecording(); 12964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StopRecording(); 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool Recording() const; 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone Automatic Gain Control (AGC) 13364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetAGC(bool enable); 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool AGC() const; 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Volume control based on the Windows Wave API (Windows only) 13764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); 13864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t WaveOutVolume(uint16_t& volumeLeft, uint16_t& volumeRight) const; 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio mixer initialization 14164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitSpeaker(); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool SpeakerIsInitialized() const; 14364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t InitMicrophone(); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool MicrophoneIsInitialized() const; 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Speaker volume controls 14764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolumeIsAvailable(bool& available); 14864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetSpeakerVolume(uint32_t volume); 14964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolume(uint32_t& volume) const; 15064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; 15164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; 15264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone volume controls 15564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolumeIsAvailable(bool& available); 15664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneVolume(uint32_t volume); 15764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolume(uint32_t& volume) const; 15864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; 15964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; 16064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Speaker mute control 16364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerMuteIsAvailable(bool& available); 16464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetSpeakerMute(bool enable); 16564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SpeakerMute(bool& enabled) const; 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone mute control 16864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneMuteIsAvailable(bool& available); 16964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneMute(bool enable); 17064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneMute(bool& enabled) const; 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Microphone boost control 17364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneBoostIsAvailable(bool& available); 17464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetMicrophoneBoost(bool enable); 17564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t MicrophoneBoost(bool& enabled) const; 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stereo support 17864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoPlayoutIsAvailable(bool& available); 17964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetStereoPlayout(bool enable); 18064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoPlayout(bool& enabled) const; 18164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoRecordingIsAvailable(bool& available); 18264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetStereoRecording(bool enable); 18364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t StereoRecording(bool& enabled) const; 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delay information and control 18664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, uint16_t sizeMS); 18764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, uint16_t& sizeMS) const; 18864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t PlayoutDelay(uint16_t& delayMS) const; 18964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t RecordingDelay(uint16_t& delayMS) const; 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // CPU load 19264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org virtual int32_t CPULoad(uint16_t& load) const; 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int32_t EnableBuiltInAEC(bool enable); 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool BuiltInAECIsEnabled() const; 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutWarning() const; 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool PlayoutError() const; 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingWarning() const; 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool RecordingError() const; 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearPlayoutWarning(); 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearPlayoutError(); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearRecordingWarning(); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ClearRecordingError(); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21028832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.orgprivate: 21128832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org bool KeyPressed() const; 21228832e1965ca0c22ca6a26bbd3387db4db640bedniklas.enbom@webrtc.org 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: // avrt function pointers 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PAvRevertMmThreadCharacteristics _PAvRevertMmThreadCharacteristics; 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PAvSetMmThreadCharacteristicsA _PAvSetMmThreadCharacteristicsA; 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PAvSetMmThreadPriority _PAvSetMmThreadPriority; 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HMODULE _avrtLibrary; 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _winSupportAvrt; 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: // thread functions 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD InitCaptureThreadPriority(); 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void RevertCaptureThreadPriority(); 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI WSAPICaptureThread(LPVOID context); 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoCaptureThread(); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI WSAPICaptureThreadPollDMO(LPVOID context); 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoCaptureThreadPollDMO(); 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI WSAPIRenderThread(LPVOID context); 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoRenderThread(); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI GetCaptureVolumeThread(LPVOID context); 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoGetCaptureVolumeThread(); 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static DWORD WINAPI SetCaptureVolumeThread(LPVOID context); 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD DoSetCaptureVolumeThread(); 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void _SetThreadName(DWORD dwThreadID, LPCSTR szThreadName); 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void _Lock() { _critSect.Enter(); }; 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void _UnLock() { _critSect.Leave(); }; 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 24364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t Id() {return _id;} 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int SetDMOProperties(); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int SetBoolProperty(IPropertyStore* ptrPS, 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org REFPROPERTYKEY key, 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VARIANT_BOOL value); 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int SetVtI4Property(IPropertyStore* ptrPS, 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org REFPROPERTYKEY key, 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LONG value); 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _EnumerateEndpointDevicesAll(EDataFlow dataFlow) const; 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void _TraceCOMError(HRESULT hr) const; 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _RefreshDeviceList(EDataFlow dir); 26064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int16_t _DeviceListCount(EDataFlow dir); 26164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDefaultDeviceName(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen); 26264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetListDeviceName(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen); 26364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDeviceName(IMMDevice* pDevice, LPWSTR pszBuffer, int bufferLen); 26464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetListDeviceID(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen); 26564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDefaultDeviceID(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen); 26664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDefaultDeviceIndex(EDataFlow dir, ERole role, int* index); 26764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDeviceID(IMMDevice* pDevice, LPWSTR pszBuffer, int bufferLen); 26864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetDefaultDevice(EDataFlow dir, ERole role, IMMDevice** ppDevice); 26964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _GetListDevice(EDataFlow dir, int index, IMMDevice** ppDevice); 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Converts from wide-char to UTF-8 if UNICODE is defined. 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Does nothing if UNICODE is undefined. 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char* WideToUTF8(const TCHAR* src) const; 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t InitRecordingDMO(); 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ScopedCOMInitializer _comInit; 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceBuffer* _ptrAudioBuffer; 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _critSect; 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _volumeMutex; 28264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _id; 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: // MMDevice 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IMMDeviceEnumerator* _ptrEnumerator; 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IMMDeviceCollection* _ptrRenderCollection; 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IMMDeviceCollection* _ptrCaptureCollection; 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IMMDevice* _ptrDeviceOut; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IMMDevice* _ptrDeviceIn; 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: // WASAPI 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IAudioClient* _ptrClientOut; 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IAudioClient* _ptrClientIn; 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IAudioRenderClient* _ptrRenderClient; 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IAudioCaptureClient* _ptrCaptureClient; 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IAudioEndpointVolume* _ptrCaptureVolume; 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ISimpleAudioVolume* _ptrRenderSimpleVolume; 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // DirectX Media Object (DMO) for the built-in AEC. 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org scoped_refptr<IMediaObject> _dmo; 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org scoped_refptr<IMediaBuffer> _mediaBuffer; 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _builtInAecEnabled; 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hRenderSamplesReadyEvent; 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hPlayThread; 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hRenderStartedEvent; 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hShutdownRenderEvent; 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hCaptureSamplesReadyEvent; 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hRecThread; 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hCaptureStartedEvent; 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hShutdownCaptureEvent; 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hGetCaptureVolumeThread; 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hSetCaptureVolumeThread; 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hSetCaptureVolumeEvent; 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HANDLE _hMmTask; 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UINT _playAudioFrameSize; 32164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _playSampleRate; 32264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _devicePlaySampleRate; 32364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _playBlockSize; 32464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _devicePlayBlockSize; 32564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _playChannels; 32664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _sndCardPlayDelay; 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UINT64 _writtenSamples; 328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LONGLONG _playAcc; 329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UINT _recAudioFrameSize; 33164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _recSampleRate; 33264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _recBlockSize; 33364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _recChannels; 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UINT64 _readSamples; 33564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint32_t _sndCardRecDelay; 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 33764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recChannelsPrioList[2]; 33864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playChannelsPrioList[2]; 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LARGE_INTEGER _perfCounterFreq; 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _perfCounterFactor; 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float _avgCPULoad; 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _initialized; 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _recording; 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _playing; 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _recIsInitialized; 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _playIsInitialized; 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _speakerIsInitialized; 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _microphoneIsInitialized; 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _usingInputDeviceIndex; 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _usingOutputDeviceIndex; 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType _inputDevice; 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::WindowsDeviceType _outputDevice; 35764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _inputDeviceIndex; 35864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _outputDeviceIndex; 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _AGC; 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 36264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playWarning; 36364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playError; 36464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recWarning; 36564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _recError; 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioDeviceModule::BufferType _playBufType; 36864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playBufDelay; 36964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _playBufDelayFixed; 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 37164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org uint16_t _newMicLevel; 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mutable char _str[512]; 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // #if (_MSC_VER >= 1400) 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38050a4d9fd6f704bb113915cb2f773818af5628eeapbos@webrtc.org#endif // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_ 381