]> git.sesse.net Git - vlc/commitdiff
auhal: do an early check for the stream format set
authorDavid Fuhrmann <david.fuhrmann@googlemail.com>
Sun, 23 Feb 2014 22:55:14 +0000 (23:55 +0100)
committerDavid Fuhrmann <david.fuhrmann@googlemail.com>
Mon, 24 Feb 2014 14:08:14 +0000 (15:08 +0100)
This prevents waiting for the timeout in some situations, especially
if the format was already set to the new value before.

modules/audio_output/auhal.c

index 3ab1aa04e0dc0c1438766489ae6cfea39a2ef0d7..2c3ceb8160b6cf5b485b321520f3d672d1175db3 100644 (file)
@@ -1725,9 +1725,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;
-    UInt32              i_param_size = 0;
-
+    OSStatus err = noErr;
     int retValue = true;
 
     AudioObjectPropertyAddress physicalFormatAddress = { kAudioStreamPropertyPhysicalFormat, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
@@ -1762,14 +1760,10 @@ static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_strea
      * 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. */
+    AudioStreamBasicDescription actual_format;
+    UInt32 i_param_size = sizeof(AudioStreamBasicDescription);
     for (int i = 0; i < 5; i++) {
-        AudioStreamBasicDescription actual_format;
-        mtime_t timeout = mdate() + 500000;
-
-        if (vlc_cond_timedwait(&w.cond, &w.lock, timeout))
-            msg_Dbg(p_aout, "reached timeout");
-
-        i_param_size = sizeof(AudioStreamBasicDescription);
+        /* Callback is not always invoked. So first check if format is already set. */
         err = AudioObjectGetPropertyData(i_stream_id, &physicalFormatAddress, 0, NULL, &i_param_size, &actual_format);
 
         msg_Dbg(p_aout, STREAM_FORMAT_MSG("actual format in use: ", actual_format));
@@ -1779,7 +1773,11 @@ static int AudioStreamChangeFormat(audio_output_t *p_aout, AudioStreamID i_strea
             /* The right format is now active */
             break;
         }
+
         /* We need to check again */
+        mtime_t timeout = mdate() + 500000;
+        if (vlc_cond_timedwait(&w.cond, &w.lock, timeout))
+            msg_Dbg(p_aout, "reached timeout");
     }
 
 out: