shithub: sox

Download patch

ref: 2d33a25b2d2eb0c086b7dd668b5321e5de0699f3
parent: 8480a8f8767bdd1d059d89acec5471a3c9e8e218
author: rrt <rrt>
date: Wed Dec 20 07:45:17 EST 2006

Add support for using in-tree Lua.

Remove redundant "if (p) free(p)" idiom: ANSI free doesn't mind being
given NULL.

--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(SoX, 12.18.3, cbagwell@users.sourceforge.net)
+AC_INIT(SoX, 12.18.3, sox-devel@lists.sourceforge.net)
 AM_INIT_AUTOMAKE
 
 dnl create a config.h file (Automake will add -DHAVE_CONFIG_H)
@@ -143,12 +143,6 @@
 
 dnl LUA, LUA_INCLUDES, LUA_LIBS
 
-with_lua=yes
-
-AC_SUBST(LUA)
-AC_SUBST(LUA_INCLUDES)
-AC_SUBST(LUA_LIBS)
-
 dnl Arguments
 AC_ARG_WITH([lua-prefix],
             [AS_HELP_STRING([--with-lua-prefix=DIR],
@@ -164,6 +158,22 @@
                             [Lua binary and library files are suffixed with
                              ARG])])
 
+dnl Default to built-in Lua; if external Lua supplied, test it
+if test "x$with_lua_prefix" = x && test "x$with_lua_includes" = x && \
+   test "x$with_lua_libraries" = x && test "x$with_lua_suffix" = x; then
+   AC_MSG_WARN("Using built-in Lua")
+   with_lua_prefix=./lua
+   want_internal_lua=yes
+   LUA="$with_lua_prefix/src/lua"
+   LUA_INCLUDES="-I$with_lua_prefix/src"
+   LUA_LIBS="-L$with_lua_prefix/src -llua"
+else
+   want_internal_lua=no
+
+AC_SUBST(LUA)
+AC_SUBST(LUA_INCLUDES)
+AC_SUBST(LUA_LIBS)
+
 dnl LUA
 if test "x$with_lua_prefix" = x; then
     lua_search_path="$PATH"
@@ -172,19 +182,19 @@
 fi
 if test "x$LUA" = x; then
     AC_PATH_PROG([LUA], [lua$with_lua_suffix], [], [$lua_search_path])
