#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 );
sprintf( id, "_effect_%d_%d", count, channel );
// Save the effect state
- mlt_properties_set_data( mlt_filter_properties( this ), id, eff, 0, mlt_pool_release, NULL );
+ mlt_properties_set_data( MLT_FILTER_PROPERTIES( this ), id, eff, 0, mlt_pool_release, NULL );
error = 0;
}
}
if ( error == 1 )
mlt_pool_release( eff );
- valerie_tokeniser_close( tokeniser );
+ mlt_tokeniser_close( tokeniser );
return error;
}
static int filter_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
{
// Get the properties of the frame
- mlt_properties properties = mlt_frame_properties( frame );
+ mlt_properties properties = MLT_FRAME_PROPERTIES( frame );
// Get the filter service
mlt_filter filter = mlt_frame_pop_audio( frame );
// Get the filter properties
- mlt_properties filter_properties = mlt_filter_properties( filter );
+ mlt_properties filter_properties = MLT_FILTER_PROPERTIES( filter );
// Get the properties
st_sample_t *input_buffer = mlt_properties_get_data( filter_properties, "input_buffer", NULL );
int i; // channel
int count = mlt_properties_get_int( filter_properties, "effect_count" );
- // Restore the original get_audio
- frame->get_audio = mlt_frame_pop_audio( frame );
-
// Get the producer's audio
mlt_frame_get_audio( frame, buffer, format, frequency, &channels_avail, samples );
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 );
static mlt_frame filter_process( mlt_filter this, mlt_frame frame )
{
- if ( frame->get_audio != NULL )
+ if ( mlt_frame_is_test_audio( frame ) == 0 )
{
- mlt_frame_push_audio( frame, frame->get_audio );
+ // Add the filter to the frame
mlt_frame_push_audio( frame, this );
- frame->get_audio = filter_get_audio;
+ mlt_frame_push_audio( frame, filter_get_audio );
// Parse the window property and allocate smoothing buffer if needed
- mlt_properties properties = mlt_filter_properties( this );
+ mlt_properties properties = MLT_FILTER_PROPERTIES( this );
int window = mlt_properties_get_int( properties, "window" );
if ( mlt_properties_get( properties, "smooth_buffer" ) == NULL && window > 1 )
{
{
void *input_buffer = mlt_pool_alloc( BUFFER_LEN );
void *output_buffer = mlt_pool_alloc( BUFFER_LEN );
- mlt_properties properties = mlt_filter_properties( this );
+ mlt_properties properties = MLT_FILTER_PROPERTIES( this );
this->process = filter_process;