X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_output%2Fdirectx.c;h=f7e6895d313cfdf6c16aff0468f6a9196bfdf178;hb=c27044171066da05b8c049073d5e1060c85759e0;hp=7516cb6657544d3a3c88ee7090d77e55d5f96d02;hpb=acedeb2868f293edf520e21093112c6ce9039d11;p=vlc diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c index 7516cb6657..f7e6895d31 100644 --- a/modules/audio_output/directx.c +++ b/modules/audio_output/directx.c @@ -17,8 +17,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -553,7 +553,7 @@ static void Probe( aout_instance_t * p_aout ) text.psz_string = _("A/52 over S/PDIF"); var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text ); - if( config_GetInt( p_aout, "spdif" ) ) + if( var_InheritInteger( p_aout, "spdif" ) ) var_Set( p_aout, "audio-device", val ); } } @@ -580,7 +580,6 @@ static void Play( aout_instance_t *p_aout ) if( !p_aout->output.p_sys->b_playing ) { aout_buffer_t *p_buffer; - int i; p_aout->output.p_sys->b_playing = 1; @@ -589,7 +588,7 @@ static void Play( aout_instance_t *p_aout ) aout_FifoFirstDate( p_aout, &p_aout->output.fifo ); /* fill in the first samples */ - for( i = 0; i < FRAMES_NUM; i++ ) + for( int i = 0; i < FRAMES_NUM; i++ ) { p_buffer = aout_FifoPop( p_aout, &p_aout->output.fifo ); if( !p_buffer ) break; @@ -614,7 +613,6 @@ static void CloseAudio( vlc_object_t *p_this ) /* kill the position notification thread, if any */ if( p_sys->p_notif ) { - vlc_object_detach( p_sys->p_notif ); vlc_object_kill( p_sys->p_notif ); /* wake up the audio thread if needed */ if( !p_sys->b_playing ) SetEvent( p_sys->p_notif->event ); @@ -639,34 +637,38 @@ static void CloseAudio( vlc_object_t *p_this ) /***************************************************************************** * CallBackDirectSoundEnum: callback to enumerate available devices *****************************************************************************/ -static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCSTR psz_desc, - LPCSTR psz_mod, LPVOID _p_aout ) +static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCWSTR psz_desc, + LPCWSTR psz_mod, LPVOID _p_aout ) { VLC_UNUSED( psz_mod ); 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 */ p_aout->output.p_sys->p_device_guid = malloc( sizeof( 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 { /* If no default device has been selected, chose the first one */ 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 = *p_guid; - msg_Dbg( p_aout, "using device: %s", psz_desc ); + msg_Dbg( p_aout, "using device: %s", psz_device ); } } - return 1; + + free( psz_device ); + return true; } /***************************************************************************** @@ -675,7 +677,7 @@ static int CALLBACK CallBackDirectSoundEnum( LPGUID p_guid, LPCSTR psz_desc, static int InitDirectSound( aout_instance_t *p_aout ) { 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"); if( p_aout->output.p_sys->hdsound_dll == NULL ) @@ -699,7 +701,7 @@ static int InitDirectSound( aout_instance_t *p_aout ) "DirectSoundEnumerateW" ); if( OurDirectSoundEnumerate ) { - p_aout->output.p_sys->psz_device = config_GetPsz(p_aout, "directx-audio-device-name"); + p_aout->output.p_sys->psz_device = var_InheritString(p_aout, "directx-audio-device-name"); /* Attempt enumeration */ if( FAILED( OurDirectSoundEnumerate( CallBackDirectSoundEnum, p_aout ) ) ) @@ -1122,31 +1124,30 @@ static void* DirectSoundThread( vlc_object_t *p_this ) /***************************************************************************** * CallBackConfigNBEnum: callback to get the number of available devices *****************************************************************************/ -static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCSTR psz_desc, - LPCSTR psz_mod, LPVOID p_nb ) +static int CALLBACK CallBackConfigNBEnum( LPGUID p_guid, LPCWSTR psz_desc, + LPCWSTR psz_mod, LPVOID p_nb ) { VLC_UNUSED( psz_mod ); VLC_UNUSED( psz_desc ); VLC_UNUSED( p_guid ); int * a = (int *)p_nb; (*a)++; - return 1; + return true; } /***************************************************************************** * CallBackConfigEnum: callback to add available devices to the preferences list *****************************************************************************/ -static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCSTR psz_desc, - LPCSTR psz_mod, LPVOID _p_item ) +static int CALLBACK CallBackConfigEnum( LPGUID p_guid, LPCWSTR psz_desc, + LPCWSTR psz_mod, LPVOID _p_item ) { - VLC_UNUSED( psz_mod ); - VLC_UNUSED( p_guid ); + VLC_UNUSED( psz_mod ); VLC_UNUSED( p_guid ); 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_text[p_item->i_list] = FromLocaleDup(psz_desc); - p_item->i_list = p_item->i_list +1; - return 1; + p_item->ppsz_list[p_item->i_list] = FromWide( psz_desc ); + p_item->ppsz_list_text[p_item->i_list] = FromWide( psz_desc ); + p_item->i_list++; + return true; } /***************************************************************************** @@ -1156,49 +1157,54 @@ static int ReloadDirectXDevices( vlc_object_t *p_this, char const *psz_name, vlc_value_t newval, vlc_value_t oldval, void *data ) { VLC_UNUSED( newval ); VLC_UNUSED( oldval ); VLC_UNUSED( data ); + module_config_t *p_item = config_FindConfig( p_this, psz_name ); if( !p_item ) return VLC_SUCCESS; /* Clear-up the current list */ if( p_item->i_list ) { - int i; - for( i = 0; i < p_item->i_list; i++ ) + for( int i = 0; i < p_item->i_list; i++ ) { free((char *)(p_item->ppsz_list[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"); if( hdsound_dll == NULL ) { msg_Warn( p_this, "cannot open DSOUND.DLL" ); + return VLC_SUCCESS; } /* Get DirectSoundEnumerate */ OurDirectSoundEnumerate = (void *) - GetProcAddress( hdsound_dll, - "DirectSoundEnumerateW" ); + GetProcAddress( hdsound_dll, "DirectSoundEnumerateW" ); + + if( OurDirectSoundEnumerate == NULL ) + goto error; + int nb_devices = 0; OurDirectSoundEnumerate(CallBackConfigNBEnum, &nb_devices); msg_Dbg(p_this,"found %d devices", nb_devices); p_item->ppsz_list = xrealloc( p_item->ppsz_list, - nb_devices * sizeof(char *) ); + nb_devices * sizeof(char *) ); p_item->ppsz_list_text = xrealloc( p_item->ppsz_list_text, - nb_devices * sizeof(char *) ); + nb_devices * sizeof(char *) ); p_item->i_list = 0; OurDirectSoundEnumerate(CallBackConfigEnum, p_item); - FreeLibrary(hdsound_dll); - /* Signal change to the interface */ p_item->b_dirty = true; +error: + FreeLibrary(hdsound_dll); + return VLC_SUCCESS; }