#include <string.h>
#include <math.h>
+// TODO: does not support multiple effects with SoX v14.1.0+
+
#ifdef SOX14
# include <sox.h>
# define ST_EOF SOX_EOF
# define ST_SUCCESS SOX_SUCCESS
# define st_sample_t sox_sample_t
# define eff_t sox_effect_t*
-# define st_size_t sox_size_t
# define ST_LIB_VERSION_CODE SOX_LIB_VERSION_CODE
# define ST_LIB_VERSION SOX_LIB_VERSION
+# if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,2,0))
+# define st_size_t size_t
+# else
+# define st_size_t sox_size_t
+# endif
# define ST_SIGNED_WORD_TO_SAMPLE(d,clips) SOX_SIGNED_16BIT_TO_SAMPLE(d,clips)
-# define ST_SSIZE_MIN SOX_SSIZE_MIN
-# define ST_SAMPLE_TO_SIGNED_WORD(d,clips) SOX_SAMPLE_TO_SIGNED_16BIT(d,clips)
+# if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,1,0))
+# define ST_SSIZE_MIN SOX_SAMPLE_MIN
+# else
+# define ST_SSIZE_MIN SOX_SSIZE_MIN
+# endif
+# define ST_SAMPLE_TO_SIGNED_WORD(d,clips) SOX_SAMPLE_TO_SIGNED_16BIT(d,clips)
#else
# include <st.h>
#endif
return mean;
}
+#if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,1,0))
+static void delete_effect( eff_t effp )
+{
+ free( effp->priv );
+ free( (void*)effp->in_encoding );
+ free( effp );
+}
+#endif
+
/** Create an effect state instance for a channels
*/
static int create_effect( mlt_filter this, char *value, int count, int channel, int frequency )
{
mlt_tokeniser tokeniser = mlt_tokeniser_init();
-#ifdef SOX14
- eff_t eff = mlt_pool_alloc( sizeof( sox_effect_t ) );
-#else
- eff_t eff = mlt_pool_alloc( sizeof( struct st_effect ) );
-#endif
char id[ 256 ];
int error = 1;
return error;
// Locate the effect
+ mlt_destructor effect_destructor = mlt_pool_release;
#ifdef SOX14
//fprintf(stderr, "%s: effect %s count %d\n", __FUNCTION__, tokeniser->tokens[0], tokeniser->count );
+#if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,1,0))
+ sox_effect_handler_t const *eff_handle = sox_find_effect( tokeniser->tokens[0] );
+ if (eff_handle == NULL ) return error;
+ eff_t eff = sox_create_effect( eff_handle );
+ effect_destructor = ( mlt_destructor ) delete_effect;
+ sox_encodinginfo_t *enc = calloc( 1, sizeof( sox_encodinginfo_t ) );
+ enc->encoding = SOX_ENCODING_SIGN2;
+ enc->bits_per_sample = 16;
+ eff->in_encoding = eff->out_encoding = enc;
+#else
+ eff_t eff = mlt_pool_alloc( sizeof( sox_effect_t ) );
sox_create_effect( eff, sox_find_effect( tokeniser->tokens[0] ) );
+#endif
int opt_count = tokeniser->count - 1;
#else
+ eff_t eff = mlt_pool_alloc( sizeof( struct st_effect ) );
int opt_count = st_geteffect_opt( eff, tokeniser->count, tokeniser->tokens );
#endif
#endif
{
// Set the sox signal parameters
+#if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,1,0))
+ eff->in_signal.rate = frequency;
+ eff->out_signal.rate = frequency;
+ eff->in_signal.channels = 1;
+ eff->out_signal.channels = 1;
+ eff->in_signal.precision = 16;
+ eff->out_signal.precision = 16;
+ eff->in_signal.length = 0;
+ eff->out_signal.length = 0;
+#else
eff->ininfo.rate = frequency;
eff->outinfo.rate = frequency;
eff->ininfo.channels = 1;
eff->outinfo.channels = 1;
+#endif
// Start the effect
#ifdef SOX14
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, effect_destructor, NULL );
error = 0;
}
}
}
// Some error occurred so delete the temp effect state
if ( error == 1 )
- mlt_pool_release( eff );
+ effect_destructor( eff );
mlt_tokeniser_close( tokeniser );
eff_t e = mlt_properties_get_data( filter_properties, id, NULL );
// Validate the existing effect state
+#if (ST_LIB_VERSION_CODE >= ST_LIB_VERSION(14,1,0))
+ if ( e != NULL && ( e->in_signal.rate != *frequency ||
+ e->out_signal.rate != *frequency ) )
+#else
if ( e != NULL && ( e->ininfo.rate != *frequency ||
e->outinfo.rate != *frequency ) )
+#endif
e = NULL;
// (Re)Create the effect state