#include "filter_sox.h"
#include <framework/mlt_frame.h>
-#include "valerie/valerie_tokeniser.c"
+#include <framework/mlt_tokeniser.h>
#include <stdio.h>
#include <stdlib.h>
*/
static int create_effect( mlt_filter this, char *value, int count, int channel, int frequency )
{
- valerie_tokeniser tokeniser = valerie_tokeniser_init();
+ mlt_tokeniser tokeniser = mlt_tokeniser_init();
eff_t eff = mlt_pool_alloc( sizeof( struct st_effect ) );
char id[ 256 ];
int error = 1;
// Tokenise the effect specification
- valerie_tokeniser_parse_new( tokeniser, value, " " );
+ mlt_tokeniser_parse_new( tokeniser, value, " " );
// Locate the effect
int opt_count = st_geteffect_opt( eff, tokeniser->count, tokeniser->tokens );
if ( error == 1 )
mlt_pool_release( eff );
- valerie_tokeniser_close( tokeniser );
+ mlt_tokeniser_close( tokeniser );
return error;
}
double *smooth_buffer = mlt_properties_get_data( filter_properties, "smooth_buffer", NULL );
double max_gain = mlt_properties_get_double( filter_properties, "max_gain" );
+ // Default the maximum gain factor to 20dBFS
if ( max_gain == 0 )
max_gain = 10.0;
+ // The smoothing buffer prevents radical shifts in the gain level
if ( window > 0 && smooth_buffer != NULL )
{
int smooth_index = mlt_properties_get_int( filter_properties, "_smooth_index" );
smooth_buffer[ smooth_index ] = rms;
+
+ // Ignore very small values that adversely affect the mean
if ( rms > AMPLITUDE_MIN )
mlt_properties_set_int( filter_properties, "_smooth_index", ( smooth_index + 1 ) % window );
+
+ // Smoothing is really just a mean over the past N values
normalised_gain = AMPLITUDE_NORM / mean( smooth_buffer, window );
}
else if ( rms > 0 )
}
//printf("filter_sox: rms %.3f gain %.3f\n", rms, normalised_gain );
+
+ // Govern the maximum gain
if ( normalised_gain > max_gain )
normalised_gain = max_gain;
}
sprintf( id, "_effect_%d_%d", j, i );
e = mlt_properties_get_data( filter_properties, id, NULL );
- // Apply the effect
+ // We better have this guy
if ( e != NULL )
{
float saved_gain = 1.0;
+ // XXX: hack to apply the normalised gain level to the vol effect
if ( normalise && strcmp( e->name, "vol" ) == 0 )
{
float *f = ( float * )( e->priv );
*f = saved_gain * normalised_gain;
}
+ // Apply the effect
if ( ( * e->h->flow )( e, input_buffer, output_buffer, &isamp, &osamp ) == ST_SUCCESS )
{
+ // Swap input and output buffer pointers for subsequent effects
p = input_buffer;
input_buffer = output_buffer;
output_buffer = p;
}
+ // XXX: hack to restore the original vol gain to prevent accumulation
if ( normalise && strcmp( e->name, "vol" ) == 0 )
{
float *f = ( float * )( e->priv );
{
if ( frame->get_audio != NULL )
{
+ // Add the filter to the frame
mlt_frame_push_audio( frame, frame->get_audio );
mlt_frame_push_audio( frame, this );
frame->get_audio = filter_get_audio;