[vlc-commits] DirectSound: use device GUID instead of device name (fixes #7102)
Rémi Denis-Courmont
git at videolan.org
Thu Nov 8 20:03:47 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | 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)
More information about the vlc-commits
mailing list