[vlc-commits] DirectSound: avoid crash on faulty audio device.

Jean-Baptiste Kempf git at videolan.org
Thu Dec 15 16:15:38 CET 2011


vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Thu Dec 15 16:11:25 2011 +0100| [6d90bf20c01db2b284a81b26ce3356536257c1fc] | committer: Jean-Baptiste Kempf

DirectSound: avoid crash on faulty audio device.

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

 modules/audio_output/directx.c |   42 +++++++++++++++++++++++----------------
 1 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c
index f3a2ba2..a44a0dc 100644
--- a/modules/audio_output/directx.c
+++ b/modules/audio_output/directx.c
@@ -93,6 +93,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int  OpenAudio  ( vlc_object_t * );
 static void CloseAudio ( vlc_object_t * );
+static void CloseAudioCommon ( vlc_object_t * );
 static void Play       ( audio_output_t *, block_t * );
 
 /* local functions */
@@ -161,18 +162,10 @@ static int OpenAudio( vlc_object_t *p_this )
     msg_Dbg( p_aout, "Opening DirectSound Audio Output" );
 
    /* Allocate structure */
-    p_aout->sys = malloc( sizeof( aout_sys_t ) );
-    if( p_aout->sys == NULL )
+    p_aout->sys = calloc( 1, sizeof( aout_sys_t ) );
+    if( unlikely( p_aout->sys == NULL ) )
         return VLC_ENOMEM;
 
-    /* Initialize some variables */
-    p_aout->sys->p_dsobject = NULL;
-    p_aout->sys->p_dsbuffer = NULL;
-    p_aout->sys->p_notif = NULL;
-
-    p_aout->pf_play = Play;
-    p_aout->pf_pause = aout_PacketPause;
-    p_aout->pf_flush = aout_PacketFlush;
     aout_VolumeSoftInit( p_aout );
 
     /* Retrieve config values */
@@ -198,8 +191,6 @@ static int OpenAudio( vlc_object_t *p_this )
     free( psz_speaker );
     p_aout->sys->i_speaker_setup = i;
 
-    p_aout->sys->p_device_guid = 0;
-
     /* Initialise DirectSound */
     if( InitDirectSound( p_aout ) )
     {
@@ -236,8 +227,7 @@ static int OpenAudio( vlc_object_t *p_this )
             != VLC_SUCCESS )
         {
             msg_Err( p_aout, "cannot open directx audio device" );
-            free( p_aout->sys );
-            return VLC_EGENERIC;
+            goto error;
         }
 
         aout_PacketInit( p_aout, &p_aout->sys->packet, A52_FRAME_NB );
@@ -301,6 +291,11 @@ static int OpenAudio( vlc_object_t *p_this )
 
     /* Now we need to setup our DirectSound play notification structure */
     p_aout->sys->p_notif = calloc( 1, sizeof( *p_aout->sys->p_notif ) );
+    if( unlikely( !p_aout->sys->p_notif ) )
+    {
+        CloseAudio( VLC_OBJECT(p_aout) );
+        return VLC_ENOMEM;
+    }
     p_aout->sys->p_notif->p_aout = p_aout;
 
     vlc_atomic_set(&p_aout->sys->p_notif->abort, 0);
@@ -317,13 +312,18 @@ static int OpenAudio( vlc_object_t *p_this )
         CloseHandle( p_aout->sys->p_notif->event );
         free( p_aout->sys->p_notif );
         p_aout->sys->p_notif = NULL;
-        goto error;
+        CloseAudio( VLC_OBJECT(p_aout) );
+        return VLC_EGENERIC;
     }
 
+    p_aout->pf_play = Play;
+    p_aout->pf_pause = aout_PacketPause;
+    p_aout->pf_flush = aout_PacketFlush;
+
     return VLC_SUCCESS;
 
  error:
-    CloseAudio( VLC_OBJECT(p_aout) );
+    CloseAudioCommon( VLC_OBJECT(p_aout) );
     return VLC_EGENERIC;
 }
 
@@ -587,6 +587,13 @@ static void Play( audio_output_t *p_aout, block_t *p_buffer )
 static void CloseAudio( vlc_object_t *p_this )
 {
     audio_output_t * p_aout = (audio_output_t *)p_this;
+    aout_PacketDestroy( p_aout );
+    CloseAudioCommon( p_this );
+}
+
+static void CloseAudioCommon( vlc_object_t *p_this )
+{
+    audio_output_t * p_aout = (audio_output_t *)p_this;
     aout_sys_t *p_sys = p_aout->sys;
 
     msg_Dbg( p_aout, "closing audio device" );
@@ -612,8 +619,9 @@ static void CloseAudio( vlc_object_t *p_this )
     /* free DSOUND.DLL */
     if( p_sys->hdsound_dll ) FreeLibrary( p_sys->hdsound_dll );
 
-    free( p_aout->sys->p_device_guid );
     aout_PacketDestroy( p_aout );
+
+    free( p_aout->sys->p_device_guid );
     free( p_sys );
 }
 



More information about the vlc-commits mailing list