Martin Guy <[email protected]> wrote:
> On 26/12/2015, Eric Wong <[email protected]> wrote:
> > I've started maintaining a branch of things in their absence.
>
> Thanks Eric. I have three commits, all regarding "sox spectrogram":
> - remove arbitrary limit on spectrogram output height (was 1200)
Seems alright, did you check for possible integer overflow issues
from raising the limit? I was mildly alarmed at this:
+ if (end) memset(p->window, 0, sizeof(*(p->window)) * p->dft_size);
Until I noticed p->window was allocated with calloc which does overflow
checking:
p->window = lsx_calloc(p->dft_size + 1, sizeof(*(p->window)));
> - add "spectrogram -n" flag to normalize the image brightness
> regardless of audio file loudness
No issues here.
> - add FFTW3 support, which is between 150 and 250 times faster than
> the slow built-in FFT routine
Nice! I've tested with/without FFTW3 installed and can confirm the
speedup. I do have problems with eyesight and do not see well;
so I can't comment on actual images.
I've made some minor edits to configure.ac for portability and
robustness (I realize you're taking nearby statements as a
guideline, but I think we can do better when introducing new code)
- prefer AS_IF macro to generate portable "if" statements in sh
I also realize you're only testing auto-generated variables,
so the next two are unnecessary, but can aid in avoiding red flags
for other reviewers:
- avoid "-a" with "test" since it is error-prone compared to
using "&&" and multiple "test" statements.
E.g. test -n "$x" -a "$a" = "$b"
is buggy if "$x" is "="
(example taken from Documentation/CodingGuidelines in git.git)
- prefix variables with "x" in "test" conditionals.
E.g. test "$var" = yes
is buggy if "$var" is "-n" or other "test" operators
We avoid this problem with: test "x$var" = xyes
I'm also trying to keep configure.ac wrapped at 80 columns
(I wish 64 columns were standard, I want to use bigger fonts).
I also added #endif labels for the larger flow function.
I'd prefer if we could avoid CPP inside C functions entirely;
but that's a larger task and can be split into another patch.
So I'll squash the following and merge into my "pu" branch
for now:
diff --git a/configure.ac b/configure.ac
index 4bc3064..794f19c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -337,19 +337,18 @@ AC_ARG_WITH(fftw,
AS_HELP_STRING([--without-fftw],
[Don't try to use FFTW]))
using_fftw=no
-if test "$with_fftw" != "no"; then
- AC_CHECK_HEADERS(fftw3.h, using_fftw=yes)
- if test "$using_fftw" = "yes"; then
- AC_CHECK_LIB(fftw3, fftw_execute, FFTW_LIBS="$FFTW_LIBS -lfftw3",
using_fftw=no)
- fi
- if test "$with_fftw" = "yes" -a "$using_fftw" = "no"; then
- AC_MSG_FAILURE([cannot find FFTW3])
- fi
-fi
-if test "$using_fftw" = yes; then
- AC_DEFINE(HAVE_FFTW, 1, [Define to 1 if you have FFTW3.])
-fi
-AM_CONDITIONAL(HAVE_FFTW, test x$using_fftw = xyes)
+AS_IF([test "x$with_fftw" != xno], [
+ AC_CHECK_HEADERS([fftw3.h], [using_fftw=yes])
+ AS_IF([test "x$using_fftw" = xyes],
+ [ AC_CHECK_LIB([fftw3], [fftw_execute],
+ [FFTW_LIBS="$FFTW_LIBS -lfftw3"], [using_fftw=no]) ])
+
+ AS_IF([test "x$with_fftw" = xyes && test "x$using_fftw" = xno],
+ [ AC_MSG_FAILURE([cannot find FFTW3]) ])
+])
+AS_IF([test "x$using_fftw" = xyes],
+ [ AC_DEFINE(HAVE_FFTW, 1, [Define to 1 if you have FFTW3.]) ])
+AM_CONDITIONAL(HAVE_FFTW, test x"$using_fftw" = xyes)
AC_SUBST(FFTW_LIBS)
diff --git a/src/spectrogram.c b/src/spectrogram.c
index 3d8c208..fb7313e 100644
--- a/src/spectrogram.c
+++ b/src/spectrogram.c
@@ -392,7 +392,7 @@ static int flow(sox_effect_t * effp,
]);
}
p->magnitudes[p->dft_size / 2] += sqr(p->dft_buf[p->dft_size / 2]);
-#else
+#else /* ! HAVE_FFTW */
if (is_p2(p->dft_size)) {
lsx_safe_rdft(p->dft_size, 1, p->dft_buf);
p->magnitudes[0] += sqr(p->dft_buf[0]);
@@ -401,7 +401,7 @@ static int flow(sox_effect_t * effp,
p->magnitudes[p->dft_size >> 1] += sqr(p->dft_buf[1]);
}
else rdft_p(*p->shared_ptr, p->dft_buf, p->magnitudes, p->dft_size);
-#endif
+#endif /* ! HAVE_FFTW */
if (++p->block_num == p->block_steps && do_column(effp) == SOX_EOF)
return SOX_EOF;
> They are the last three commits on https://github.com/martinwguy/sox.git
> which is a fork of the main sf.net repository and are also attached.
Thanks, I've also setup a mirror of yours at:
git://80x24.org/mirrors/martinwguy/sox.git
(as well as one for Mans @ s/martinwguy/mansr/)
And I forgot to mention I made a mirror of my own repo at:
git://repo.or.cz/sox/ew.git
------------------------------------------------------------------------------
_______________________________________________
SoX-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sox-devel