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