+ p_filter->fmt_out.i_codec = chain_output_format.i_format;
+ p_filter->pf_audio_buffer_new = aout_FilterBufferNew;
+
+ /* try to find the requested filter */
+ if( i_visual == 2 ) /* this can only be a visualization module */
+ {
+ p_filter->p_module = module_need( p_filter, "visualization2",
+ psz_parser, true );
+ }
+ else /* this can be a audio filter module as well as a visualization module */
+ {
+ p_filter->p_module = module_need( p_filter, "audio filter",
+ psz_parser, true );
+
+ if ( p_filter->p_module == NULL )
+ {
+ /* if the filter requested a special format, retry */
+ if ( !( AOUT_FMTS_IDENTICAL( &p_filter->fmt_in.audio,
+ &chain_input_format )
+ && AOUT_FMTS_IDENTICAL( &p_filter->fmt_out.audio,
+ &chain_output_format ) ) )
+ {
+ aout_FormatPrepare( &p_filter->fmt_in.audio );
+ aout_FormatPrepare( &p_filter->fmt_out.audio );
+ p_filter->p_module = module_need( p_filter,
+ "audio filter",
+ psz_parser, true );
+ }
+ /* try visual filters */
+ else
+ {
+ memcpy( &p_filter->fmt_in.audio, &chain_output_format,
+ sizeof(audio_sample_format_t) );
+ memcpy( &p_filter->fmt_out.audio, &chain_output_format,
+ sizeof(audio_sample_format_t) );
+ p_filter->p_module = module_need( p_filter,
+ "visualization2",
+ psz_parser, true );
+ }
+ }
+ }
+
+ /* failure */
+ if ( p_filter->p_module == NULL )
+ {
+ msg_Err( p_aout, "cannot add user filter %s (skipped)",
+ psz_parser );