+ }
+}
+
+/*****************************************************************************
+ * OpenFilter:
+ *****************************************************************************/
+static int OpenFilter( vlc_object_t *p_this )
+{
+ filter_t *p_filter = (filter_t *)p_this;
+
+ audio_format_t fmt_in = p_filter->fmt_in.audio;
+ audio_format_t fmt_out = p_filter->fmt_out.audio;
+
+ fmt_in.i_format = p_filter->fmt_in.i_codec;
+ fmt_out.i_format = p_filter->fmt_out.i_codec;
+
+ if( !IsSupported( &fmt_in, &fmt_out ) )
+ return -1;
+
+ p_filter->pf_audio_filter = Filter;
+
+ return 0;
+}
+
+/*****************************************************************************
+ * Filter:
+ *****************************************************************************/
+static block_t *Filter( filter_t *p_filter, block_t *p_block )
+{
+ if( !p_block || !p_block->i_nb_samples )
+ {
+ if( p_block )
+ block_Release( p_block );
+ return NULL;
+ }
+
+ size_t i_out_size = p_block->i_nb_samples *
+ p_filter->fmt_out.audio.i_bitspersample *
+ p_filter->fmt_out.audio.i_channels / 8;
+
+ block_t *p_out = filter_NewAudioBuffer( p_filter, i_out_size );
+ if( !p_out )
+ {
+ msg_Warn( p_filter, "can't get output buffer" );
+ block_Release( p_block );
+ return NULL;
+ }
+
+ p_out->i_nb_samples = p_block->i_nb_samples;
+ p_out->i_dts = p_block->i_dts;
+ p_out->i_pts = p_block->i_pts;
+ p_out->i_length = p_block->i_length;
+
+ DoWork( p_filter, p_block, p_out );
+
+ block_Release( p_block );
+
+ return p_out;
+}
+
+/*****************************************************************************
+ * Helpers:
+ *****************************************************************************/
+static bool IsSupported( const audio_format_t *p_input, const audio_format_t *p_output )
+{
+ if( p_input->i_format != VLC_CODEC_FL32 ||
+ p_input->i_format != p_output->i_format ||
+ p_input->i_rate != p_output->i_rate )
+ return false;