]> git.sesse.net Git - vlc/commitdiff
auhal: do not output noise, and robustify output callbacks
authorDavid Fuhrmann <david.fuhrmann@googlemail.com>
Fri, 26 Apr 2013 15:28:15 +0000 (17:28 +0200)
committerDavid Fuhrmann <david.fuhrmann@googlemail.com>
Fri, 26 Apr 2013 15:31:34 +0000 (17:31 +0200)
Previously, noise occured in stereo mode because only
half of the buffer was zeroed out.

fixes #8507

modules/audio_output/auhal.c

index d4964edc368616e248142a796142e69f291e26b9..fea6322a41db5e77dd58e082e079196ac906d050 100644 (file)
@@ -1290,7 +1290,7 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj,
     audio_output_t * p_aout = (audio_output_t *)p_obj;
     struct aout_sys_t * p_sys = p_aout->sys;
 
-    int bytesToCopy = ioData->mBuffers[0].mDataByteSize;
+    int bytesRequested = ioData->mBuffers[0].mDataByteSize;
     Float32 *targetBuffer = (Float32*)ioData->mBuffers[0].mData;
 
     vlc_mutex_lock(&p_sys->lock);
@@ -1301,11 +1301,13 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj,
     /* check if we have enough data */
     if (!availableBytes) {
         /* return an empty buffer so silence is played until we have data */
-        for (UInt32 j = 0; j < inNumberFrames; j++)
-            targetBuffer[j] = 0.;
+        memset(targetBuffer, 0, ioData->mBuffers[0].mDataByteSize);
     } else {
-        memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes));
-        TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
+        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);
@@ -1334,7 +1336,7 @@ static OSStatus RenderCallbackSPDIF(AudioDeviceID inDevice,
     audio_output_t * p_aout = (audio_output_t *)threadGlobals;
     struct aout_sys_t * p_sys = p_aout->sys;
 
-    int bytesToCopy = outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize;
+    int bytesRequested = outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize;
     char *targetBuffer = outOutputData->mBuffers[p_sys->i_stream_index].mData;
 
     vlc_mutex_lock(&p_sys->lock);
@@ -1347,8 +1349,11 @@ static OSStatus RenderCallbackSPDIF(AudioDeviceID inDevice,
         /* return an empty buffer so silence is played until we have data */
         memset(targetBuffer, 0, outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize);
     } else {
-        memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes));
-        TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
+        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);