summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/audio/audio_input_device_unittest.cc19
-rw-r--r--media/audio/mac/audio_manager_mac.cc30
2 files changed, 22 insertions, 27 deletions
diff --git a/media/audio/audio_input_device_unittest.cc b/media/audio/audio_input_device_unittest.cc
index 8b3c3e5..6eb6dfb 100644
--- a/media/audio/audio_input_device_unittest.cc
+++ b/media/audio/audio_input_device_unittest.cc
@@ -91,6 +91,10 @@ class AudioInputDeviceTest
}
}
+ bool CanRunAudioTest() {
+ return audio_manager_->HasAudioInputDevices();
+ }
+
scoped_ptr<AudioManager> audio_manager_;
#if defined(OS_WIN)
@@ -101,6 +105,9 @@ class AudioInputDeviceTest
// Test that devices can be enumerated.
TEST_F(AudioInputDeviceTest, EnumerateDevices) {
+ if (!CanRunAudioTest())
+ return;
+
AudioDeviceNames device_names;
audio_manager_->GetAudioInputDeviceNames(&device_names);
CheckDeviceNames(device_names);
@@ -114,6 +121,9 @@ TEST_F(AudioInputDeviceTest, EnumerateDevices) {
// Override default enumeration API and force usage of Windows MMDevice.
// This test will only run on Windows Vista and higher.
TEST_F(AudioInputDeviceTest, EnumerateDevicesWinMMDevice) {
+ if (!CanRunAudioTest())
+ return;
+
AudioDeviceNames device_names;
if (!SetMMDeviceEnumeration()) {
// Usage of MMDevice will fail on XP and lower.
@@ -127,6 +137,9 @@ TEST_F(AudioInputDeviceTest, EnumerateDevicesWinMMDevice) {
// Override default enumeration API and force usage of Windows Wave.
// This test will run on Windows XP, Windows Vista and Windows 7.
TEST_F(AudioInputDeviceTest, EnumerateDevicesWinWave) {
+ if (!CanRunAudioTest())
+ return;
+
AudioDeviceNames device_names;
SetWaveEnumeration();
audio_manager_->GetAudioInputDeviceNames(&device_names);
@@ -134,6 +147,9 @@ TEST_F(AudioInputDeviceTest, EnumerateDevicesWinWave) {
}
TEST_F(AudioInputDeviceTest, WinXPDeviceIdUnchanged) {
+ if (!CanRunAudioTest())
+ return;
+
AudioDeviceNames xp_device_names;
SetWaveEnumeration();
audio_manager_->GetAudioInputDeviceNames(&xp_device_names);
@@ -148,6 +164,9 @@ TEST_F(AudioInputDeviceTest, WinXPDeviceIdUnchanged) {
}
TEST_F(AudioInputDeviceTest, ConvertToWinXPDeviceId) {
+ if (!CanRunAudioTest())
+ return;
+
if (!SetMMDeviceEnumeration()) {
// Usage of MMDevice will fail on XP and lower.
LOG(WARNING) << "MM device enumeration is not supported.";
diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc
index edf59930..a056283 100644
--- a/media/audio/mac/audio_manager_mac.cc
+++ b/media/audio/mac/audio_manager_mac.cc
@@ -120,36 +120,17 @@ static void GetAudioDeviceInfo(bool is_input,
// Iterate over all available devices to gather information.
for (int i = 0; i < device_count; ++i) {
- int channels = 0;
// Get the number of input or output channels of the device.
property_address.mScope = is_input ?
kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
- property_address.mSelector = kAudioDevicePropertyStreamConfiguration;
+ property_address.mSelector = kAudioDevicePropertyStreams;
+ size = 0;
result = AudioObjectGetPropertyDataSize(device_ids[i],
&property_address,
0,
NULL,
&size);
- if (result)
- continue;
-
- scoped_ptr_malloc<AudioBufferList>
- buffer(reinterpret_cast<AudioBufferList*>(malloc(size)));
- AudioBufferList* buffer_list = buffer.get();
- result = AudioObjectGetPropertyData(device_ids[i],
- &property_address,
- 0,
- NULL,
- &size,
- buffer_list);
- if (result)
- continue;
-
- for (uint32 j = 0; j < buffer_list->mNumberBuffers; ++j)
- channels += buffer_list->mBuffers[j].mNumberChannels;
-
- // Exclude those devices without the type of channel we are interested in.
- if (!channels)
+ if (result || !size)
continue;
// Get device UID.
@@ -267,11 +248,6 @@ bool AudioManagerMac::HasAudioInputDevices() {
void AudioManagerMac::GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) {
- // This is needed because AudioObjectGetPropertyDataSize has memory leak
- // when there is no soundcard in the machine.
- if (!HasAudioInputDevices())
- return;
-
GetAudioDeviceInfo(true, device_names);
if (!device_names->empty()) {
// Prepend the default device to the list since we always want it to be