+ p_filter->p_module = module_need( p_filter, "visualization",
+ 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->input,
+ &chain_input_format )
+ && AOUT_FMTS_IDENTICAL( &p_filter->output,
+ &chain_output_format ) ) )
+ {
+ aout_FormatPrepare( &p_filter->input );
+ aout_FormatPrepare( &p_filter->output );
+ p_filter->p_module = module_need( p_filter,
+ "audio filter",
+ psz_parser, true );
+ }
+ /* try visual filters */
+ else
+ {
+ memcpy( &p_filter->input, &chain_output_format,
+ sizeof(audio_sample_format_t) );
+ memcpy( &p_filter->output, &chain_output_format,
+ sizeof(audio_sample_format_t) );
+ p_filter->p_module = module_need( p_filter,
+ "visualization",
+ psz_parser, true );
+ }
+ }
+ }
+
+ /* failure */
+ if ( p_filter->p_module == NULL )
+ {
+ 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 );
+
+ psz_parser = psz_next;
+ continue;
+ }
+
+ /* complete the filter chain if necessary */
+ if ( !AOUT_FMTS_IDENTICAL( &chain_input_format, &p_filter->input ) )
+ {
+ if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_filters,
+ &p_input->i_nb_filters,
+ &chain_input_format,
+ &p_filter->input ) < 0 )