| Index: media/audio/mac/audio_manager_mac.cc
|
| diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc
|
| index 152375b095641f57fb8abb949de418bd23fe0ba9..f2380cb51cd35579ffdee1761e4557a872127e23 100644
|
| --- a/media/audio/mac/audio_manager_mac.cc
|
| +++ b/media/audio/mac/audio_manager_mac.cc
|
| @@ -5,6 +5,7 @@
|
| #include <CoreAudio/AudioHardware.h>
|
|
|
| #include "base/mac/mac_util.h"
|
| +#include "base/mac/scoped_cftyperef.h"
|
| #include "base/sys_string_conversions.h"
|
| #include "media/audio/fake_audio_input_stream.h"
|
| #include "media/audio/fake_audio_output_stream.h"
|
| @@ -182,6 +183,57 @@ static void GetAudioDeviceInfo(bool is_input,
|
| }
|
| }
|
|
|
| +static AudioDeviceID GetAudioDeviceIdByUId(bool is_input,
|
| + const std::string& device_id) {
|
| + AudioObjectPropertyAddress property_address = {
|
| + kAudioHardwarePropertyDevices,
|
| + kAudioObjectPropertyScopeGlobal,
|
| + kAudioObjectPropertyElementMaster
|
| + };
|
| + AudioDeviceID audio_device_id = kAudioObjectUnknown;
|
| + UInt32 device_size = sizeof(audio_device_id);
|
| + OSStatus result = -1;
|
| +
|
| + if (device_id == AudioManagerBase::kDefaultDeviceId) {
|
| + // Default Device.
|
| + property_address.mSelector = is_input ?
|
| + kAudioHardwarePropertyDefaultInputDevice :
|
| + kAudioHardwarePropertyDefaultOutputDevice;
|
| +
|
| + result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
|
| + &property_address,
|
| + 0,
|
| + 0,
|
| + &device_size,
|
| + &audio_device_id);
|
| + } else {
|
| + // Non-default device.
|
| + base::mac::ScopedCFTypeRef<CFStringRef>
|
| + uid(base::SysUTF8ToCFStringRef(device_id));
|
| + AudioValueTranslation value;
|
| + value.mInputData = &uid;
|
| + value.mInputDataSize = sizeof(CFStringRef);
|
| + value.mOutputData = &audio_device_id;
|
| + value.mOutputDataSize = device_size;
|
| + UInt32 translation_size = sizeof(AudioValueTranslation);
|
| +
|
| + property_address.mSelector = kAudioHardwarePropertyDeviceForUID;
|
| + result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
|
| + &property_address,
|
| + 0,
|
| + 0,
|
| + &translation_size,
|
| + &value);
|
| + }
|
| +
|
| + if (result) {
|
| + DLOG(WARNING) << "Unable to query device " << device_id
|
| + << " for AudioDeviceID ";
|
| + }
|
| +
|
| + return audio_device_id;
|
| +}
|
| +
|
| AudioManagerMac::AudioManagerMac()
|
| : num_output_streams_(0) {
|
| }
|
| @@ -211,7 +263,7 @@ void AudioManagerMac::GetAudioInputDeviceNames(
|
| // counting here since the default device has been abstracted out before.
|
| media::AudioDeviceName name;
|
| name.device_name = AudioManagerBase::kDefaultDeviceName;
|
| - name.unique_id = "0";
|
| + name.unique_id = AudioManagerBase::kDefaultDeviceId;
|
| device_names->push_front(name);
|
| }
|
| }
|
| @@ -242,8 +294,9 @@ AudioOutputStream* AudioManagerMac::MakeAudioOutputStream(
|
| }
|
|
|
| AudioInputStream* AudioManagerMac::MakeAudioInputStream(
|
| - const AudioParameters& params) {
|
| - if (!params.IsValid() || (params.channels > kMaxInputChannels))
|
| + const AudioParameters& params, const std::string& device_id) {
|
| + if (!params.IsValid() || (params.channels > kMaxInputChannels) ||
|
| + device_id.empty())
|
| return NULL;
|
|
|
| if (params.format == AudioParameters::AUDIO_MOCK) {
|
| @@ -251,7 +304,11 @@ AudioInputStream* AudioManagerMac::MakeAudioInputStream(
|
| } else if (params.format == AudioParameters::AUDIO_PCM_LINEAR) {
|
| return new PCMQueueInAudioInputStream(this, params);
|
| } else if (params.format == AudioParameters::AUDIO_PCM_LOW_LATENCY) {
|
| - return new AUAudioInputStream(this, params);
|
| + // Gets the AudioDeviceID that refers to the AudioDevice with the device
|
| + // unique id. This AudioDeviceID is used to set the device for Audio Unit.
|
| + AudioDeviceID audio_device_id = GetAudioDeviceIdByUId(true, device_id);
|
| + if (audio_device_id != kAudioObjectUnknown)
|
| + return new AUAudioInputStream(this, params, audio_device_id);
|
| }
|
| return NULL;
|
| }
|
|
|