-    test "x$LUA" = x && AC_MSG_ERROR([*** Can't build ion without lua])
+    test "x$LUA" = x && AC_MSG_FAILURE([*** Can't build SoX without Lua])
 fi
 
 dnl lua_version
-AC_MSG_CHECKING([for lua version >= 5.1])
+AC_MSG_CHECKING([for Lua version == 5.1])
 lua_version=$($LUA -v 2>&1 | head -n 1 | cut -d' ' -f2)
 case $lua_version in
-0.* | 1.* | 2.* | 3.* | 4.* | 5.0)
-    AC_MSG_RESULT([no (found $lua_version)])
-    with_lua=no
+5.1*)
+    AC_MSG_RESULT([yes (found $lua_version)])
     ;;
 *)
-    AC_MSG_RESULT([yes (found $lua_version)])
+    AC_MSG_RESULT([no (found $lua_version)])
+    AC_MSG_FAILURE([*** Can't build SoX without Lua])
     ;;
 esac
 dnl
@@ -197,7 +207,7 @@
 fi
 save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $LUA_INCLUDES"
-AC_CHECK_HEADERS([lua.h lualib.h], [], [with_lua=no], [])
+AC_CHECK_HEADERS([lua.h lualib.h], [], [AC_MSG_FAILURE([*** Can't build SoX without Lua])], [])
 CFLAGS="$save_CFLAGS"
 
 dnl LUA_LIBS
@@ -211,26 +221,23 @@
 AC_CHECK_LIB([lua$with_lua_suffix],
              [lua_call],
              [LUA_LIBS="$LUA_LIBS -llua$with_lua_suffix $lua_extra_libs"],
-             [with_lua=no],
+             [AC_MSG_FAILURE([*** Can't build SoX without Lua])],
              [$LUA_LIBS $lua_extra_libs])
 
 dnl liblua_version
-AC_MSG_CHECKING([for liblua version >= 5.1])
+AC_MSG_CHECKING([for liblua version == 5.1])
 save_CFLAGS="$CFLAGS"
 save_LIBS="$LIBS"
 CFLAGS="$CFLAGS $LUA_INCLUDES"
 LIBS="$LIBS $LUA_LIBS"
 AC_RUN_IFELSE([AC_LANG_SOURCE([[
-
 #include <lua.h>
 #include <stdlib.h>
-#include <string.h>
 #include <stdio.h>
-
 int main()
 {
     printf("(found %s, %d)... ", LUA_VERSION, LUA_VERSION_NUM);
-    if(LUA_VERSION_NUM >= 501)
+    if (LUA_VERSION_NUM == 501)
         exit(EXIT_SUCCESS);
     exit(EXIT_FAILURE);
 }
@@ -241,14 +248,16 @@
 CFLAGS="$save_CFLAGS"
 LIBS="$save_LIBS"
 
-if test "$with_lua" = yes; then
-   AC_DEFINE(HAVE_LUA, 1, [Define to 1 if you have Lua.])
-fi
+fi dnl Check external Lua
 
+dnl Build internal Lua if needed
+AM_CONDITIONAL([INTERNAL_LUA], [test "$want_internal_lua" = yes])
 
+
 dnl Generate output files.
 AX_CREATE_STDINT_H(src/ststdint.h)
-AC_SUBST(with_alsa with_oss) dnl For play.in
+AC_SUBST(with_alsa) dnl for play.in
+AC_SUBST(with_oss)  dnl for play.in
 AC_CONFIG_FILES(Makefile src/Makefile src/libgsm/Makefile src/libst-config src/play)
 AC_OUTPUT
 
@@ -262,7 +271,6 @@
 echo "MAD MP3 Decoder................... $with_mad"
 echo "LAME MP3 Encoder.................. $with_lame"
 echo "Secret Rabbit Code resampling..... $with_samplerate"
-echo "Lua scripting..................... $with_lua"
 echo
 echo "Configure finished.  Do 'make; make install' to compile and install SoX."
 echo
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -27,10 +27,10 @@
 	  st_i.h stio.c util.c xmalloc.c xmalloc.h getopt.c getopt1.c getopt.h
 
 AM_CFLAGS = $(LUA_INCLUDES)
-AM_LDFLAGS = $(LUA_LIBS) @SAMPLERATE_LIBS@
+AM_LDFLAGS = @SAMPLERATE_LIBS@
 
 sox_SOURCES = sox.c
-sox_LDADD = libst.a libgsm/libgsm.a
+sox_LDADD = libst.a libgsm/libgsm.a $(LUA_LIBS)
 
 all: sox soxmix play rec
 
--- a/src/fade.c
+++ b/src/fade.c
@@ -326,12 +326,9 @@
 {
     fade_t fade = (fade_t) effp->priv;
 
-    if (fade->in_stop_str)
-        free(fade->in_stop_str);
-    if (fade->out_start_str)
-        free(fade->out_start_str);
-    if (fade->out_stop_str)
-        free(fade->out_stop_str);
+    free(fade->in_stop_str);
+    free(fade->out_start_str);
+    free(fade->out_stop_str);
     return (ST_SUCCESS);
 }
 
@@ -342,41 +339,37 @@
 {
     double retval = 0.0, findex = 0.0;
 
-    findex = 1.0 * index / range;
+    /* TODO: does it really have to be contrained to [0.0, 1.0]? */
+    findex = max(0.0, min(1.0, 1.0 * index / range));
 
-    /* todo: are these really needed */
-    findex = (findex < 0 ? 0.0 : findex);
-    findex = (findex > 1.0 ? 1.0 : findex);
+    switch (type) {
+    case FADE_TRI :             /* triangle */
+      retval = findex;
+      break;
 
-    switch (type)
-    {
-        case FADE_TRI : /* triangle  */
-            retval = findex;
-            break;
+    case FADE_QUARTER :         /* quarter of sinewave */
+      retval = sin(findex * M_PI / 2);
+      break;
 
-        case FADE_QUARTER : /*  quarter of sinewave */
-            retval = sin(findex * M_PI / 2);
-            break;
+    case FADE_HALF :          /* half of sinewave... eh cosine wave */
+      retval = (1 - cos(findex * M_PI )) / 2 ;
+      break;
 
-        case FADE_HALF : /* half of sinewave... eh cosine wave */
-            retval = (1 - cos(findex * M_PI )) / 2 ;
-            break;
+    case FADE_LOG :             /* logarithmic */
+      /* 5 means 100 db attenuation. */
+      /* TODO: should this be adopted with bit depth */
+      retval =  pow(0.1, (1 - findex) * 5);
+      break;
 
-        case FADE_LOG : /* logaritmic */
-            /* 5 means 100 db attenuation. */
-            /* todo: should this be adopted with bit depth        */
-            retval =  pow(0.1, (1 - findex) * 5);
-            break;
+    case FADE_PAR :             /* inverted parabola */
+      retval = (1 - (1 - findex)  * (1 - findex));
+      break;
 
-        case FADE_PAR : /* inverted parabola */
-            retval = (1 - (1 - findex)  * (1 - findex));
-            break;
-
-            /* todo: more fade curves? */
-        default : /* Error indicating wrong fade curve */
-            retval = -1.0;
-            break;
-    } /* endswitch */
+    /* TODO: more fade curves? */
+    default :                  /* Error indicating wrong fade curve */
+      retval = -1.0;
+      break;
+    }
 
     return retval;
 }
--- a/src/flanger.c
+++ b/src/flanger.c
@@ -284,11 +284,9 @@
   int c, channels = effp->ininfo.channels;
 
   for (c = 0; c < channels; ++c)
-    if (f->delay_bufs[c] != NULL)
-      free(f->delay_bufs[c]);
+    free(f->delay_bufs[c]);
 
-  if (f->lfo != NULL)
-    free(f->lfo);
+  free(f->lfo);
 
   memset(f, 0, sizeof(*f));
 
--- a/src/handlers.c
+++ b/src/handlers.c
@@ -107,9 +107,7 @@
   st_highp_effect_fn,
   st_lowpass_effect_fn,
   st_lowp_effect_fn,
-#ifdef HAVE_LUA
   st_lua_effect_fn,
-#endif
   st_mask_effect_fn,
   st_mcompand_effect_fn,
   st_noiseprof_effect_fn,
--- a/src/lintlib.c
+++ b/src/lintlib.c
@@ -20,8 +20,6 @@
 
 #include "st_i.h"
 
-#ifdef HAVE_LUA_H
-
 #include <lua.h>
 #include <lauxlib.h>
 #include <luaconf.h>
@@ -165,5 +163,3 @@
   luaL_register(L, STRING(LIBNAME), funcs);
   return 1;
 }
-
-#endif
--- a/src/lua.c
+++ b/src/lua.c
@@ -32,8 +32,6 @@
  
 #include "st_i.h"
 
-#ifdef HAVE_LUA
-
 #include <assert.h>
 #include <string.h>
 #include <lua.h>
@@ -280,5 +278,3 @@
 {
   return &st_lua_effect;
 }
-
-#endif
--- a/src/lua/Makefile
+++ b/src/lua/Makefile
@@ -5,7 +5,7 @@
 # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
 
 # Your platform. See PLATS for possible values.
-PLAT= none
+PLAT= generic
 
 # Where to install. The installation starts in the src directory, so take care
 # if INSTALL_TOP is not an absolute path. (Man pages are installed from the
--- a/src/lua/src/Makefile
+++ b/src/lua/src/Makefile
@@ -5,7 +5,7 @@
 # == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
 
 # Your platform. See PLATS for possible values.
-PLAT= none
+PLAT= generic
 
 CC= gcc
 CFLAGS= -O2 -Wall $(MYCFLAGS)
--- a/src/mcompand.c
+++ b/src/mcompand.c
@@ -647,28 +647,21 @@
   comp_band_t l;
   int band;
 
-  if (c->band_buf1) {
-    free(c->band_buf1);
-    c->band_buf1 = 0;
-  }
-  if (c->band_buf2) {
-    free(c->band_buf2);
-    c->band_buf2 = 0;
-  }
-  if (c->band_buf3) {
-    free(c->band_buf3);
-    c->band_buf3 = 0;
-  }
+  free(c->band_buf1);
+  c->band_buf1 = NULL;
+  free(c->band_buf2);
+  c->band_buf2 = NULL;
+  free(c->band_buf3);
+  c->band_buf3 = NULL;
 
-  for (band=0;band<c->nBands;++band) {
+  for (band = 0; band < c->nBands; band++) {
     l = &c->bands[band];
-    free((char *) l->transferOuts);
-    free((char *) l->transferIns);
-    free((char *) l->decayRate);
-    free((char *) l->attackRate);
-    if (l->delay_buf)
-      free((char *) l->delay_buf);
-    free((char *) l->volume);
+    free(l->transferOuts);
+    free(l->transferIns);
+    free(l->decayRate);
+    free(l->attackRate);
+    free(l->delay_buf);
+    free(l->volume);
     if (l->topfreq != 0) {
       free(l->filter.xy_low);
       free(l->filter.xy_high);
@@ -677,7 +670,7 @@
   free(c->bands);
   c->bands = 0;
 
-  return (ST_SUCCESS);
+  return ST_SUCCESS;
 }
 
 static st_effect_t st_mcompand_effect = {
--- a/src/noiseprof.c
+++ b/src/noiseprof.c
@@ -222,8 +222,3 @@
 {
     return &st_noiseprof_effect;
 }
-
-/* For Emacs:
-   Local Variables:
-   c-basic-offset: 4
-*/
--- a/src/noisered.c
+++ b/src/noisered.c
@@ -313,12 +313,8 @@
 
     for (i = 0; i < effp->ininfo.channels; i ++) {
         chandata_t* chan = &(data->chandata[i]);
-        if (chan->lastwindow != NULL) {
-            free(chan->lastwindow);
-        }
-        if (chan->window != NULL) {
-            free(chan->window);
-        }
+        free(chan->lastwindow);
+        free(chan->window);
         free(chan->smoothing);
         free(chan->noisegate);
     }
@@ -343,8 +339,3 @@
 {
     return &st_noisered_effect;
 }
-
-/* For Emacs:
-  Local Variables:
-  c-basic-offset: 4
-*/
--- a/src/phaser.c
+++ b/src/phaser.c
@@ -242,7 +242,7 @@
                 done++;
                 phaser->fade_out--;
         }
-        /* samples playd, it remains */
+        /* samples played, it remains */
         *osamp = done;
         if (phaser->fade_out == 0)
             return ST_EOF;
@@ -257,10 +257,8 @@
 {
         phaser_t phaser = (phaser_t) effp->priv;
 
-        free((char *) phaser->phaserbuf);
-        phaser->phaserbuf = (double *) -1;   /* guaranteed core dump */
-        free((char *) phaser->lookup_tab);
-        phaser->lookup_tab = (int *) -1;   /* guaranteed core dump */
+        free(phaser->phaserbuf);
+        free(phaser->lookup_tab);
         return (ST_SUCCESS);
 }
 
--- a/src/polyphas.c
+++ b/src/polyphas.c
@@ -635,17 +635,16 @@
  */
 static int st_poly_stop(eff_t effp)
 {
-    poly_t rate = (poly_t) effp->priv;
-    polystage *s;
+    poly_t rate = (poly_t)effp->priv;
     st_size_t k;
 
-    for(k = 0; k <= rate->total; k++) {
-      s = rate->stage[k];
-      free((void *) s->window);
-      if (s->filt_array) free((void *) s->filt_array);
-      free((void *) s);
+    for (k = 0; k <= rate->total; k++) {
+      free(rate->stage[k]->window);
+      free(rate->stage[k]->filt_array);
+      free(rate->stage[k]);
     }
-    return (ST_SUCCESS);
+
+    return ST_SUCCESS;
 }
 
 static st_effect_t st_polyphase_effect = {
--- a/src/silence.c
+++ b/src/silence.c
@@ -654,12 +654,9 @@
 {
     silence_t silence = (silence_t) effp->priv;
 
-    if (silence->window)
-        free(silence->window);
-    if (silence->start_holdoff)
-        free(silence->start_holdoff);
-    if (silence->stop_holdoff)
-        free(silence->stop_holdoff);
+    free(silence->window);
+    free(silence->start_holdoff);
+    free(silence->stop_holdoff);
     return(ST_SUCCESS);
 }
 
--- a/src/st_i.h
+++ b/src/st_i.h
@@ -1,5 +1,3 @@
-#ifndef ST_I_H
-#define ST_I_H
 /*
  * Sound Tools Internal - October 11, 2001
  *
@@ -12,6 +10,8 @@
  * Chris Bagwell And Sundry Contributors are not responsible for
  * the consequences of using this software.
  */
+#ifndef ST_I_H
+#define ST_I_H
 
 #include "stconfig.h"
 #include "st.h"
@@ -286,9 +286,7 @@
 extern const st_effect_t *st_highp_effect_fn(void);
 extern const st_effect_t *st_lowpass_effect_fn(void);
 extern const st_effect_t *st_lowp_effect_fn(void);
-#ifdef HAVE_LUA
 extern const st_effect_t *st_lua_effect_fn(void);
-#endif
 extern const st_effect_t *st_mask_effect_fn(void);
 extern const st_effect_t *st_mcompand_effect_fn(void);
 extern const st_effect_t *st_noiseprof_effect_fn(void);
@@ -324,11 +322,9 @@
 int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
 int st_resample_stop(eff_t effp);
 
-#ifdef HAVE_LUA
 #include <lua.h>
 /* Needed in lua.c */
 LUALIB_API int luaopen_int (lua_State *L);
 void createmeta(lua_State *L, const char *name);
-#endif
 
 #endif
--- a/src/stio.c
+++ b/src/stio.c
@@ -152,10 +152,8 @@
 
 input_error:
 
-    if (ft->filename)
-        free(ft->filename);
-    if (ft->filetype)
-        free(ft->filetype);
+    free(ft->filename);
+    free(ft->filetype);
     free(ft);
     return NULL;
 }
@@ -280,10 +278,8 @@
 
 output_error:
 
-    if (ft->filename)
-        free(ft->filename);
-    if (ft->filetype)
-        free(ft->filetype);
+    free(ft->filename);
+    free(ft->filetype);
     free(ft);
     return NULL;
 }
@@ -304,6 +300,7 @@
     return (*ft->h->write)(ft, buf, len);
 }
 
+/* N.B. The file (if any) may already have been deleted. */
 int st_close(ft_t ft)
 {
     int rc;
@@ -315,14 +312,11 @@
 
     if (!(ft->h->flags & ST_FILE_NOSTDIO))
         fclose(ft->fp);
-    if (ft->filename)
-        free(ft->filename);
-    if (ft->filetype)
-        free(ft->filetype);
+    free(ft->filename);
+    free(ft->filetype);
     /* Currently, since startread() mallocs comments, stopread
-     * is expected to also free it.
-     */
-    if (ft->mode == 'w' && ft->comment)
+     * is expected to also free it. */
+    if (ft->mode == 'w')
         free(ft->comment);
 
     return rc;
--- a/src/trim.c
+++ b/src/trim.c
@@ -189,10 +189,8 @@
 {
     trim_t trim = (trim_t) effp->priv;
 
-    if (trim->start_str)
-        free(trim->start_str);
-    if (trim->length_str)
-        free(trim->length_str);
+    free(trim->start_str);
+    free(trim->length_str);
 
     return (ST_SUCCESS);
 }
--- a/src/wav.c
+++ b/src/wav.c
@@ -1116,16 +1116,12 @@
 
         ft->st_errno = ST_SUCCESS;
 
-    if (wav->packet) free(wav->packet);
-    if (wav->samples) free(wav->samples);
-    if (wav->iCoefs) free(wav->iCoefs);
+    free(wav->packet);
+    free(wav->samples);
+    free(wav->iCoefs);
+    free(ft->comment);
+    ft->comment = NULL;
 
-    if (ft->comment) 
-    {
-        free(ft->comment);
-        ft->comment = 0;
-    }
-
     switch (ft->info.encoding)
     {
     case ST_ENCODING_GSM:
@@ -1614,17 +1610,15 @@
             wavgsmstopwrite(ft);
             break;
         }
-        if (wav->packet) free(wav->packet);
-        if (wav->samples) free(wav->samples);
-        if (wav->iCoefs) free(wav->iCoefs);
+        free(wav->packet);
+        free(wav->samples);
+        free(wav->iCoefs);
 
         /* Flush any remaining data */
         if (wav->formatTag != WAVE_FORMAT_IMA_ADPCM &&
             wav->formatTag != WAVE_FORMAT_ADPCM &&
             wav->formatTag != WAVE_FORMAT_GSM610)
-        {
             st_rawstopwrite(ft);
-        }
 
         /* All samples are already written out. */
         /* If file header needs fixing up, for example it needs the */
--- a/src/xa.c
+++ b/src/xa.c
@@ -182,23 +182,10 @@
     xa->bufPos = xa->blockSize;
 
     /* Allocate memory for the block buffer */
-    xa->buf = (unsigned char *) xcalloc(1, xa->blockSize);
-    if (xa->buf == NULL) {
-        st_fail_errno(ft, ST_ENOMEM, "Unable to allocate block buffer");
-        return ST_EOF;
-    }
+    xa->buf = (unsigned char *)xcalloc(1, xa->blockSize);
     
     /* Allocate memory for the state */
-    xa->state = (xa_state_t *) xcalloc(sizeof(xa_state_t), ft->info.channels);
-    if (xa->state == NULL) {
-        /* Free xa->buf */
-        free(xa->buf);
-        xa->buf = NULL;
-        
-        /* Return error */
-        st_fail_errno(ft, ST_ENOMEM, "Unable to allocate state variables");
-        return ST_EOF;
-    }
+    xa->state = (xa_state_t *)xcalloc(sizeof(xa_state_t), ft->info.channels);
     
     /* Final initialization */
     xa->bytesDecoded = 0;
@@ -292,14 +279,10 @@
     ft->st_errno = ST_SUCCESS;
 
     /* Free memory */
-    if (xa->buf != NULL) {
-        free(xa->buf);
-        xa->buf = NULL;
-    }
-    if (xa->state != NULL) {
-        free(xa->state);
-        xa->state = NULL;
-    }
+    free(xa->buf);
+    xa->buf = NULL;
+    free(xa->state);
+    xa->state = NULL;
     
     return ST_SUCCESS;
 }
--- a/src/xmalloc.c
+++ b/src/xmalloc.c
@@ -45,7 +45,7 @@
 }
 
 /*
- * Perform a calloc, and abort if not possible.
+ * Perform a calloc; abort if not possible.
  */
 void *xcalloc(size_t nmemb, size_t size)
 {