vlc | branch: master | David Fuhrmann <[email protected]> | Sat Mar 22 14:26:06 2014 +0100| [4f4b79847fa4aae3c0c76f18e0886cf8ce427dc5] | committer: David Fuhrmann
auhal: implement failure for stream format change and fix possible deadlock and crash close #8962 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4f4b79847fa4aae3c0c76f18e0886cf8ce427dc5 --- modules/audio_output/auhal.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index fbe1c1e..a206869 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -1682,9 +1682,11 @@ static OSStatus StreamListener(AudioObjectID inObjectID, UInt32 inNumberAddress for (unsigned int i = 0; i < inNumberAddresses; i++) { if (inAddresses[i].mSelector == kAudioStreamPropertyPhysicalFormat) { + int canc = vlc_savecancel(); vlc_mutex_lock(&w->lock); vlc_cond_signal(&w->cond); vlc_mutex_unlock(&w->lock); + vlc_restorecancel(canc); break; } } @@ -1861,7 +1863,7 @@ static int AudioStreamSupportsDigital(audio_output_t *p_aout, AudioStreamID i_st static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_stream_id, AudioStreamBasicDescription change_format) { OSStatus err = noErr; - int retValue = true; + int retValue = false; AudioObjectPropertyAddress physicalFormatAddress = { kAudioStreamPropertyPhysicalFormat, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; @@ -1893,11 +1895,11 @@ static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_strea /* The AudioStreamSetProperty is not only asynchronious (requiring the locks) * it is also not atomic in its behaviour. - * Therefore we check 5 times before we really give up. - * FIXME: failing isn't actually implemented yet. */ + * Therefore we check 9 times before we really give up. + */ AudioStreamBasicDescription actual_format; UInt32 i_param_size = sizeof(AudioStreamBasicDescription); - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 9; i++) { /* Callback is not always invoked. So first check if format is already set. */ if (i > 0) { mtime_t timeout = mdate() + 500000; @@ -1912,6 +1914,7 @@ static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_strea actual_format.mFormatID == change_format.mFormatID && actual_format.mFramesPerPacket == change_format.mFramesPerPacket) { /* The right format is now active */ + retValue = true; break; } @@ -1919,6 +1922,8 @@ static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_strea } out: + vlc_mutex_unlock(&w.lock); + /* Removing the property listener */ err = AudioObjectRemovePropertyListener(i_stream_id, &physicalFormatAddress, StreamListener, (void *)&w); if (err != noErr) { @@ -1926,8 +1931,6 @@ out: retValue = false; } - /* Destroy the lock and condition */ - vlc_mutex_unlock(&w.lock); vlc_mutex_destroy(&w.lock); vlc_cond_destroy(&w.cond); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
