X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=lib%2Faudio.c;h=0165d16214de009e7fbc154ce7e2470203cb3553;hb=d47fcbb413a08efbe65d72c3b79d83c39c8685fa;hp=51d3ff315c70addab6c4d8d817550ea2e4370d1a;hpb=ff42916045c79a24488bf69e9c2146b50011bc28;p=vlc diff --git a/lib/audio.c b/lib/audio.c index 51d3ff315c..0165d16214 100644 --- a/lib/audio.c +++ b/lib/audio.c @@ -139,6 +139,44 @@ int libvlc_audio_output_set( libvlc_media_player_t *mp, const char *psz_name ) return 0; } +libvlc_audio_output_device_t * +libvlc_audio_output_device_enum( libvlc_media_player_t *mp ) +{ + audio_output_t *aout = GetAOut( mp ); + if( aout == NULL ) + return NULL; + + libvlc_audio_output_device_t *list, **pp = &list; + char **values, **texts; + + int n = aout_DevicesList( aout, &values, &texts ); + vlc_object_release( aout ); + if( n < 0 ) + goto err; + + for (int i = 0; i < n; i++) + { + libvlc_audio_output_device_t *item = malloc( sizeof(*item) ); + if( unlikely(item == NULL) ) + { + free( texts[i] ); + free( values[i] ); + continue; + } + + *pp = item; + pp = &item->p_next; + item->psz_device = values[i]; + item->psz_description = texts[i]; + } + + free( texts ); + free( values ); +err: + *pp = NULL; + return list; +} + libvlc_audio_output_device_t * libvlc_audio_output_device_list_get( libvlc_instance_t *p_instance, const char *aout ) @@ -211,19 +249,45 @@ char *libvlc_audio_output_device_id( libvlc_instance_t *p_instance, * Set device for using *****************************/ void libvlc_audio_output_device_set( libvlc_media_player_t *mp, - const char *psz_audio_output, - const char *psz_device_id ) + const char *module, const char *devid ) { - char *psz_config_name; - if( !psz_audio_output || !psz_device_id ) + if( devid == NULL ) + return; + + if( module != NULL ) + { + char *cfg_name; + + if( asprintf( &cfg_name, "%s-audio-device", module ) == -1 ) + return; + + if( !var_Type( mp, cfg_name ) ) + /* Don't recreate the same variable over and over and over... */ + var_Create( mp, cfg_name, VLC_VAR_STRING ); + var_SetString( mp, cfg_name, devid ); + free( cfg_name ); return; - if( asprintf( &psz_config_name, "%s-audio-device", psz_audio_output ) == -1 ) + } + + audio_output_t *aout = GetAOut( mp ); + if( aout == NULL ) return; - if( !var_Type( mp, psz_config_name ) ) - /* Don't recreate the same variable over and over and over... */ - var_Create( mp, psz_config_name, VLC_VAR_STRING ); - var_SetString( mp, psz_config_name, psz_device_id ); - free( psz_config_name ); + + aout_DeviceSet( aout, devid ); + vlc_object_release( aout ); +} + +char *libvlc_audio_output_device_get( libvlc_media_player_t *mp ) +{ + audio_output_t *aout = GetAOut( mp ); + if( aout == NULL ) + return NULL; + + char *devid = aout_DeviceGet( aout ); + + vlc_object_release( aout ); + + return devid; } int libvlc_audio_output_get_device_type( libvlc_media_player_t *mp ) @@ -285,7 +349,7 @@ int libvlc_audio_get_volume( libvlc_media_player_t *mp ) int libvlc_audio_set_volume( libvlc_media_player_t *mp, int volume ) { float vol = volume / 100.f; - if (vol < 0.f) + if (!isgreaterequal(vol, 0.f)) { libvlc_printerr( "Volume out of range" ); return -1; @@ -529,10 +593,12 @@ void libvlc_audio_equalizer_release( libvlc_equalizer_t *p_equalizer ) *****************************************************************************/ int libvlc_audio_equalizer_set_preamp( libvlc_equalizer_t *p_equalizer, float f_preamp ) { - if ( f_preamp < -20.0f ) - f_preamp = -20.0f; - else if ( f_preamp > 20.0f ) - f_preamp = 20.0f; + if( isnan(f_preamp) ) + return -1; + if( f_preamp < -20.f ) + f_preamp = -20.f; + else if( f_preamp > 20.f ) + f_preamp = 20.f; p_equalizer->f_preamp = f_preamp; return 0; @@ -551,13 +617,14 @@ float libvlc_audio_equalizer_get_preamp( libvlc_equalizer_t *p_equalizer ) *****************************************************************************/ int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, float f_amp, unsigned u_band ) { - if ( u_band >= EQZ_BANDS_MAX ) + if( u_band >= EQZ_BANDS_MAX || isnan(f_amp) ) return -1; - if ( f_amp < -20.0f ) - f_amp = -20.0f; - else if ( f_amp > 20.0f ) - f_amp = 20.0f; + + if( f_amp < -20.f ) + f_amp = -20.f; + else if( f_amp > 20.f ) + f_amp = 20.f; p_equalizer->f_amp[ u_band ] = f_amp; return 0; @@ -569,7 +636,7 @@ int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, fl float libvlc_audio_equalizer_get_amp_at_index( libvlc_equalizer_t *p_equalizer, unsigned u_band ) { if ( u_band >= EQZ_BANDS_MAX ) - return 0.f; + return nanf(""); return p_equalizer->f_amp[ u_band ]; }