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