OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Implementation of AudioInputStream for Windows using Windows Core Audio | 5 // Implementation of AudioInputStream for Windows using Windows Core Audio |
6 // WASAPI for low latency capturing. | 6 // WASAPI for low latency capturing. |
7 // | 7 // |
8 // Overview of operation: | 8 // Overview of operation: |
9 // | 9 // |
10 // - An object of WASAPIAudioInputStream is created by the AudioManager | 10 // - An object of WASAPIAudioInputStream is created by the AudioManager |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 class MEDIA_EXPORT WASAPIAudioInputStream | 81 class MEDIA_EXPORT WASAPIAudioInputStream |
82 : public AgcAudioStream<AudioInputStream>, | 82 : public AgcAudioStream<AudioInputStream>, |
83 public base::DelegateSimpleThread::Delegate, | 83 public base::DelegateSimpleThread::Delegate, |
84 NON_EXPORTED_BASE(public base::NonThreadSafe) { | 84 NON_EXPORTED_BASE(public base::NonThreadSafe) { |
85 public: | 85 public: |
86 // The ctor takes all the usual parameters, plus |manager| which is the | 86 // The ctor takes all the usual parameters, plus |manager| which is the |
87 // the audio manager who is creating this object. | 87 // the audio manager who is creating this object. |
88 WASAPIAudioInputStream(AudioManagerWin* manager, | 88 WASAPIAudioInputStream(AudioManagerWin* manager, |
89 const AudioParameters& params, | 89 const AudioParameters& params, |
90 const std::string& device_id); | 90 const std::string& device_id); |
| 91 |
91 // The dtor is typically called by the AudioManager only and it is usually | 92 // The dtor is typically called by the AudioManager only and it is usually |
92 // triggered by calling AudioInputStream::Close(). | 93 // triggered by calling AudioInputStream::Close(). |
93 virtual ~WASAPIAudioInputStream(); | 94 virtual ~WASAPIAudioInputStream(); |
94 | 95 |
95 // Implementation of AudioInputStream. | 96 // Implementation of AudioInputStream. |
96 virtual bool Open() OVERRIDE; | 97 virtual bool Open() OVERRIDE; |
97 virtual void Start(AudioInputCallback* callback) OVERRIDE; | 98 virtual void Start(AudioInputCallback* callback) OVERRIDE; |
98 virtual void Stop() OVERRIDE; | 99 virtual void Stop() OVERRIDE; |
99 virtual void Close() OVERRIDE; | 100 virtual void Close() OVERRIDE; |
100 virtual double GetMaxVolume() OVERRIDE; | 101 virtual double GetMaxVolume() OVERRIDE; |
101 virtual void SetVolume(double volume) OVERRIDE; | 102 virtual void SetVolume(double volume) OVERRIDE; |
102 virtual double GetVolume() OVERRIDE; | 103 virtual double GetVolume() OVERRIDE; |
103 | 104 |
104 // Retrieves the sample rate used by the audio engine for its internal | 105 bool started() const { return started_; } |
105 // processing/mixing of shared-mode streams given a specifed device. | |
106 static int HardwareSampleRate(const std::string& device_id); | |
107 | 106 |
108 // Retrieves the number of audio channels used by the audio engine for its | 107 // Returns the default hardware audio parameters of the specific device. |
109 // internal processing/mixing of shared-mode streams given a specified device. | 108 static AudioParameters GetInputStreamParameters(const std::string& device_id); |
110 static uint32 HardwareChannelCount(const std::string& device_id); | |
111 | |
112 bool started() const { return started_; } | |
113 | 109 |
114 private: | 110 private: |
115 // DelegateSimpleThread::Delegate implementation. | 111 // DelegateSimpleThread::Delegate implementation. |
116 virtual void Run() OVERRIDE; | 112 virtual void Run() OVERRIDE; |
117 | 113 |
118 // Issues the OnError() callback to the |sink_|. | 114 // Issues the OnError() callback to the |sink_|. |
119 void HandleError(HRESULT err); | 115 void HandleError(HRESULT err); |
120 | 116 |
121 // The Open() method is divided into these sub methods. | 117 // The Open() method is divided into these sub methods. |
122 HRESULT SetCaptureDevice(); | 118 HRESULT SetCaptureDevice(); |
(...skipping 27 matching lines...) Expand all Loading... |
150 // is defined as the block of data which the user received in each | 146 // is defined as the block of data which the user received in each |
151 // OnData() callback. | 147 // OnData() callback. |
152 size_t packet_size_frames_; | 148 size_t packet_size_frames_; |
153 | 149 |
154 // Size in bytes of each audio packet. | 150 // Size in bytes of each audio packet. |
155 size_t packet_size_bytes_; | 151 size_t packet_size_bytes_; |
156 | 152 |
157 // Length of the audio endpoint buffer. | 153 // Length of the audio endpoint buffer. |
158 uint32 endpoint_buffer_size_frames_; | 154 uint32 endpoint_buffer_size_frames_; |
159 | 155 |
| 156 // A copy of the supplied AudioParameter's |effects|. |
| 157 const int effects_; |
| 158 |
160 // Contains the unique name of the selected endpoint device. | 159 // Contains the unique name of the selected endpoint device. |
161 // Note that AudioManagerBase::kDefaultDeviceId represents the default | 160 // Note that AudioManagerBase::kDefaultDeviceId represents the default |
162 // device role and is not a valid ID as such. | 161 // device role and is not a valid ID as such. |
163 std::string device_id_; | 162 std::string device_id_; |
164 | 163 |
165 // Conversion factor used in delay-estimation calculations. | 164 // Conversion factor used in delay-estimation calculations. |
166 // Converts a raw performance counter value to 100-nanosecond unit. | 165 // Converts a raw performance counter value to 100-nanosecond unit. |
167 double perf_count_to_100ns_units_; | 166 double perf_count_to_100ns_units_; |
168 | 167 |
169 // Conversion factor used in delay-estimation calculations. | 168 // Conversion factor used in delay-estimation calculations. |
170 // Converts from milliseconds to audio frames. | 169 // Converts from milliseconds to audio frames. |
171 double ms_to_frame_count_; | 170 double ms_to_frame_count_; |
172 | 171 |
173 // Pointer to the object that will receive the recorded audio samples. | 172 // Pointer to the object that will receive the recorded audio samples. |
174 AudioInputCallback* sink_; | 173 AudioInputCallback* sink_; |
175 | 174 |
176 // Windows Multimedia Device (MMDevice) API interfaces. | 175 // Windows Multimedia Device (MMDevice) API interfaces. |
177 | 176 |
178 // An IMMDevice interface which represents an audio endpoint device. | 177 // An IMMDevice interface which represents an audio endpoint device. |
179 base::win::ScopedComPtr<IMMDevice> endpoint_device_; | 178 base::win::ScopedComPtr<IMMDevice> endpoint_device_; |
180 | 179 |
181 // Windows Audio Session API (WASAP) interfaces. | 180 // Windows Audio Session API (WASAPI) interfaces. |
182 | 181 |
183 // An IAudioClient interface which enables a client to create and initialize | 182 // An IAudioClient interface which enables a client to create and initialize |
184 // an audio stream between an audio application and the audio engine. | 183 // an audio stream between an audio application and the audio engine. |
185 base::win::ScopedComPtr<IAudioClient> audio_client_; | 184 base::win::ScopedComPtr<IAudioClient> audio_client_; |
186 | 185 |
187 // Loopback IAudioClient doesn't support event-driven mode, so a separate | 186 // Loopback IAudioClient doesn't support event-driven mode, so a separate |
188 // IAudioClient is needed to receive notifications when data is available in | 187 // IAudioClient is needed to receive notifications when data is available in |
189 // the buffer. For loopback input |audio_client_| is used to receive data, | 188 // the buffer. For loopback input |audio_client_| is used to receive data, |
190 // while |audio_render_client_for_loopback_| is used to get notifications | 189 // while |audio_render_client_for_loopback_| is used to get notifications |
191 // when a new buffer is ready. See comment in InitializeAudioEngine() for | 190 // when a new buffer is ready. See comment in InitializeAudioEngine() for |
(...skipping 16 matching lines...) Expand all Loading... |
208 | 207 |
209 // This event will be signaled when capturing shall stop. | 208 // This event will be signaled when capturing shall stop. |
210 base::win::ScopedHandle stop_capture_event_; | 209 base::win::ScopedHandle stop_capture_event_; |
211 | 210 |
212 DISALLOW_COPY_AND_ASSIGN(WASAPIAudioInputStream); | 211 DISALLOW_COPY_AND_ASSIGN(WASAPIAudioInputStream); |
213 }; | 212 }; |
214 | 213 |
215 } // namespace media | 214 } // namespace media |
216 | 215 |
217 #endif // MEDIA_AUDIO_WIN_AUDIO_LOW_LATENCY_INPUT_WIN_H_ | 216 #endif // MEDIA_AUDIO_WIN_AUDIO_LOW_LATENCY_INPUT_WIN_H_ |
OLD | NEW |