vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Nov 8 21:03:28 2012 +0200| [9c05025e085ab642932ed44c8219c362cfc6dbbf] | committer: Rémi Denis-Courmont
DirectSound: use device GUID instead of device name (fixes #7102) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9c05025e085ab642932ed44c8219c362cfc6dbbf --- modules/audio_output/Modules.am | 2 +- modules/audio_output/directx.c | 142 +++++++++++++-------------------------- 2 files changed, 47 insertions(+), 97 deletions(-) diff --git a/modules/audio_output/Modules.am b/modules/audio_output/Modules.am index 0bdea44..3926c20 100644 --- a/modules/audio_output/Modules.am +++ b/modules/audio_output/Modules.am @@ -63,7 +63,7 @@ endif libdirectsound_plugin_la_SOURCES = directx.c windows_audio_common.h packet.c libdirectsound_plugin_la_CFLAGS = $(AM_CFLAGS) -libdirectsound_plugin_la_LIBADD = $(AM_LIBADD) +libdirectsound_plugin_la_LIBADD = $(AM_LIBADD) -lole32 if HAVE_DIRECTX libvlc_LTLIBRARIES += libdirectsound_plugin.la endif diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c index ff578a7..1862710 100644 --- a/modules/audio_output/directx.c +++ b/modules/audio_output/directx.c @@ -66,9 +66,6 @@ struct aout_sys_t aout_packet_t packet; HINSTANCE hdsound_dll; /* handle of the opened dsound dll */ - char * psz_device; /* user defined device name */ - LPGUID p_device_guid; - LPDIRECTSOUND p_dsobject; /* main Direct Sound object */ LPDIRECTSOUNDBUFFER p_dsbuffer; /* the sound buffer we use (direct sound * takes care of mixing all the @@ -140,7 +137,7 @@ vlc_module_begin () set_subcategory( SUBCAT_AUDIO_AOUT ) add_shortcut( "directx", "aout_directx" ) - add_string( "directx-audio-device", "default", + add_string( "directx-audio-device", NULL, DEVICE_TEXT, DEVICE_LONGTEXT, false ) change_string_cb( ReloadDirectXDevices ) add_obsolete_string( "directx-audio-device-name") @@ -601,45 +598,6 @@ static void Stop( audio_output_t *p_aout ) /* finally release the DirectSound object */ if( p_sys->p_dsobject ) IDirectSound_Release( p_sys->p_dsobject ); - - free( p_aout->sys->p_device_guid ); -} - -/***************************************************************************** - * CallBackDirectSoundEnum: callback to enumerate available devices - *****************************************************************************/ -static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCWSTR psz_desc, - LPCWSTR psz_mod, LPVOID _p_aout ) -{ - VLC_UNUSED( psz_mod ); - - audio_output_t *p_aout = (audio_output_t *)_p_aout; - - char *psz_device = FromWide( psz_desc ); - msg_Dbg( p_aout, "found device: %s", psz_device ); - - if( p_aout->sys->psz_device && - !strcmp(p_aout->sys->psz_device, psz_device) && p_guid ) - { - /* Use the device corresponding to psz_device */ - p_aout->sys->p_device_guid = malloc( sizeof( GUID ) ); - *p_aout->sys->p_device_guid = *p_guid; - msg_Dbg( p_aout, "using device: %s", psz_device ); - } - else - { - /* If no default device has been selected, chose the first one */ - if( !p_aout->sys->psz_device && p_guid ) - { - p_aout->sys->psz_device = strdup( psz_device ); - p_aout->sys->p_device_guid = malloc( sizeof( GUID ) ); - *p_aout->sys->p_device_guid = *p_guid; - msg_Dbg( p_aout, "using device: %s", psz_device ); - } - } - - free( psz_device ); - return true; } /***************************************************************************** @@ -647,8 +605,9 @@ static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCWSTR psz_desc, *****************************************************************************/ static int InitDirectSound( audio_output_t *p_aout ) { + aout_sys_t *sys = p_aout->sys; + GUID guid, *p_guid = NULL; HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); - HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKW, LPVOID); OurDirectSoundCreate = (void *) GetProcAddress( p_aout->sys->hdsound_dll, @@ -659,25 +618,21 @@ static int InitDirectSound( audio_output_t *p_aout ) goto error; } - /* Get DirectSoundEnumerate */ - OurDirectSoundEnumerate = (void *) - GetProcAddress( p_aout->sys->hdsound_dll, - "DirectSoundEnumerateW" ); - if( OurDirectSoundEnumerate ) + char *dev = var_InheritString( p_aout, "directx-audio-device" ); + if( dev != NULL ) { - p_aout->sys->psz_device = var_InheritString(p_aout, "directx-audio-device"); - /* Attempt enumeration */ - if( FAILED( OurDirectSoundEnumerate( CallBackDirectSoundEnum, - p_aout ) ) ) - { - msg_Dbg( p_aout, "enumeration of DirectSound devices failed" ); - } + LPOLESTR lpsz = ToWide( dev ); + + if( SUCCEEDED( IIDFromString( lpsz, &guid ) ) ) + p_guid = &guid; + else + msg_Err( p_aout, "bad device GUID: %ls", lpsz ); + free( lpsz ); + free( dev ); } /* Create the direct sound object */ - if FAILED( OurDirectSoundCreate( p_aout->sys->p_device_guid, - &p_aout->sys->p_dsobject, - NULL ) ) + if FAILED( OurDirectSoundCreate( p_guid, &sys->p_dsobject, NULL ) ) { msg_Warn( p_aout, "cannot create a direct sound device" ); goto error; @@ -699,11 +654,10 @@ static int InitDirectSound( audio_output_t *p_aout ) { msg_Warn( p_aout, "cannot set direct sound cooperative level" ); } - return VLC_SUCCESS; error: - p_aout->sys->p_dsobject = NULL; + sys->p_dsobject = NULL; return VLC_EGENERIC; } @@ -1075,32 +1029,30 @@ static void* DirectSoundThread( void *data ) return NULL; } -/***************************************************************************** - * CallBackConfigNBEnum: callback to get the number of available devices - *****************************************************************************/ -static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCWSTR psz_desc, - LPCWSTR psz_mod, LPVOID data ) +typedef struct { - int *p_nb = data; + unsigned count; + char **ids; + char **names; +} ds_list_t; - (*p_nb)++; - VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_desc ); VLC_UNUSED( p_guid ); - return true; -} - -/***************************************************************************** - * CallBackConfigEnum: callback to add available devices to the preferences list - *****************************************************************************/ -static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCWSTR psz_desc, - LPCWSTR psz_mod, LPVOID data ) +static int CALLBACK DeviceEnumCallback( LPGUID guid, LPCWSTR desc, + LPCWSTR mod, LPVOID data ) { - char **values = data; + ds_list_t *list = data; + OLECHAR buf[48]; + + StringFromGUID2( guid, buf, 48 ); - while( *values != NULL ) - values++; - *values = FromWide( psz_desc ); + list->count++; + list->ids = xrealloc( list->ids, list->count * sizeof(char *) ); + list->names = xrealloc( list->names, list->count * sizeof(char *) ); + list->ids[list->count - 1] = FromWide( buf ); + list->names[list->count - 1] = FromWide( desc ); + if( list->ids == NULL || list->names == NULL ) + abort(); - VLC_UNUSED( psz_mod ); VLC_UNUSED( p_guid ); + (void) mod; return true; } @@ -1110,7 +1062,7 @@ static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCWSTR psz_desc, static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name, char ***values, char ***descs ) { - int nb_devices = 0; + ds_list_t list = { 0, NULL, NULL }; (void) psz_name; @@ -1118,25 +1070,23 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name, if( hdsound_dll == NULL ) { msg_Warn( p_this, "cannot open DSOUND.DLL" ); - goto error; + goto out; } /* Get DirectSoundEnumerate */ HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKW, LPVOID) = (void *)GetProcAddress( hdsound_dll, _T("DirectSoundEnumerateW") ); - if( OurDirectSoundEnumerate == NULL ) - goto error; - - OurDirectSoundEnumerate(CallBackConfigNBEnum, &nb_devices); - msg_Dbg(p_this, "found %d devices", nb_devices); - - *values = xcalloc( nb_devices, sizeof(char *) ); - OurDirectSoundEnumerate(CallBackConfigEnum, *values); - *descs = xcalloc( nb_devices, sizeof(char *) ); - OurDirectSoundEnumerate(CallBackConfigEnum, *descs); -error: + if( OurDirectSoundEnumerate != NULL ) + { + OurDirectSoundEnumerate( DeviceEnumCallback, &list ); + msg_Dbg( p_this, "found %u devices", list.count ); + } FreeLibrary(hdsound_dll); - return nb_devices; + +out: + *values = list.ids; + *descs = list.names; + return list.count; } static int Open(vlc_object_t *obj) _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
