From: David Fuhrmann Date: Mon, 13 May 2013 18:14:53 +0000 (+0200) Subject: auhal: synchronize access to devices_list X-Git-Tag: 2.1.0-git~280 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d5861971b5dbd3f0e91ef8e3cbf270b9dd4ddb32;p=vlc auhal: synchronize access to devices_list --- diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index c7af12d8c8..fadb5f0c04 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -111,6 +111,7 @@ struct aout_sys_t int i_bytes_per_sample; CFArrayRef device_list; + vlc_mutex_t device_list_lock; float f_volume; bool b_mute; @@ -180,6 +181,7 @@ static int Open(vlc_object_t *obj) OSStatus err = noErr; + vlc_mutex_init(&p_sys->device_list_lock); vlc_mutex_init(&p_sys->lock); vlc_cond_init(&p_sys->cond); p_sys->b_digital = false; @@ -226,6 +228,7 @@ static void Close(vlc_object_t *obj) if (err != noErr) msg_Err(p_aout, "AudioHardwareRemovePropertyListener failed [%4.4s]", (char *)&err); + vlc_mutex_lock(&p_sys->device_list_lock); /* remove streams callbacks */ CFIndex count = CFArrayGetCount(p_sys->device_list); if (count > 0) { @@ -242,10 +245,13 @@ static void Close(vlc_object_t *obj) } } + CFRelease(p_sys->device_list); + vlc_mutex_unlock(&p_sys->device_list_lock); + config_PutPsz(p_aout, "auhal-audio-device", aout_DeviceGet(p_aout)); - CFRelease(p_sys->device_list); + vlc_mutex_destroy(&p_sys->device_list_lock); vlc_mutex_destroy(&p_sys->lock); vlc_cond_destroy(&p_sys->cond); @@ -1186,6 +1192,7 @@ static void RebuildDeviceList(audio_output_t * p_aout) free(psz_name); } + vlc_mutex_lock(&p_sys->device_list_lock); CFIndex count = 0; if (p_sys->device_list) count = CFArrayGetCount(p_sys->device_list); @@ -1211,6 +1218,8 @@ static void RebuildDeviceList(audio_output_t * p_aout) if(!CFArrayContainsValue(p_sys->device_list, CFRangeMake(0, CFArrayGetCount(p_sys->device_list)),CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &p_sys->i_selected_dev))) aout_RestartRequest(p_aout, AOUT_RESTART_OUTPUT); + vlc_mutex_unlock(&p_sys->device_list_lock); + free(deviceIDs); }