X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Finput.c;h=53d475437bde9ba0ef65093b5b6ba503feb47800;hb=66fa4d5ccca8fc1490b73a1daa0fcd31c49042ce;hp=3fa74c15955e3543e518967fe3eda1c847be889b;hpb=b32aa8460305eb485419ab3dc405f3e7a8c9290b;p=vlc diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 3fa74c1595..53d475437b 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -272,7 +272,8 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) /* Allocate in the heap, it is more convenient for the decoder. */ p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP; - p_input->b_error = 0; + p_input->b_error = VLC_FALSE; + p_input->b_restart = VLC_FALSE; return 0; } @@ -305,6 +306,26 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, { mtime_t start_date; + if( p_input->b_restart ) + { + aout_fifo_t fifo, dummy_fifo; + byte_t *p_first_byte_to_mix; + + vlc_mutex_lock( &p_aout->mixer_lock ); + + /* A little trick to avoid loosing our input fifo */ + aout_FifoInit( p_aout, &dummy_fifo, p_aout->mixer.mixer.i_rate ); + p_first_byte_to_mix = p_input->p_first_byte_to_mix; + fifo = p_input->fifo; + p_input->fifo = dummy_fifo; + aout_InputDelete( p_aout, p_input ); + aout_InputNew( p_aout, p_input ); + p_input->p_first_byte_to_mix = p_first_byte_to_mix; + p_input->fifo = fifo; + + vlc_mutex_unlock( &p_aout->mixer_lock ); + } + /* We don't care if someone changes the start date behind our back after * this. We'll deal with that when pushing the buffer, and compensate * with the next incoming buffer. */ @@ -458,12 +479,9 @@ static int VisualizationCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { aout_instance_t *p_aout = (aout_instance_t *)p_this; - vlc_value_t val; char *psz_mode = newval.psz_string; - char *psz_filter; - - var_Get( p_aout, "audio-filter", &val ); - psz_filter = val.psz_string; + vlc_value_t val; + int i; if( !psz_mode || !*psz_mode ) { @@ -472,38 +490,28 @@ static int VisualizationCallback( vlc_object_t *p_this, char const *psz_cmd, } else { - if( !psz_filter || !*psz_filter ) + if( !strcmp( "goom", psz_mode ) ) { - if( !strcmp( "goom", psz_mode) ) - val.psz_string = "goom"; - else - val.psz_string = "visual"; - var_Set( p_aout, "audio-filter", val ); + val.psz_string = "goom"; } else { - if( strstr( psz_filter, "visual" ) == NULL ) - { - psz_filter = realloc( psz_filter, strlen( psz_filter ) + 20 ); - strcat( psz_filter, ",visual" ); - } - val.psz_string = psz_filter; - var_Set( p_aout, "audio-filter", val ); + val.psz_string = psz_mode; + var_Create( p_aout, "effect-list", VLC_VAR_STRING ); + var_Set( p_aout, "effect-list", val ); + + val.psz_string = "visual"; } + + var_Set( p_aout, "audio-filter", val ); } - if( psz_mode && *psz_mode ) + /* That sucks */ + for( i = 0; i < p_aout->i_nb_inputs; i++ ) { - vlc_value_t val; - val.psz_string = psz_mode; - var_Create( p_aout, "effect-list", VLC_VAR_STRING ); - var_Set( p_aout, "effect-list", val); + p_aout->pp_inputs[i]->b_restart = VLC_TRUE; } - if( psz_filter ) free( psz_filter ); - - aout_Restart( p_aout ); - return VLC_SUCCESS; }