vlc | branch: master | David Fuhrmann <[email protected]> | Wed Apr 9 19:01:51 2014 +0200| [591efc8074c79b484799094e7c89825afb3f9402] | committer: David Fuhrmann
auhal: fix detection of disconnected airplay devices > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=591efc8074c79b484799094e7c89825afb3f9402 --- modules/audio_output/auhal.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index edcc6b2..5cec0ad 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -324,18 +324,29 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt) AudioObjectPropertyAddress audioDeviceAliveAddress = { kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; if (p_sys->i_selected_dev > 0) { - /* Check if the desired device is alive and usable */ - i_param_size = sizeof(b_alive); - err = AudioObjectGetPropertyData(p_sys->i_selected_dev, &audioDeviceAliveAddress, 0, NULL, &i_param_size, &b_alive); - if (err != noErr) { - /* Be tolerant, only give a warning here */ - msg_Warn(p_aout, "could not check whether device [0x%x] is alive [%4.4s]", - (unsigned int)p_sys->i_selected_dev, (char *)&err); - b_alive = false; - } - if (!b_alive) - msg_Warn(p_aout, "selected audio device is not alive, switching to default device"); + /* Check if device is in devices list. Only checking for kAudioDevicePropertyDeviceIsAlive is not sufficient, + * as a former airplay device might be already gone, but the device number might be still valid. Core Audio + * even says that this device would be alive. Don't ask why, its Core Audio. */ + CFIndex count = CFArrayGetCount(p_sys->device_list); + if (CFArrayContainsValue(p_sys->device_list, CFRangeMake(0, count), CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &p_sys->i_selected_dev))) { + + /* Check if the desired device is alive and usable */ + i_param_size = sizeof(b_alive); + err = AudioObjectGetPropertyData(p_sys->i_selected_dev, &audioDeviceAliveAddress, 0, NULL, &i_param_size, &b_alive); + if (err != noErr) { + /* Be tolerant, only give a warning here */ + msg_Warn(p_aout, "could not check whether device [0x%x] is alive [%4.4s]", + (unsigned int)p_sys->i_selected_dev, (char *)&err); + b_alive = false; + } + + if (!b_alive) + msg_Warn(p_aout, "selected audio device is not alive, switching to default device"); + + } else { + msg_Warn(p_aout, "device id %i not found in the current devices list, fallback to default device", p_sys->i_selected_dev); + } } p_sys->b_selected_dev_is_default = false; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
