]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/auhal.c
fingerprinter: fix dist
[vlc] / modules / audio_output / auhal.c
index d7d6b584e651abfa53cec1448fb17e54b64a9b85..b520dc61b273a7cad70e7a5e8aaf811607b607a3 100644 (file)
@@ -233,6 +233,8 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
      * property size */
     int                     b_alive = false;
 
+    bool                    b_start_digital = false;
+
     p_sys = p_aout->sys;
     p_sys->b_digital = false;
     p_sys->au_component = NULL;
@@ -247,9 +249,6 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
 
     aout_FormatPrint(p_aout, "VLC is looking for:", fmt);
 
-    if (p_sys->b_selected_dev_is_digital)
-        msg_Dbg(p_aout, "audio device supports digital output");
-
     msg_Dbg(p_aout, "attempting to use device %i", p_sys->i_selected_dev);
 
     /* Check if the desired device is alive and usable */
@@ -267,10 +266,19 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
     }
 
     if (!b_alive) {
-        msg_Warn(p_aout, "selected audio device is not alive, switching to default device");
+        msg_Warn(p_aout, "selected audio device is not alive, switching to default device with id %i", p_sys->i_default_dev);
         p_sys->i_selected_dev = p_sys->i_default_dev;
+        p_sys->b_selected_dev_is_digital = false;
     }
 
+    // recheck if device still supports digital
+    b_start_digital = p_sys->b_selected_dev_is_digital;
+    if(!AudioDeviceSupportsDigital(p_aout, p_sys->i_selected_dev))
+        b_start_digital = false;
+
+    if (b_start_digital)
+        msg_Dbg(p_aout, "Use audio device for digital output");
+
     /* add a callback to see if the device dies later on */
     err = AudioObjectAddPropertyListener(p_sys->i_selected_dev, &audioDeviceAliveAddress, HardwareListener, (void *)p_aout);
     if (err != noErr) {
@@ -302,7 +310,7 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
     bool b_success = false;
 
     /* Check for Digital mode or Analog output mode */
-    if (AOUT_FMT_SPDIF (fmt) && p_sys->b_selected_dev_is_digital) {
+    if (AOUT_FMT_SPDIF (fmt) && b_start_digital) {
         if (StartSPDIF (p_aout, fmt)) {
             msg_Dbg(p_aout, "digital output successfully opened");
             b_success = true;
@@ -1197,7 +1205,8 @@ static void Play (audio_output_t * p_aout, block_t * p_block)
         }
 
         /* move data to buffer */
-        TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer);
+        if (unlikely(!TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer)))
+            msg_Warn(p_aout, "dropped buffer");
 
         if (!p_sys->i_bytes_per_sample)
             p_sys->i_bytes_per_sample = p_block->i_buffer / p_block->i_nb_samples;
@@ -1231,8 +1240,10 @@ static void Flush(audio_output_t *p_aout, bool wait)
     if (wait) {
         int32_t availableBytes;
         vlc_mutex_lock(&p_sys->lock);
-        while (TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes) != NULL) {
+        TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
+        while (availableBytes > 0) {
             vlc_cond_wait(&p_sys->cond, &p_sys->lock);
+            TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
         }
         vlc_mutex_unlock(&p_sys->lock);
 
@@ -1283,6 +1294,7 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj,
     int bytesToCopy = ioData->mBuffers[0].mDataByteSize;
     Float32 *targetBuffer = (Float32*)ioData->mBuffers[0].mData;
 
+    vlc_mutex_lock(&p_sys->lock);
     /* Pull audio from buffer */
     int32_t availableBytes;
     Float32 *buffer = TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
@@ -1297,7 +1309,6 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj,
         TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
     }
 
-    vlc_mutex_lock(&p_sys->lock);
     vlc_cond_signal(&p_sys->cond);
     vlc_mutex_unlock(&p_sys->lock);
 
@@ -1327,6 +1338,7 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice,
     int bytesToCopy = outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize;
     char *targetBuffer = outOutputData->mBuffers[p_sys->i_stream_index].mData;
 
+    vlc_mutex_lock(&p_sys->lock);
     /* Pull audio from buffer */
     int32_t availableBytes;
     char *buffer = TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
@@ -1340,7 +1352,6 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice,
         TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
     }
 
-    vlc_mutex_lock(&p_sys->lock);
     vlc_cond_signal(&p_sys->cond);
     vlc_mutex_unlock(&p_sys->lock);