X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Finput.c;h=cf1a6031d5ac56d6b4469fb099f0576287dfad80;hb=91c06c7d90d5c2ac34167cb5ab9e41ca35db9c89;hp=747842cfb2196fc4d645e04aba85413e5df3d543;hpb=4b531b445fa95a23c25942042e1c7402b96764d6;p=vlc diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 747842cfb2..cf1a6031d5 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -36,7 +36,8 @@ #include #include -#include /* for input_thread_t and i_pts_delay */ +#include +#include /* for vout_Request */ #ifdef HAVE_ALLOCA_H # include @@ -60,10 +61,13 @@ static int EqualizerCallback( vlc_object_t *, char const *, static int ReplayGainCallback( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); static void ReplayGainSelect( aout_instance_t *, aout_input_t * ); + +static vout_thread_t *RequestVout( void *, + vout_thread_t *, video_format_t * ); /***************************************************************************** * aout_InputNew : allocate a new input and rework the filter pipeline *****************************************************************************/ -int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) +int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_request_vout_t *p_request_vout ) { audio_sample_format_t chain_input_format; audio_sample_format_t chain_output_format; @@ -79,6 +83,17 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) aout_FifoInit( p_aout, &p_input->fifo, p_aout->mixer.mixer.i_rate ); p_input->p_first_byte_to_mix = NULL; + /* */ + if( p_request_vout ) + { + p_input->request_vout = *p_request_vout; + } + else + { + p_input->request_vout.pf_request_vout = RequestVout; + p_input->request_vout.p_private = p_aout; + } + /* Prepare format structure */ memcpy( &chain_input_format, &p_input->input, sizeof(audio_sample_format_t) ); @@ -269,6 +284,11 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) vlc_object_attach( p_filter , p_aout ); + p_filter->request_vout = p_input->request_vout; + p_filter->p_owner = malloc( sizeof(*p_filter->p_owner) ); + p_filter->p_owner->p_aout = p_aout; + p_filter->p_owner->p_input = p_input; + /* try to find the requested filter */ if( i_visual == 2 ) /* this can only be a visualization module */ { @@ -326,6 +346,7 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) msg_Err( p_aout, "cannot add user filter %s (skipped)", psz_parser ); + free( p_filter->p_owner ); vlc_object_detach( p_filter ); vlc_object_release( p_filter ); @@ -345,6 +366,7 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) psz_parser ); module_unneed( p_filter, p_filter->p_module ); + free( p_filter->p_owner ); vlc_object_detach( p_filter ); vlc_object_release( p_filter ); @@ -506,7 +528,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, aout_InputDelete( p_aout, p_input ); - aout_InputNew( p_aout, p_input ); + aout_InputNew( p_aout, p_input, &p_input->request_vout ); p_input->p_first_byte_to_mix = p_first_byte_to_mix; p_input->fifo = fifo; p_input->b_paused = b_paused; @@ -782,6 +804,13 @@ static void inputResamplingStop( aout_input_t *p_input ) } } +static vout_thread_t *RequestVout( void *p_private, + vout_thread_t *p_vout, video_format_t *p_fmt ) +{ + aout_instance_t *p_aout = p_private; + return vout_Request( p_aout, p_vout, p_fmt ); +} + static int ChangeFiltersString( aout_instance_t * p_aout, const char* psz_variable, const char *psz_name, bool b_add ) {