audio_low_latency_input_win.h revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation of AudioInputStream for Windows using Windows Core Audio 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WASAPI for low latency capturing. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overview of operation: 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - An object of WASAPIAudioInputStream is created by the AudioManager 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// factory. 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Next some thread will call Open(), at that point the underlying 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Core Audio APIs are utilized to create two WASAPI interfaces called 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// IAudioClient and IAudioCaptureClient. 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// - Then some thread will call Start(sink). 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A thread called "wasapi_capture_thread" is started and this thread listens 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on an event signal which is set periodically by the audio engine for 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// each recorded data packet. As a result, data samples will be provided 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the registered sink. 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - At some point, a thread will call Stop(), which stops and joins the 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// capture thread and at the same time stops audio streaming. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - The same thread that called stop will call Close() where we cleanup 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and notify the audio manager, which likely will destroy this object. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation notes: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The minimum supported client is Windows Vista. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - This implementation is single-threaded, hence: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// o Construction and destruction must take place from the same thread. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// o It is recommended to call all APIs from the same thread as well. 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - It is recommended to first acquire the native sample rate of the default 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// input device and then use the same rate when creating this object. Use 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WASAPIAudioInputStream::HardwareSampleRate() to retrieve the sample rate. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Calling Close() also leads to self destruction. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Core Audio API details: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Utilized MMDevice interfaces: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// o IMMDeviceEnumerator 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// o IMMDevice 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Utilized WASAPI interfaces: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// o IAudioClient 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// o IAudioCaptureClient 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The stream is initialized in shared mode and the processing of the 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// audio buffer is event driven. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The Multimedia Class Scheduler service (MMCSS) is utilized to boost 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the priority of the capture thread. 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Audio applications that use the MMDevice API and WASAPI typically use 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ISimpleAudioVolume interface to manage stream volume levels on a 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// per-session basis. It is also possible to use of the IAudioEndpointVolume 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interface to control the master volume level of an audio endpoint device. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This implementation is using the ISimpleAudioVolume interface. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MSDN states that "In rare cases, a specialized audio application might 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// require the use of the IAudioEndpointVolume". 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_AUDIO_WIN_AUDIO_LOW_LATENCY_INPUT_WIN_H_ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_AUDIO_WIN_AUDIO_LOW_LATENCY_INPUT_WIN_H_ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Audioclient.h> 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <MMDeviceAPI.h> 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/simple_thread.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/scoped_co_mem.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/agc_audio_stream.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_parameters.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioBus; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioManagerWin; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AudioInputStream implementation using Windows Core Audio APIs. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT WASAPIAudioInputStream 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public AgcAudioStream<AudioInputStream>, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::DelegateSimpleThread::Delegate, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NON_EXPORTED_BASE(public base::NonThreadSafe) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ctor takes all the usual parameters, plus |manager| which is the 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the audio manager who is creating this object. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WASAPIAudioInputStream(AudioManagerWin* manager, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AudioParameters& params, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_id); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The dtor is typically called by the AudioManager only and it is usually 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // triggered by calling AudioInputStream::Close(). 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WASAPIAudioInputStream(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implementation of AudioInputStream. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Open() OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(AudioInputCallback* callback) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop() OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close() OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual double GetMaxVolume() OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual double GetVolume() OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool started() const { return started_; } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the default hardware audio parameters of the specific device. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AudioParameters GetInputStreamParameters(const std::string& device_id); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DelegateSimpleThread::Delegate implementation. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Run() OVERRIDE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Issues the OnError() callback to the |sink_|. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleError(HRESULT err); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Open() method is divided into these sub methods. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT SetCaptureDevice(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT ActivateCaptureDevice(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT GetAudioEngineStreamFormat(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DesiredFormatIsSupported(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT InitializeAudioEngine(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieves the stream format that the audio engine uses for its internal 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processing/mixing of shared-mode streams. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |effects| is a an AudioParameters::effects() flag that will have the 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DUCKING flag raised for only the default communication device. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static HRESULT GetMixFormat(const std::string& device_id, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WAVEFORMATEX** device_format, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* effects); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our creator, the audio manager needs to be notified when we close. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioManagerWin* manager_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Capturing is driven by this thread (which has no message loop). 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All OnData() callbacks will be called from this thread. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelegateSimpleThread* capture_thread_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains the desired audio format which is set up at construction. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WAVEFORMATEX format_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool opened_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool started_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size in bytes of each audio frame (4 bytes for 16-bit stereo PCM) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t frame_size_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size in audio frames of each audio packet where an audio packet 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is defined as the block of data which the user received in each 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnData() callback. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t packet_size_frames_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size in bytes of each audio packet. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t packet_size_bytes_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Length of the audio endpoint buffer. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 endpoint_buffer_size_frames_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A copy of the supplied AudioParameter's |effects|. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int effects_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Contains the unique name of the selected endpoint device. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that AudioManagerBase::kDefaultDeviceId represents the default 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // device role and is not a valid ID as such. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string device_id_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversion factor used in delay-estimation calculations. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts a raw performance counter value to 100-nanosecond unit. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double perf_count_to_100ns_units_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversion factor used in delay-estimation calculations. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts from milliseconds to audio frames. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double ms_to_frame_count_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to the object that will receive the recorded audio samples. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioInputCallback* sink_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows Multimedia Device (MMDevice) API interfaces. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An IMMDevice interface which represents an audio endpoint device. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<IMMDevice> endpoint_device_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows Audio Session API (WASAPI) interfaces. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An IAudioClient interface which enables a client to create and initialize 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an audio stream between an audio application and the audio engine. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<IAudioClient> audio_client_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loopback IAudioClient doesn't support event-driven mode, so a separate 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAudioClient is needed to receive notifications when data is available in 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the buffer. For loopback input |audio_client_| is used to receive data, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // while |audio_render_client_for_loopback_| is used to get notifications 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when a new buffer is ready. See comment in InitializeAudioEngine() for 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // details. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<IAudioClient> audio_render_client_for_loopback_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAudioCaptureClient interface enables a client to read input data 199 // from a capture endpoint buffer. 200 base::win::ScopedComPtr<IAudioCaptureClient> audio_capture_client_; 201 202 // The ISimpleAudioVolume interface enables a client to control the 203 // master volume level of an audio session. 204 // The volume-level is a value in the range 0.0 to 1.0. 205 // This interface does only work with shared-mode streams. 206 base::win::ScopedComPtr<ISimpleAudioVolume> simple_audio_volume_; 207 208 // The audio engine will signal this event each time a buffer has been 209 // recorded. 210 base::win::ScopedHandle audio_samples_ready_event_; 211 212 // This event will be signaled when capturing shall stop. 213 base::win::ScopedHandle stop_capture_event_; 214 215 // Extra audio bus used for storage of deinterleaved data for the OnData 216 // callback. 217 scoped_ptr<media::AudioBus> audio_bus_; 218 219 DISALLOW_COPY_AND_ASSIGN(WASAPIAudioInputStream); 220}; 221 222} // namespace media 223 224#endif // MEDIA_AUDIO_WIN_AUDIO_LOW_LATENCY_INPUT_WIN_H_ 225