Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(761)

Side by Side Diff: media/audio/mac/audio_manager_mac.cc

Issue 8491044: Link things together and enable the device selection for linux and mac. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: update Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include <CoreAudio/AudioHardware.h> 5 #include <CoreAudio/AudioHardware.h>
6 6
7 #include "base/mac/mac_util.h" 7 #include "base/mac/mac_util.h"
8 #include "base/mac/scoped_cftyperef.h"
8 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
9 #include "media/audio/fake_audio_input_stream.h" 10 #include "media/audio/fake_audio_input_stream.h"
10 #include "media/audio/fake_audio_output_stream.h" 11 #include "media/audio/fake_audio_output_stream.h"
11 #include "media/audio/mac/audio_input_mac.h" 12 #include "media/audio/mac/audio_input_mac.h"
12 #include "media/audio/mac/audio_low_latency_input_mac.h" 13 #include "media/audio/mac/audio_low_latency_input_mac.h"
13 #include "media/audio/mac/audio_low_latency_output_mac.h" 14 #include "media/audio/mac/audio_low_latency_output_mac.h"
14 #include "media/audio/mac/audio_manager_mac.h" 15 #include "media/audio/mac/audio_manager_mac.h"
15 #include "media/audio/mac/audio_output_mac.h" 16 #include "media/audio/mac/audio_output_mac.h"
16 #include "media/base/limits.h" 17 #include "media/base/limits.h"
17 18
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 // We are responsible for releasing the returned CFObject. See the 176 // We are responsible for releasing the returned CFObject. See the
176 // comment in the AudioHardware.h for constant 177 // comment in the AudioHardware.h for constant
177 // kAudioDevicePropertyDeviceUID. 178 // kAudioDevicePropertyDeviceUID.
178 if (uid) 179 if (uid)
179 CFRelease(uid); 180 CFRelease(uid);
180 if (name) 181 if (name)
181 CFRelease(name); 182 CFRelease(name);
182 } 183 }
183 } 184 }
184 185
186 static AudioDeviceID GetAudioDeviceIdByUId(bool is_input,
187 const std::string& device_uid) {
188 AudioObjectPropertyAddress property_address = {
189 kAudioHardwarePropertyDevices,
190 kAudioObjectPropertyScopeGlobal,
191 kAudioObjectPropertyElementMaster
192 };
193 AudioDeviceID audio_device_id = kAudioObjectUnknown;
194 UInt32 device_size = sizeof(audio_device_id);
195 OSStatus result = -1;
196
197 if (device_id == AudioManagerBase::kDefaultDeviceId) {
198 // Default Device.
199 if (is_input)
200 property_address.mSelector = kAudioHardwarePropertyDefaultInputDevice;
tommi (sloooow) - chröme 2011/11/17 10:24:16 nit: instead of if/else for this kind of initializ
no longer working on chromium 2011/11/17 14:15:26 Done.
201 else
202 property_address.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
203
204 result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
205 &property_address,
206 0,
207 0,
208 &device_size,
209 &audio_device_id);
210 } else { // Non-default device.
henrika (OOO until Aug 14) 2011/11/17 11:26:15 comment on separate line
no longer working on chromium 2011/11/17 14:15:26 Done.
211 base::mac::ScopedCFTypeRef<CFStringRef>
212 uid(base::SysUTF8ToCFStringRef(device_uid));
213 AudioValueTranslation value;
214 value.mInputData = &uid;
215 value.mInputDataSize = sizeof(CFStringRef);
216 value.mOutputData = &audio_device_id;
217 value.mOutputDataSize = device_size;
218 UInt32 translation_size = sizeof(AudioValueTranslation);
219
220 property_address.mSelector = kAudioHardwarePropertyDeviceForUID;
221 result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
222 &property_address,
223 0, //translation_size,
tommi (sloooow) - chröme 2011/11/17 10:24:16 are you going to remove these comments?
no longer working on chromium 2011/11/17 14:15:26 Done.
224 0, //&value,
225 &translation_size,
226 &value);
227 }
228
229 if (result)
230 DLOG(WARNING) << "Unable to query device " << device_id
231 << " for AudioDeviceID ";
tommi (sloooow) - chröme 2011/11/17 10:24:16 use {} when the body spans more than one line.
no longer working on chromium 2011/11/17 14:15:26 Done.
232
233 return audio_device_id;
234 }
235
185 AudioManagerMac::AudioManagerMac() 236 AudioManagerMac::AudioManagerMac()
186 : num_output_streams_(0) { 237 : num_output_streams_(0) {
187 } 238 }
188 239
189 AudioManagerMac::~AudioManagerMac() { 240 AudioManagerMac::~AudioManagerMac() {
190 } 241 }
191 242
192 bool AudioManagerMac::HasAudioOutputDevices() { 243 bool AudioManagerMac::HasAudioOutputDevices() {
193 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice); 244 return HasAudioHardware(kAudioHardwarePropertyDefaultOutputDevice);
194 } 245 }
195 246
196 bool AudioManagerMac::HasAudioInputDevices() { 247 bool AudioManagerMac::HasAudioInputDevices() {
197 return HasAudioHardware(kAudioHardwarePropertyDefaultInputDevice); 248 return HasAudioHardware(kAudioHardwarePropertyDefaultInputDevice);
198 } 249 }
199 250
200 void AudioManagerMac::GetAudioInputDeviceNames( 251 void AudioManagerMac::GetAudioInputDeviceNames(
201 media::AudioDeviceNames* device_names) { 252 media::AudioDeviceNames* device_names) {
202 // This is needed because AudioObjectGetPropertyDataSize has memory leak 253 // This is needed because AudioObjectGetPropertyDataSize has memory leak
203 // when there is no soundcard in the machine. 254 // when there is no soundcard in the machine.
204 if (!HasAudioInputDevices()) 255 if (!HasAudioInputDevices())
205 return; 256 return;
206 257
207 GetAudioDeviceInfo(true, device_names); 258 GetAudioDeviceInfo(true, device_names);
208 if (!device_names->empty()) { 259 if (!device_names->empty()) {
209 // Prepend the default device to the list since we always want it to be 260 // Prepend the default device to the list since we always want it to be
210 // on the top of the list for all platforms. There is no duplicate 261 // on the top of the list for all platforms. There is no duplicate
211 // counting here since the default device has been abstracted out before. 262 // counting here since the default device has been abstracted out before.
212 media::AudioDeviceName name; 263 media::AudioDeviceName name;
213 name.device_name = AudioManagerBase::kDefaultDeviceName; 264 name.device_name = AudioManagerBase::kDefaultDeviceName;
214 name.unique_id = "0"; 265 name.unique_id = AudioManagerBase::kDefaultDeviceId;
215 device_names->push_front(name); 266 device_names->push_front(name);
216 } 267 }
217 } 268 }
218 269
219 AudioOutputStream* AudioManagerMac::MakeAudioOutputStream( 270 AudioOutputStream* AudioManagerMac::MakeAudioOutputStream(
220 const AudioParameters& params) { 271 const AudioParameters& params) {
221 if (!params.IsValid()) 272 if (!params.IsValid())
222 return NULL; 273 return NULL;
223 274
224 // Limit the number of audio streams opened. This is to prevent using 275 // Limit the number of audio streams opened. This is to prevent using
(...skipping 10 matching lines...) Expand all
235 num_output_streams_++; 286 num_output_streams_++;
236 return new PCMQueueOutAudioOutputStream(this, params); 287 return new PCMQueueOutAudioOutputStream(this, params);
237 } else if (params.format == AudioParameters::AUDIO_PCM_LOW_LATENCY) { 288 } else if (params.format == AudioParameters::AUDIO_PCM_LOW_LATENCY) {
238 num_output_streams_++; 289 num_output_streams_++;
239 return new AUAudioOutputStream(this, params); 290 return new AUAudioOutputStream(this, params);
240 } 291 }
241 return NULL; 292 return NULL;
242 } 293 }
243 294
244 AudioInputStream* AudioManagerMac::MakeAudioInputStream( 295 AudioInputStream* AudioManagerMac::MakeAudioInputStream(
245 const AudioParameters& params) { 296 const AudioParameters& params, const std::string& device_id) {
246 if (!params.IsValid() || (params.channels > kMaxInputChannels)) 297 if (!params.IsValid() || (params.channels > kMaxInputChannels))
247 return NULL; 298 return NULL;
248 299
249 if (params.format == AudioParameters::AUDIO_MOCK) { 300 if (params.format == AudioParameters::AUDIO_MOCK) {
250 return FakeAudioInputStream::MakeFakeStream(params); 301 return FakeAudioInputStream::MakeFakeStream(params);
251 } else if (params.format == AudioParameters::AUDIO_PCM_LINEAR) { 302 } else if (params.format == AudioParameters::AUDIO_PCM_LINEAR) {
252 return new PCMQueueInAudioInputStream(this, params); 303 return new PCMQueueInAudioInputStream(this, params);
253 } else if (params.format == AudioParameters::AUDIO_PCM_LOW_LATENCY) { 304 } else if (params.format == AudioParameters::AUDIO_PCM_LOW_LATENCY) {
254 return new AUAudioInputStream(this, params); 305 AudioDeviceID audio_device_id = GetAudioDeviceIdByUId(true, device_id);
henrika (OOO until Aug 14) 2011/11/17 11:26:15 Lots of IDs here.. At lest add a comment explainin
no longer working on chromium 2011/11/17 14:15:26 Done.
306 if (audio_device_id != kAudioObjectUnknown)
307 return new AUAudioInputStream(this, params, audio_device_id);
255 } 308 }
256 return NULL; 309 return NULL;
257 } 310 }
258 311
259 void AudioManagerMac::MuteAll() { 312 void AudioManagerMac::MuteAll() {
260 // TODO(cpu): implement. 313 // TODO(cpu): implement.
261 } 314 }
262 315
263 void AudioManagerMac::UnMuteAll() { 316 void AudioManagerMac::UnMuteAll() {
264 // TODO(cpu): implement. 317 // TODO(cpu): implement.
265 } 318 }
266 319
267 // Called by the stream when it has been released by calling Close(). 320 // Called by the stream when it has been released by calling Close().
268 void AudioManagerMac::ReleaseOutputStream(AudioOutputStream* stream) { 321 void AudioManagerMac::ReleaseOutputStream(AudioOutputStream* stream) {
269 DCHECK(stream); 322 DCHECK(stream);
270 num_output_streams_--; 323 num_output_streams_--;
271 delete stream; 324 delete stream;
272 } 325 }
273 326
274 // Called by the stream when it has been released by calling Close(). 327 // Called by the stream when it has been released by calling Close().
275 void AudioManagerMac::ReleaseInputStream(AudioInputStream* stream) { 328 void AudioManagerMac::ReleaseInputStream(AudioInputStream* stream) {
276 delete stream; 329 delete stream;
277 } 330 }
278 331
279 // static 332 // static
280 AudioManager* AudioManager::CreateAudioManager() { 333 AudioManager* AudioManager::CreateAudioManager() {
281 return new AudioManagerMac(); 334 return new AudioManagerMac();
282 } 335 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698