X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Faudio.c;h=22a886ef43bff20357921c57daf34f110886a350;hb=7b0dd84fff6c300cab5e0bdbf2a29fb1b3618e62;hp=52033cadc95f42b99ab5beec709ec56045b094bc;hpb=d9d80e10fbf2cd2406c62f980f06e1f5e0dc853a;p=vlc diff --git a/src/control/audio.c b/src/control/audio.c index 52033cadc9..22a886ef43 100644 --- a/src/control/audio.c +++ b/src/control/audio.c @@ -25,19 +25,43 @@ #include "libvlc_internal.h" #include +#include #include + +/* + * Remember to release the returned aout_instance_t since it is locked at + * the end of this function. + */ +static aout_instance_t *GetAOut( libvlc_instance_t *p_instance, + libvlc_exception_t *p_exception ) +{ + aout_instance_t * p_aout = NULL; + + p_aout = vlc_object_find( p_instance->p_libvlc_int, VLC_OBJECT_AOUT, FIND_CHILD ); + if( !p_aout ) + { + libvlc_exception_raise( p_exception, "No active audio output" ); + return NULL; + } + + return p_aout; +} + + /***************************************************************************** * libvlc_audio_get_mute : Get the volume state, true if muted *****************************************************************************/ void libvlc_audio_toggle_mute( libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) { + VLC_UNUSED(p_e); + aout_VolumeMute( p_instance->p_libvlc_int, NULL ); } -vlc_bool_t libvlc_audio_get_mute( libvlc_instance_t *p_instance, - libvlc_exception_t *p_e ) +int libvlc_audio_get_mute( libvlc_instance_t *p_instance, + libvlc_exception_t *p_e ) { /* * If the volume level is 0, then the channel is muted @@ -46,11 +70,11 @@ vlc_bool_t libvlc_audio_get_mute( libvlc_instance_t *p_instance, i_volume = libvlc_audio_get_volume(p_instance, p_e); if ( i_volume == 0 ) - return VLC_TRUE; - return VLC_FALSE; + return true; + return false; } -void libvlc_audio_set_mute( libvlc_instance_t *p_instance, vlc_bool_t mute, +void libvlc_audio_set_mute( libvlc_instance_t *p_instance, int mute, libvlc_exception_t *p_e ) { if ( mute ^ libvlc_audio_get_mute( p_instance, p_e ) ) @@ -65,6 +89,8 @@ void libvlc_audio_set_mute( libvlc_instance_t *p_instance, vlc_bool_t mute, int libvlc_audio_get_volume( libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) { + VLC_UNUSED(p_e); + audio_volume_t i_volume; aout_VolumeGet( p_instance->p_libvlc_int, &i_volume ); @@ -91,99 +117,146 @@ void libvlc_audio_set_volume( libvlc_instance_t *p_instance, int i_volume, } } +/***************************************************************************** + * libvlc_audio_get_track_count : Get the number of available audio tracks + *****************************************************************************/ +int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi, + libvlc_exception_t *p_e ) +{ + input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e ); + vlc_value_t val_list; + + if( !p_input_thread ) + return -1; + + var_Change( p_input_thread, "audio-es", VLC_VAR_GETCHOICES, &val_list, NULL ); + vlc_object_release( p_input_thread ); + return val_list.p_list->i_count; +} + /***************************************************************************** * libvlc_audio_get_track : Get the current audio track *****************************************************************************/ -int libvlc_audio_get_track( libvlc_instance_t *p_instance, +int libvlc_audio_get_track( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ) { - int i_track = 0; + input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e ); + vlc_value_t val_list; + vlc_value_t val; + int i_track = -1; + int i_ret = -1; + int i; - i_track = var_GetInteger( p_instance->p_libvlc_int, "audio-track" ); + if( !p_input_thread ) + return -1; + i_ret = var_Get( p_input_thread, "audio-es", &val ); + if( i_ret < 0 ) + { + libvlc_exception_raise( p_e, "Getting Audio track information failed" ); + vlc_object_release( p_input_thread ); + return i_ret; + } + + var_Change( p_input_thread, "audio-es", VLC_VAR_GETCHOICES, &val_list, NULL ); + for( i = 0; i < val_list.p_list->i_count; i++ ) + { + vlc_value_t track_val = val_list.p_list->p_values[i]; + if( track_val.i_int == val.i_int ) + { + i_track = i; + break; + } + } + vlc_object_release( p_input_thread ); return i_track; } + /***************************************************************************** * libvlc_audio_set_track : Set the current audio track *****************************************************************************/ -void libvlc_audio_set_track( libvlc_instance_t *p_instance, int i_track, +void libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track, libvlc_exception_t *p_e ) { + input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e ); + vlc_value_t val_list; int i_ret = -1; + int i; - i_ret = var_SetInteger( p_instance->p_libvlc_int, "audio-track", i_track ); + if( !p_input_thread ) + return; - if( i_ret < 0 ) + var_Change( p_input_thread, "audio-es", VLC_VAR_GETCHOICES, &val_list, NULL ); + for( i = 0; i < val_list.p_list->i_count; i++ ) { - libvlc_exception_raise( p_e, "Setting audio track failed" ); + vlc_value_t val = val_list.p_list->p_values[i]; + if( i_track == val.i_int ) + { + i_ret = var_Set( p_input_thread, "audio-es", val ); + if( i_ret < 0 ) + { + libvlc_exception_raise( p_e, "Setting audio track failed" ); + } + vlc_object_release( p_input_thread ); + return; + } } + libvlc_exception_raise( p_e, "Audio track out of range" ); + vlc_object_release( p_input_thread ); } /***************************************************************************** * libvlc_audio_get_channel : Get the current audio channel *****************************************************************************/ -char *libvlc_audio_get_channel( libvlc_instance_t *p_instance, +int libvlc_audio_get_channel( libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) { - char *psz_channel = NULL; - int i_channel = 0; - - i_channel = var_GetInteger( p_instance->p_libvlc_int, "audio-channel" ); - switch( i_channel ) + aout_instance_t *p_aout = GetAOut( p_instance, p_e ); + if( p_aout ) { - case AOUT_VAR_CHAN_RSTEREO: - psz_channel = strdup("reverse"); - break; - case AOUT_VAR_CHAN_STEREO: - psz_channel = strdup("stereo"); - break; - case AOUT_VAR_CHAN_LEFT: - psz_channel = strdup("left"); - break; - case AOUT_VAR_CHAN_RIGHT: - psz_channel = strdup("right"); - break; - case AOUT_VAR_CHAN_DOLBYS: - psz_channel = strdup("dolby"); - break; - default: - psz_channel = strdup("disabled"); - break; + vlc_value_t val; + + var_Get( p_aout, "audio-channels", &val ); + vlc_object_release( p_aout ); + return val.i_int; } - return psz_channel; + return -1; } /***************************************************************************** * libvlc_audio_set_channel : Set the current audio channel *****************************************************************************/ -void libvlc_audio_set_channel( libvlc_instance_t *p_instance, char *psz_channel, +void libvlc_audio_set_channel( libvlc_instance_t *p_instance, int i_channel, libvlc_exception_t *p_e ) { - int i_ret = -1; - int i_channel = 0; - - if( !psz_channel ) + aout_instance_t *p_aout = GetAOut( p_instance, p_e ); + if( p_aout ) { - libvlc_exception_raise( p_e, "Audio track out of range" ); - } - else - { - if( strncmp( psz_channel, "reverse", 7 ) == 0 ) - i_channel = AOUT_VAR_CHAN_RSTEREO; - else if( strncmp( psz_channel, "stereo", 6 ) == 0 ) - i_channel = AOUT_VAR_CHAN_STEREO; - else if( strncmp( psz_channel, "left", 4 ) == 0 ) - i_channel = AOUT_VAR_CHAN_LEFT; - else if( strncmp( psz_channel, "right", 5 ) == 0 ) - i_channel = AOUT_VAR_CHAN_RIGHT; - else if( strncmp( psz_channel, "dolby", 5 ) == 0 ) - i_channel = AOUT_VAR_CHAN_DOLBYS; - - i_ret = var_SetInteger( p_instance->p_libvlc_int, "audio-channel", i_channel ); - if( i_ret < 0 ) + vlc_value_t val; + int i_ret = -1; + + val.i_int = i_channel; + switch( i_channel ) { - libvlc_exception_raise( p_e, "Audio track out of range" ); + case AOUT_VAR_CHAN_RSTEREO: + case AOUT_VAR_CHAN_STEREO: + case AOUT_VAR_CHAN_LEFT: + case AOUT_VAR_CHAN_RIGHT: + case AOUT_VAR_CHAN_DOLBYS: + i_ret = var_Set( p_aout, "audio-channels", val ); + if( i_ret < 0 ) + { + libvlc_exception_raise( p_e, "Failed setting audio channel" ); + vlc_object_release( p_aout ); + return; + } + vlc_object_release( p_aout ); + return; /* Found */ + default: + libvlc_exception_raise( p_e, "Audio channel out of range" ); + break; } + vlc_object_release( p_aout ); } }