filter_sox.c: bugfix (2263114) build on sox 14.2.0.
[melted] / src / modules / sox / filter_sox.c
index c1676bc..42bf812 100644 (file)
 #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
@@ -69,16 +79,20 @@ static inline double mean( double *buf, int count )
        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;
 
@@ -88,11 +102,23 @@ static int create_effect( mlt_filter this, char *value, int count, int channel,
                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))
+       eff_t eff = sox_create_effect( sox_find_effect( tokeniser->tokens[0] ) );
+       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
        
@@ -107,10 +133,21 @@ static int create_effect( mlt_filter this, char *value, int count, int channel,
 #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
@@ -123,14 +160,14 @@ static int create_effect( mlt_filter this, char *value, int count, int channel,
                                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 );
        
@@ -213,8 +250,13 @@ static int filter_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format
                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