vlc | branch: master | Ludovic Fauvet <[email protected]> | Wed Jul 24 13:01:01 
2013 +0200| [6809bd998e349580240f224b7705cb3ae4a16962] | committer: 
Jean-Baptiste Kempf

directsound: clear the ring buffer ahead of the write pointer (fix #8860)

Signed-off-by: Jean-Baptiste Kempf <[email protected]>

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

 modules/audio_output/directx.c |   31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c
index 79bbb90..bf47f85 100644
--- a/modules/audio_output/directx.c
+++ b/modules/audio_output/directx.c
@@ -669,13 +669,26 @@ static int FillBuffer( audio_output_t *p_aout, block_t 
*p_buffer )
     size_t towrite = (p_buffer)?p_buffer->i_buffer:DS_BUF_SIZE;
     void *p_write_position, *p_wrap_around;
     unsigned long l_bytes1, l_bytes2;
+    uint32_t i_read;
+    size_t i_size;
+    mtime_t i_buf;
     HRESULT dsresult;
 
+    if( IDirectSoundBuffer_GetCurrentPosition( p_aout->sys->p_dsbuffer, 
(LPDWORD) &i_read, NULL) ==  DS_OK )
+    {
+        /* Compute the outer interval between the write and read pointers 
within the ring buffer */
+        i_buf = (mtime_t)p_aout->sys->i_write - (mtime_t)i_read;
+        if( i_buf <= 0 )
+            i_buf += DS_BUF_SIZE;
+    }
+    else
+        i_buf = towrite;
+
     /* Before copying anything, we have to lock the buffer */
     dsresult = IDirectSoundBuffer_Lock(
                 p_sys->p_dsbuffer,         /* DS buffer */
                 p_aout->sys->i_write,      /* Start offset */
-                towrite,                   /* Number of bytes */
+                i_buf,                     /* Number of bytes */
                 &p_write_position,         /* Address of lock start */
                 &l_bytes1,                 /* Count of bytes locked before 
wrap around */
                 &p_wrap_around,            /* Buffer address (if wrap around) 
*/
@@ -687,7 +700,7 @@ static int FillBuffer( audio_output_t *p_aout, block_t 
*p_buffer )
         dsresult = IDirectSoundBuffer_Lock(
                                p_sys->p_dsbuffer,
                                p_aout->sys->i_write,
-                               towrite,
+                               i_buf,
                                &p_write_position,
                                &l_bytes1,
                                &p_wrap_around,
@@ -714,9 +727,19 @@ static int FillBuffer( audio_output_t *p_aout, block_t 
*p_buffer )
                                  p_sys->chans_to_reorder, p_sys->chan_table,
                                  p_sys->format );
 
-        memcpy( p_write_position, p_buffer->p_buffer, l_bytes1 );
+
+        i_size = ( p_buffer->i_buffer < l_bytes1 ) ? p_buffer->i_buffer : 
l_bytes1;
+        memcpy( p_write_position, p_buffer->p_buffer, i_size );
+        memset( (uint8_t*) p_write_position + i_size, 0, l_bytes1 - i_size );
+
         if( l_bytes1 < p_buffer->i_buffer)
-            memcpy(p_wrap_around, p_buffer->p_buffer + l_bytes1, l_bytes2);
+        {
+            /* Compute the remaining buffer space to be written */
+            i_buf = i_buf - i_size - (l_bytes1 - i_size);
+            i_size = ( p_buffer->i_buffer - l_bytes1 < l_bytes2 ) ? 
p_buffer->i_buffer - l_bytes1 : l_bytes2;
+            memcpy( p_wrap_around, p_buffer->p_buffer + l_bytes1, i_size );
+            memset( (uint8_t*) p_wrap_around + i_size, 0, i_buf - i_size );
+        }
         block_Release( p_buffer );
     }
 

_______________________________________________
vlc-commits mailing list
[email protected]
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to