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

Unified Diff: media/audio/mac/audio_manager_mac.cc

Issue 8276034: This patch will loop through the soundcard and return a list of available devices when the AudioI... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 9 years, 2 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/mac/audio_manager_mac.cc
===================================================================
--- media/audio/mac/audio_manager_mac.cc (revision 105059)
+++ media/audio/mac/audio_manager_mac.cc (working copy)
@@ -65,6 +65,105 @@
output_device_id != kAudioObjectUnknown;
}
+static std::string CFStringToSTLString(const CFStringRef cfstr)
Chris Rogers 2011/10/19 01:31:50 I think it would be a lot better to avoid creating
no longer working on chromium 2011/10/19 17:32:18 Done. Thanks for pointing out, it has a API calle
+{
scherkus (not reviewing) 2011/10/19 17:38:51 { should go on previous line
no longer working on chromium 2011/10/19 18:13:21 The code has been removed.
+ // The method is currently only for kCFStringEncodingUTF8 encoding.
+ CFIndex buf_len = 1 + CFStringGetMaximumSizeForEncoding(
+ CFStringGetLength(cfstr), kCFStringEncodingUTF8);
+ scoped_array<char> buffer(new char[buf_len]);
+ CFStringGetCString(cfstr, buffer.get(), buf_len, kCFStringEncodingUTF8);
+
+ std::string std_string(buffer.get());
+ return std_string;
+}
+
+static void GetAudioDeviceInfo(
+ bool is_input, media::AudioDeviceNames* device_names) {
scherkus (not reviewing) 2011/10/19 17:38:51 nit: should go on previous line then align paramet
no longer working on chromium 2011/10/19 18:13:21 Done.
+ CFStringRef uid = NULL;
+ CFStringRef name = NULL;
+ int device_number = 0;
Chris Rogers 2011/10/19 01:31:50 "device_count" is probably a better name than "dev
no longer working on chromium 2011/10/19 17:32:18 Done.
+ UInt32 size = 0;
Chris Rogers 2011/10/19 01:31:50 Please move variables to closest point of usage.
no longer working on chromium 2011/10/19 17:32:18 Done.
+
+ device_names->clear();
Chris Rogers 2011/10/19 01:31:50 Just to be careful, probably best to check "device
no longer working on chromium 2011/10/19 17:32:18 Done.
+
+ // Query the number of total devices.
+ OSStatus result = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices,
+ &size,
+ NULL);
+ if (result)
Chris Rogers 2011/10/19 01:31:50 Can make this simpler: if (result || !size) then
no longer working on chromium 2011/10/19 17:32:18 Done.
+ return;
+
+ device_number = size / sizeof(AudioDeviceID);
+ if (!device_number)
+ return;
+
+ // Get the array of device id for each device.
+ scoped_ptr_malloc<AudioDeviceID>
+ devices(reinterpret_cast<AudioDeviceID*>(malloc(size)));
scherkus (not reviewing) 2011/10/19 17:38:51 I'm curious -- is malloc required?
no longer working on chromium 2011/10/19 18:13:21 That is how the apple sample code looks like, I th
+ AudioDeviceID* device_ids = devices.get();
+ result = AudioHardwareGetProperty(kAudioHardwarePropertyDevices,
+ &size,
+ device_ids);
+ if (result)
+ return;
+
+ // Iterate each device to gather information.
+ for(int i = 0; i < device_number; ++i) {
Chris Rogers 2011/10/19 01:31:50 nit: space after "for"
no longer working on chromium 2011/10/19 17:32:18 Done.
+ {
+ int channels = 0;
+ // Get the number of input or output channels of the device, exclude
+ // those devices without any right type of channel.
+ AudioDeviceGetPropertyInfo(device_ids[i],
+ 0,
+ is_input,
+ kAudioDevicePropertyStreamConfiguration,
+ &size,
+ NULL);
+ scoped_ptr_malloc<AudioBufferList>
+ buffer(reinterpret_cast<AudioBufferList*>(malloc(size)));
+ AudioBufferList* buffer_list = buffer.get();
+ AudioDeviceGetProperty(device_ids[i],
+ 0,
+ is_input,
+ kAudioDevicePropertyStreamConfiguration,
+ &size,
+ buffer_list);
+
+ for(uint32 j = 0; j < buffer_list->mNumberBuffers; ++j)
Chris Rogers 2011/10/19 01:31:50 nit: space after "for"
no longer working on chromium 2011/10/19 17:32:18 Done.
+ channels += buffer_list->mBuffers[j].mNumberChannels;
+
+ if (!channels)
+ continue;
+ }
+
+ size = sizeof(uid);
Chris Rogers 2011/10/19 01:31:50 I'd move this line down just below the comment
no longer working on chromium 2011/10/19 17:32:18 Done.
+ // Get device UID.
+ result = AudioDeviceGetProperty(device_ids[i],
+ 0,
+ is_input,
+ kAudioDevicePropertyDeviceUID,
+ &size,
+ &uid);
+ if (result)
+ continue;
+
+ // Get device name.
+ result = AudioDeviceGetProperty(device_ids[i],
+ 0,
+ is_input,
+ kAudioObjectPropertyName,
+ &size,
+ &name);
+ if (result)
+ continue;
+
+ media::AudioDeviceName device_name;
+ device_name.device_name = CFStringToSTLString(name);
+ device_name.unique_id = CFStringToSTLString(uid);
+ device_names->push_back(device_name);
+ }
+}
+
AudioManagerMac::AudioManagerMac()
: num_output_streams_(0) {
}
@@ -82,15 +181,15 @@
void AudioManagerMac::GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) {
- // TODO(xians): query a full list of valid devices.
- if (HasAudioInputDevices()) {
+ GetAudioDeviceInfo(true, device_names);
+ if (!device_names->empty()) {
// Add the default device to the list.
// We use index 0 to make up the unique_id to identify the
// default devices.
media::AudioDeviceName name;
name.device_name = AudioManagerBase::kDefaultDeviceName;
name.unique_id = "0";
- device_names->push_back(name);
+ device_names->push_front(name);
Chris Rogers 2011/10/19 01:31:50 Probably worth a comment to describe why you're pu
no longer working on chromium 2011/10/19 17:32:18 Done.
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698