[vlc-commits] auhal: factor Analog and SPDIF render callbacks

Thomas Guillem git at videolan.org
Wed Feb 22 20:04:38 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Feb 22 18:58:49 2017 +0100| [029d011d65590dfe84346b0f90ef7aa1c6886d7a] | committer: Thomas Guillem

auhal: factor Analog and SPDIF render callbacks

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=029d011d65590dfe84346b0f90ef7aa1c6886d7a
---

 modules/audio_output/auhal.c | 101 +++++++++++++++++--------------------------
 1 file changed, 39 insertions(+), 62 deletions(-)

diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c
index ce848bf..8e0bf70 100644
--- a/modules/audio_output/auhal.c
+++ b/modules/audio_output/auhal.c
@@ -941,6 +941,40 @@ MuteSet(audio_output_t * p_aout, bool mute)
 #pragma mark -
 #pragma mark actual playback
 
+static void
+CopyOutput(audio_output_t *p_aout, uint8_t *p_output, size_t i_requested)
+{
+    aout_sys_t *p_sys = p_aout->sys;
+
+    vlc_mutex_lock(&p_sys->lock);
+    /* Pull audio from buffer */
+    if (!p_sys->b_paused)
+    {
+        int32_t i_available;
+        void *p_data = TPCircularBufferTail(&p_sys->circular_buffer,
+                                            &i_available);
+        if (i_available < 0)
+            i_available = 0;
+
+        size_t i_tocopy = __MIN(i_requested, (size_t) i_available);
+
+        if (i_tocopy > 0)
+        {
+            memcpy(p_output, p_data, i_tocopy);
+            TPCircularBufferConsume(&p_sys->circular_buffer, i_tocopy);
+        }
+
+        /* Pad with 0 */
+        if (i_requested > i_tocopy)
+            memset(&p_output[i_tocopy], 0, i_requested - i_tocopy);
+
+        vlc_cond_signal(&p_sys->cond);
+        vlc_mutex_unlock(&p_sys->lock);
+    }
+    else
+         memset(p_output, 0, i_requested);
+}
+
 /*****************************************************************************
  * RenderCallbackAnalog: This function is called everytime the AudioUnit wants
  * us to provide some more audio data.
@@ -958,37 +992,8 @@ RenderCallbackAnalog(void *p_data, AudioUnitRenderActionFlags *ioActionFlags,
     VLC_UNUSED(inBusNumber);
     VLC_UNUSED(inNumberFrames);
 
-    audio_output_t *p_aout = p_data;
-    struct aout_sys_t *p_sys = p_aout->sys;
-
-    int bytesRequested = ioData->mBuffers[0].mDataByteSize;
-    Float32 *targetBuffer = (Float32*)ioData->mBuffers[0].mData;
-    if (unlikely(bytesRequested == 0)) /* cannot be negative */
-        return noErr;
-
-    vlc_mutex_lock(&p_sys->lock);
-    /* Pull audio from buffer */
-    int32_t availableBytes;
-    Float32 *buffer = TPCircularBufferTail(&p_sys->circular_buffer,
-                                           &availableBytes);
-
-    /* check if we have enough data */
-    if (!availableBytes || p_sys->b_paused)
-    {
-        /* return an empty buffer so silence is played until we have data */
-        memset(targetBuffer, 0, bytesRequested);
-    }
-    else
-    {
-        int32_t bytesToCopy = __MIN(bytesRequested, availableBytes);
-
-        memcpy(targetBuffer, buffer, bytesToCopy);
-        TPCircularBufferConsume(&p_sys->circular_buffer, bytesToCopy);
-        ioData->mBuffers[0].mDataByteSize = bytesToCopy;
-    }
-
-    vlc_cond_signal(&p_sys->cond);
-    vlc_mutex_unlock(&p_sys->lock);
+    CopyOutput(p_data, ioData->mBuffers[0].mData,
+               ioData->mBuffers[0].mDataByteSize);
 
     return noErr;
 }
@@ -1010,37 +1015,9 @@ RenderCallbackSPDIF(AudioDeviceID inDevice, const AudioTimeStamp * inNow,
     VLC_UNUSED(inOutputTime);
 
     audio_output_t * p_aout = p_data;
-    struct aout_sys_t * p_sys = p_aout->sys;
-
-    int bytesRequested =
-        outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize;
-    char *targetBuffer = outOutputData->mBuffers[p_sys->i_stream_index].mData;
-    if (unlikely(bytesRequested == 0)) /* cannot be negative */
-        return noErr;
-
-    vlc_mutex_lock(&p_sys->lock);
-    /* Pull audio from buffer */
-    int32_t availableBytes;
-    char *buffer = TPCircularBufferTail(&p_sys->circular_buffer,
-                                        &availableBytes);
-
-    /* check if we have enough data */
-    if (!availableBytes || p_sys->b_paused)
-    {
-        /* return an empty buffer so silence is played until we have data */
-        memset(targetBuffer, 0, bytesRequested);
-    }
-    else
-    {
-        int32_t bytesToCopy = __MIN(bytesRequested, availableBytes);
-
-        memcpy(targetBuffer, buffer, bytesToCopy);
-        TPCircularBufferConsume(&p_sys->circular_buffer, bytesToCopy);
-        outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize = bytesToCopy;
-    }
-
-    vlc_cond_signal(&p_sys->cond);
-    vlc_mutex_unlock(&p_sys->lock);
+    aout_sys_t *p_sys = p_aout->sys;
+    CopyOutput(p_aout, outOutputData->mBuffers[p_sys->i_stream_index].mData,
+               outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize);
 
     return noErr;
 }



More information about the vlc-commits mailing list