diff options
author | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-10 12:33:06 +0000 |
---|---|---|
committer | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-10 12:33:06 +0000 |
commit | ddf6954d0f8f5dac0cfedf2e67600e1226004a6b (patch) | |
tree | a2bdfe790e11f4734e50d5032e52ab95d4641536 /media/audio | |
parent | e718f79ace495a9daecf2c561d8bebee30a0e675 (diff) | |
download | chromium_src-ddf6954d0f8f5dac0cfedf2e67600e1226004a6b.zip chromium_src-ddf6954d0f8f5dac0cfedf2e67600e1226004a6b.tar.gz chromium_src-ddf6954d0f8f5dac0cfedf2e67600e1226004a6b.tar.bz2 |
M23 shows lots of crahses with AudioManagerMac::GetAudioInputDeviceNames.
Most of the crashes happened when the devices were being unplugged in audio_manager_mac.cc line 132 AudioObjectGetPropertyDataSize(), and some crashes happened in HasAudioInputDevices().
This Cl uses another way to query the input devices, hopefully it fixes the issue.
BUG=153411
TEST=media_unittests
Review URL: https://chromiumcodereview.appspot.com/11087045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@161096 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/audio_input_device_unittest.cc | 19 | ||||
-rw-r--r-- | media/audio/mac/audio_manager_mac.cc | 30 |
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 |