Commit 3ff8a01e authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

DirectSound: try to fix Wide Char issues

Here, the DSEnumCallback documentation seems wrong or misleading, it needs LPCWSTR with DirectSoundEnumerateW
http://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.reference.dsenumcallback%28VS.85%29.aspxSigned-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent acedeb28
...@@ -639,33 +639,36 @@ static void CloseAudio( vlc_object_t *p_this ) ...@@ -639,33 +639,36 @@ static void CloseAudio( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* CallBackDirectSoundEnum: callback to enumerate available devices * CallBackDirectSoundEnum: callback to enumerate available devices
*****************************************************************************/ *****************************************************************************/
static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCSTR psz_desc, static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCWSTR psz_desc,
LPCSTR psz_mod, LPVOID _p_aout ) LPCWSTR psz_mod, LPVOID _p_aout )
{ {
VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_mod );
aout_instance_t *p_aout = (aout_instance_t *)_p_aout; aout_instance_t *p_aout = (aout_instance_t *)_p_aout;
msg_Dbg( p_aout, "found device: %s", psz_desc ); char *psz_device = FromWide( psz_desc );
msg_Dbg( p_aout, "found device: %s", psz_device );
if( p_aout->output.p_sys->psz_device && !strcmp(p_aout->output.p_sys->psz_device, psz_desc) && p_guid ) if( p_aout->output.p_sys->psz_device && !strcmp(p_aout->output.p_sys->psz_device, psz_device) && p_guid )
{ {
/* Use the device corresponding to psz_device */ /* Use the device corresponding to psz_device */
p_aout->output.p_sys->p_device_guid = malloc( sizeof( GUID ) ); p_aout->output.p_sys->p_device_guid = malloc( sizeof( GUID ) );
*p_aout->output.p_sys->p_device_guid = *p_guid; *p_aout->output.p_sys->p_device_guid = *p_guid;
msg_Dbg( p_aout, "using device: %s", psz_desc ); msg_Dbg( p_aout, "using device: %s", psz_device );
} }
else else
{ {
/* If no default device has been selected, chose the first one */ /* If no default device has been selected, chose the first one */
if( !p_aout->output.p_sys->psz_device && p_guid ) if( !p_aout->output.p_sys->psz_device && p_guid )
{ {
p_aout->output.p_sys->psz_device = strdup( psz_desc ); p_aout->output.p_sys->psz_device = strdup( psz_device );
p_aout->output.p_sys->p_device_guid = malloc( sizeof( GUID ) ); p_aout->output.p_sys->p_device_guid = malloc( sizeof( GUID ) );
*p_aout->output.p_sys->p_device_guid = *p_guid; *p_aout->output.p_sys->p_device_guid = *p_guid;
msg_Dbg( p_aout, "using device: %s", psz_desc ); msg_Dbg( p_aout, "using device: %s", psz_device );
} }
} }
free( psz_device );
return 1; return 1;
} }
...@@ -675,7 +678,7 @@ static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCSTR psz_desc, ...@@ -675,7 +678,7 @@ static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCSTR psz_desc,
static int InitDirectSound( aout_instance_t *p_aout ) static int InitDirectSound( aout_instance_t *p_aout )
{ {
HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACK, LPVOID); HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKW, LPVOID);
p_aout->output.p_sys->hdsound_dll = LoadLibrary("DSOUND.DLL"); p_aout->output.p_sys->hdsound_dll = LoadLibrary("DSOUND.DLL");
if( p_aout->output.p_sys->hdsound_dll == NULL ) if( p_aout->output.p_sys->hdsound_dll == NULL )
...@@ -1122,8 +1125,8 @@ static void* DirectSoundThread( vlc_object_t *p_this ) ...@@ -1122,8 +1125,8 @@ static void* DirectSoundThread( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* CallBackConfigNBEnum: callback to get the number of available devices * CallBackConfigNBEnum: callback to get the number of available devices
*****************************************************************************/ *****************************************************************************/
static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCSTR psz_desc, static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCWSTR psz_desc,
LPCSTR psz_mod, LPVOID p_nb ) LPCWSTR psz_mod, LPVOID p_nb )
{ {
VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_desc ); VLC_UNUSED( p_guid ); VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_desc ); VLC_UNUSED( p_guid );
...@@ -1135,16 +1138,15 @@ static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCSTR psz_desc, ...@@ -1135,16 +1138,15 @@ static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCSTR psz_desc,
/***************************************************************************** /*****************************************************************************
* CallBackConfigEnum: callback to add available devices to the preferences list * CallBackConfigEnum: callback to add available devices to the preferences list
*****************************************************************************/ *****************************************************************************/
static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCSTR psz_desc, static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCWSTR psz_desc,
LPCSTR psz_mod, LPVOID _p_item ) LPCWSTR psz_mod, LPVOID _p_item )
{ {
VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_mod ); VLC_UNUSED( p_guid );
VLC_UNUSED( p_guid );
module_config_t *p_item = (module_config_t *) _p_item; module_config_t *p_item = (module_config_t *) _p_item;
p_item->ppsz_list[p_item->i_list] = FromLocaleDup(psz_desc); p_item->ppsz_list[p_item->i_list] = FromWide( psz_desc );
p_item->ppsz_list_text[p_item->i_list] = FromLocaleDup(psz_desc); p_item->ppsz_list_text[p_item->i_list] = FromWide( psz_desc );
p_item->i_list = p_item->i_list +1; p_item->i_list = p_item->i_list +1;
return 1; return 1;
} }
...@@ -1156,21 +1158,21 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name, ...@@ -1156,21 +1158,21 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name,
vlc_value_t newval, vlc_value_t oldval, void *data ) vlc_value_t newval, vlc_value_t oldval, void *data )
{ {
VLC_UNUSED( newval ); VLC_UNUSED( oldval ); VLC_UNUSED( data ); VLC_UNUSED( newval ); VLC_UNUSED( oldval ); VLC_UNUSED( data );
module_config_t *p_item = config_FindConfig( p_this, psz_name ); module_config_t *p_item = config_FindConfig( p_this, psz_name );
if( !p_item ) return VLC_SUCCESS; if( !p_item ) return VLC_SUCCESS;
/* Clear-up the current list */ /* Clear-up the current list */
if( p_item->i_list ) if( p_item->i_list )
{ {
int i; for( int i = 0; i < p_item->i_list; i++ )
for( i = 0; i < p_item->i_list; i++ )
{ {
free((char *)(p_item->ppsz_list[i]) ); free((char *)(p_item->ppsz_list[i]) );
free((char *)(p_item->ppsz_list_text[i]) ); free((char *)(p_item->ppsz_list_text[i]) );
} }
} }
HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACK, LPVOID); HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKW, LPVOID);
HANDLE hdsound_dll = LoadLibrary("DSOUND.DLL"); HANDLE hdsound_dll = LoadLibrary("DSOUND.DLL");
if( hdsound_dll == NULL ) if( hdsound_dll == NULL )
...@@ -1180,8 +1182,7 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name, ...@@ -1180,8 +1182,7 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name,
/* Get DirectSoundEnumerate */ /* Get DirectSoundEnumerate */
OurDirectSoundEnumerate = (void *) OurDirectSoundEnumerate = (void *)
GetProcAddress( hdsound_dll, GetProcAddress( hdsound_dll, "DirectSoundEnumerateW" );
"DirectSoundEnumerateW" );
int nb_devices = 0; int nb_devices = 0;
OurDirectSoundEnumerate(CallBackConfigNBEnum, &nb_devices); OurDirectSoundEnumerate(CallBackConfigNBEnum, &nb_devices);
msg_Dbg(p_this,"found %d devices", nb_devices); msg_Dbg(p_this,"found %d devices", nb_devices);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment