Imported Upstream version 1.0.26 48/62548/1 upstream/1.0.26
authorSeungbae Shin <seungbae.shin@samsung.com>
Wed, 16 Mar 2016 11:18:18 +0000 (20:18 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Wed, 16 Mar 2016 12:36:04 +0000 (21:36 +0900)
Change-Id: I94b0a35e0ffccabf1b50b62e8f0223e4b617e6f3

264 files changed:
AUTHORS
Cfg/compile
Cfg/config.guess
Cfg/config.sub
Cfg/depcomp
Cfg/install-sh
Cfg/ltmain.sh [changed mode: 0755->0644]
Cfg/missing
ChangeLog
M4/Makefile.am
M4/Makefile.in
M4/clang.m4 [new file with mode: 0644]
M4/extra_largefile.m4 [deleted file]
M4/extra_pkg.m4
M4/gcc_version.m4
M4/libtool.m4
M4/ltoptions.m4
M4/ltversion.m4
M4/octave.m4
M4/really_gcc.m4 [new file with mode: 0644]
M4/stack_protect.m4 [new file with mode: 0644]
Makefile.am
Makefile.in
NEWS
Octave/Makefile.am
Octave/Makefile.in
Octave/octave_test.sh
README
Scripts/android-configure.sh [new file with mode: 0755]
Scripts/build-test-tarball.mk.in [moved from build-test-tarball.mk.in with 77% similarity]
Scripts/linux-to-win-cross-configure.sh [new file with mode: 0755]
Win32/Makefile.in
aclocal.m4
configure
configure.ac
doc/AUTHORS [deleted file]
doc/ChangeLog [deleted file]
doc/FAQ.html
doc/Makefile.am
doc/Makefile.in
doc/NEWS [deleted file]
doc/README [deleted file]
doc/api.html
doc/bugs.html
doc/command.html
doc/dither.html
doc/index.html
doc/libsndfile.css
doc/libsndfile.css.in
doc/octave.html
doc/pkgconfig.html [deleted file]
echo-install-dirs.in [new file with mode: 0644]
examples/Makefile.am
examples/Makefile.in
examples/generate.c
examples/list_formats.c
examples/make_sine.c
examples/sfprocess.c
examples/sndfile-loopify.c [new file with mode: 0644]
examples/sndfile-to-text.c
libsndfile.spec.in
man/Makefile.am
man/Makefile.in
man/sndfile-cmp.1
man/sndfile-concat.1
man/sndfile-convert.1
man/sndfile-info.1
man/sndfile-interleave.1
man/sndfile-metadata-get.1
man/sndfile-play.1
man/sndfile-salvage.1 [new file with mode: 0644]
programs/Makefile.am
programs/Makefile.in
programs/common.c
programs/common.h
programs/sndfile-cmp.c
programs/sndfile-concat.c
programs/sndfile-convert.c
programs/sndfile-deinterleave.c
programs/sndfile-info.c
programs/sndfile-interleave.c
programs/sndfile-metadata-get.c
programs/sndfile-metadata-set.c
programs/sndfile-play.c
programs/sndfile-salvage.c
regtest/Makefile.am
regtest/Makefile.in
src/ALAC/ALACAudioTypes.h [new file with mode: 0644]
src/ALAC/ALACBitUtilities.c [new file with mode: 0644]
src/ALAC/ALACBitUtilities.h [new file with mode: 0644]
src/ALAC/EndianPortable.h [new file with mode: 0644]
src/ALAC/ag_dec.c [new file with mode: 0644]
src/ALAC/ag_enc.c [new file with mode: 0644]
src/ALAC/aglib.h [new file with mode: 0644]
src/ALAC/alac_codec.h [new file with mode: 0644]
src/ALAC/alac_decoder.c [new file with mode: 0644]
src/ALAC/alac_encoder.c [new file with mode: 0644]
src/ALAC/dp_dec.c [new file with mode: 0644]
src/ALAC/dp_enc.c [new file with mode: 0644]
src/ALAC/dplib.h [new file with mode: 0644]
src/ALAC/matrix_dec.c [new file with mode: 0644]
src/ALAC/matrix_enc.c [new file with mode: 0644]
src/ALAC/matrixlib.h [new file with mode: 0644]
src/ALAC/shift.h [new file with mode: 0644]
src/G72x/g721.c
src/G72x/g723_16.c
src/G72x/g723_24.c
src/G72x/g723_40.c
src/G72x/g72x.c
src/G72x/g72x_priv.h
src/G72x/g72x_test.c
src/GSM610/add.c
src/GSM610/code.c
src/GSM610/decode.c
src/GSM610/gsm.h
src/GSM610/gsm610_priv.h
src/GSM610/gsm_create.c
src/GSM610/gsm_decode.c
src/GSM610/gsm_destroy.c
src/GSM610/gsm_encode.c
src/GSM610/gsm_option.c
src/GSM610/long_term.c
src/GSM610/lpc.c
src/GSM610/preprocess.c
src/GSM610/rpe.c
src/GSM610/short_term.c
src/GSM610/table.c
src/Makefile.am
src/Makefile.in
src/Symbols.darwin
src/Symbols.gnu-binutils
src/Symbols.os2
src/Symbols.static
src/aiff.c
src/alac.c [new file with mode: 0644]
src/alaw.c
src/au.c
src/audio_detect.c
src/avr.c
src/binheader_writef_check.py
src/broadcast.c
src/caf.c
src/cart.c [new file with mode: 0644]
src/chanmap.c
src/chunk.c
src/command.c
src/common.c
src/common.h
src/config.h.in
src/create_symbols_file.py
src/double64.c
src/dwd.c
src/dwvw.c
src/file_io.c
src/flac.c
src/float32.c
src/g72x.c
src/gsm610.c
src/id3.c
src/ima_adpcm.c
src/ima_oki_adpcm.c
src/interleave.c
src/ircam.c
src/libsndfile-1.def
src/macbinary3.c
src/mat4.c
src/mat5.c
src/ms_adpcm.c
src/nist.c
src/ogg.c
src/ogg_opus.c [new file with mode: 0644]
src/ogg_pcm.c
src/ogg_speex.c
src/ogg_vorbis.c
src/paf.c
src/pcm.c
src/rf64.c
src/rx2.c
src/sd2.c
src/sds.c
src/sfconfig.h
src/sfendian.h
src/sndfile.c
src/sndfile.h.in
src/sndfile.hh
src/strings.c
src/svx.c
src/test_broadcast_var.c
src/test_cart_var.c [new file with mode: 0644]
src/test_conversions.c
src/test_endswap.c
src/test_endswap.def
src/test_endswap.tpl
src/test_float.c
src/test_log_printf.c
src/test_main.c
src/test_main.h
src/test_strncpy_crlf.c
src/txw.c
src/ulaw.c
src/version-metadata.rc
src/version-metadata.rc.in
src/voc.c
src/vox_adpcm.c
src/w64.c
src/wav.c
src/wav_w64.c
src/wav_w64.h
src/xi.c
tests/Makefile.am
tests/Makefile.in
tests/aiff_rw_test.c
tests/alaw_test.c
tests/benchmark.c
tests/benchmark.def
tests/benchmark.tpl
tests/channel_test.c [new file with mode: 0644]
tests/checksum_test.c
tests/chunk_test.c [new file with mode: 0644]
tests/command_test.c
tests/compression_size_test.c [moved from tests/vorbis_test.c with 66% similarity]
tests/cpp_test.cc
tests/dft_cmp.c
tests/dft_cmp.h
tests/dither_test.c
tests/dwvw_test.c
tests/error_test.c
tests/fix_this.c
tests/floating_point_test.c
tests/floating_point_test.def
tests/floating_point_test.tpl
tests/generate.c
tests/header_test.c
tests/header_test.tpl
tests/headerless_test.c
tests/long_read_write_test.c [new file with mode: 0644]
tests/lossy_comp_test.c
tests/misc_test.c
tests/multi_file_test.c
tests/ogg_test.c
tests/pcm_test.c
tests/pcm_test.def
tests/pcm_test.tpl
tests/peak_chunk_test.c
tests/pipe_test.c
tests/pipe_test.tpl
tests/raw_test.c
tests/rdwr_test.c
tests/rdwr_test.tpl
tests/scale_clip_test.c
tests/scale_clip_test.def
tests/scale_clip_test.tpl
tests/stdin_test.c
tests/stdout_test.c
tests/string_test.c
tests/test_wrapper.sh.in
tests/ulaw_test.c
tests/utils.c
tests/utils.h
tests/utils.tpl
tests/win32_ordinal_test.c
tests/write_read_test.c
tests/write_read_test.def
tests/write_read_test.tpl

diff --git a/AUTHORS b/AUTHORS
index b7e2232..b91ec92 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -12,3 +12,46 @@ apart from code in the following directories:
    modifications were required to integrate these files into libsndfile. The
    changes are listed in src/G72x/ChangeLog.
 
+
+Others:
+
+    2013-03-07 Michael Pruett
+    2013-02-11 Chris Roberts c.roberts@csrfm.com
+    2012-03-17 IOhannes m zmoelnig
+    2013-02-21 Jan Starry
+    2012-01-20 Bodo
+    2011-06-23 Tim van der Molen
+    2010-12-01 Tim Blechmann
+    2010-10-04 Matti Nykyri
+    2010-09-17 Brian Lewis
+    2010-02-22 Robin Gareus
+    2010-01-07 Christian Weisgerber and Jacob Meuserto
+    2009-10-18 Olivier Tristan
+    2009-10-14, 2009-08-30 Uli Franke
+    2009-06-24, 2008-11-19, 2004-09-22, 2004-06-17, 2003-05-03, 2003-05-02 Conrad Parker
+    2009-05-22 Lennart Poettering
+    2008-07-03, 2006-10-22, 2006-10-18 Fons Adriaensen
+    2008-04-19 David Yeo
+    2008-01-20 Yair K.
+    2007-12-03 Robs
+    2007-07-12 Ed Schouten
+    2007-06-07 Trent Apted
+    2007-04-14, 2003-12-12 André Pang
+    2007-04-14 Reuben Thomas
+    2006-11-09 Jonathan Woithe
+    2006-03-26 Diego 'Flameeyes' Pettenò
+    2006-03-17 Paul Davis
+    2006-03-09 Jesse Chappell
+    2006-01-09, 2005-12-28 John ffitch
+    2005-09-21 David A. van Leeuwen
+    2005-08-15 Mo DeJong
+    2005-04-30 David Viens
+    2004-12-29 Steve Baker
+    2004-09-05 Denis Cote
+    2004-06-28 Stanko Juzbasic
+    2004-02-14 Frank Neumann
+    2003-08-15 Axel Röbel
+    2003-08-06 Peter Miller
+    2003-07-21 Tero Pelander
+    2003-02-10 Antoine Mathys
+    2002-12-30 Marek Peteraj
index ec64c62..a85b723 100755 (executable)
@@ -1,10 +1,9 @@
 #! /bin/sh
-# Wrapper for compilers which do not understand `-c -o'.
+# Wrapper for compilers which do not understand '-c -o'.
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009  Free Software
-# Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -29,21 +28,224 @@ scriptversion=2009-04-28.21; # UTC
 # bugs to <bug-automake@gnu.org> or send patches to
 # <automake-patches@gnu.org>.
 
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
      exit 1;
      ;;
   -h | --h*)
     cat <<\EOF
 Usage: compile [--help] [--version] PROGRAM [ARGS]
 
-Wrapper for compilers which do not understand `-c -o'.
-Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
 arguments, and rename the output as expected.
 
 If you are trying to build a whole package this is not the
-right script to run: please start by reading the file `INSTALL'.
+right script to run: please start by reading the file 'INSTALL'.
 
 Report bugs to <bug-automake@gnu.org>.
 EOF
@@ -53,11 +255,13 @@ EOF
     echo "compile $scriptversion"
     exit $?
     ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
 esac
 
 ofile=
 cfile=
-eat=
 
 for arg
 do
@@ -66,8 +270,8 @@ do
   else
     case $1 in
       -o)
-       # configure might choose to run compile as `compile cc -o foo foo.c'.
-       # So we strip `-o arg' only if arg is an object.
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
        eat=1
        case $2 in
          *.o | *.obj)
@@ -94,10 +298,10 @@ do
 done
 
 if test -z "$ofile" || test -z "$cfile"; then
-  # If no `-o' option was seen then we might have been invoked from a
+  # If no '-o' option was seen then we might have been invoked from a
   # pattern rule where we don't need one.  That is ok -- this is a
   # normal compilation that the losing compiler can handle.  If no
-  # `.c' file was seen then we are probably linking.  That is also
+  # '.c' file was seen then we are probably linking.  That is also
   # ok.
   exec "$@"
 fi
@@ -106,7 +310,7 @@ fi
 cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
 
 # Create the lock directory.
-# Note: use `[/\\:.-]' here to ensure that we don't use the same name
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
 # that we are using for the .o file.  Also, base the name on the expected
 # object file name, since that is what matters with a parallel build.
 lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
@@ -124,9 +328,9 @@ trap "rmdir '$lockdir'; exit 1" 1 2 15
 ret=$?
 
 if test -f "$cofile"; then
-  mv "$cofile" "$ofile"
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
 elif test -f "${cofile}bj"; then
-  mv "${cofile}bj" "$ofile"
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
 fi
 
 rmdir "$lockdir"
index da83314..1659250 100755 (executable)
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2009-04-27'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@ timestamp='2009-04-27'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
+# Please send patches to <config-patches@gnu.org>.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,8 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -139,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+       # If the system lacks a compiler, then just pick glibc.
+       # We could probably try harder.
+       LIBC=gnu
+
+       eval $set_cc_for_build
+       cat <<-EOF > $dummy.c
+       #include <features.h>
+       #if defined(__UCLIBC__)
+       LIBC=uclibc
+       #elif defined(__dietlibc__)
+       LIBC=dietlibc
+       #else
+       LIBC=gnu
+       #endif
+       EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+       ;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
        # NetBSD (nbsd) targets should (where applicable) match one or
-       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
        # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
        # switched to ELF, *-*-netbsd* would select the old
        # object file format.  This provides both forward
@@ -154,23 +168,30 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # Note: NetBSD doesn't particularly care about the vendor
        # portion of the name.  We always set it to "unknown".
        sysctl="sysctl -n hw.machine_arch"
-       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+           /sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || \
+           echo unknown)`
        case "${UNAME_MACHINE_ARCH}" in
            armeb) machine=armeb-unknown ;;
            arm*) machine=arm-unknown ;;
            sh3el) machine=shl-unknown ;;
            sh3eb) machine=sh-unknown ;;
            sh5el) machine=sh5le-unknown ;;
+           earmv*)
+               arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+               endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+               machine=${arch}${endian}-unknown
+               ;;
            *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
        esac
        # The Operating System including object format, if it has switched
        # to ELF recently, or will in the future.
        case "${UNAME_MACHINE_ARCH}" in
-           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+           arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
                eval $set_cc_for_build
                if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-                       | grep __ELF__ >/dev/null
+                       | grep -q __ELF__
                then
                    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
                    # Return netbsd for either.  FIX?
@@ -180,7 +201,14 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                fi
                ;;
            *)
-               os=netbsd
+               os=netbsd
+               ;;
+       esac
+       # Determine ABI tags.
+       case "${UNAME_MACHINE_ARCH}" in
+           earm*)
+               expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+               abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
                ;;
        esac
        # The OS release
@@ -193,13 +221,17 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                release='-gnu'
                ;;
            *)
-               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
                ;;
        esac
        # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
        # contains redundant information, the shorter form:
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "${machine}-${os}${release}"
+       echo "${machine}-${os}${release}${abi}"
+       exit ;;
+    *:Bitrig:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
        exit ;;
     *:OpenBSD:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
@@ -217,13 +249,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
        exit ;;
+    *:Sortix:*:*)
+       echo ${UNAME_MACHINE}-unknown-sortix
+       exit ;;
     alpha:OSF1:*:*)
        case $UNAME_RELEASE in
        *4.0)
                UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
                ;;
        *5.*)
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
                ;;
        esac
        # According to Compaq, /usr/sbin/psrinfo has been available on
@@ -269,7 +304,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # A Xn.n version is an unreleased experimental baselevel.
        # 1.2 uses "1.2" for uname -r.
        echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       exit ;;
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
        # How do we know it's Interix rather than the generic POSIX subsystem?
        # Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,12 +333,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        echo s390-ibm-zvmoe
        exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+       echo powerpc-ibm-os400
        exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
        echo arm-acorn-riscix${UNAME_RELEASE}
        exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
        echo arm-unknown-riscos
        exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -333,6 +371,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
        echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
        exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux${UNAME_RELEASE}
+       exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
        eval $set_cc_for_build
        SUN_ARCH="i386"
@@ -391,23 +432,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
        echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+       exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+       echo m68k-atari-mint${UNAME_RELEASE}
        exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit ;;
     m68k:machten:*:*)
        echo m68k-apple-machten${UNAME_RELEASE}
        exit ;;
@@ -477,8 +518,8 @@ EOF
        echo m88k-motorola-sysv3
        exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
        if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
        then
            if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -491,7 +532,7 @@ EOF
        else
            echo i586-dg-dgux${UNAME_RELEASE}
        fi
-       exit ;;
+       exit ;;
     M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
        echo m88k-dolphin-sysv3
        exit ;;
@@ -548,15 +589,16 @@ EOF
                echo rs6000-ibm-aix3.2
        fi
        exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
        IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
        if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
                IBM_ARCH=rs6000
        else
                IBM_ARCH=powerpc
        fi
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
+       if [ -x /usr/bin/lslpp ] ; then
+               IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+                          awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
        else
                IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
        fi
@@ -591,52 +633,52 @@ EOF
            9000/[678][0-9][0-9])
                if [ -x /usr/bin/getconf ]; then
                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "${sc_cpu_version}" in
+                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "${sc_kernel_bits}" in
+                         32) HP_ARCH="hppa2.0n" ;;
+                         64) HP_ARCH="hppa2.0w" ;;
                          '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+                       esac ;;
+                   esac
                fi
                if [ "${HP_ARCH}" = "" ]; then
                    eval $set_cc_for_build
-                   sed 's/^              //' << EOF >$dummy.c
+                   sed 's/^            //' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
 
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
 
-                  switch (cpu)
-               {
-               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-               case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-                   switch (bits)
-                       {
-                       case 64: puts ("hppa2.0w"); break;
-                       case 32: puts ("hppa2.0n"); break;
-                       default: puts ("hppa2.0"); break;
-                       } break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-                   puts ("hppa2.0"); break;
-              #endif
-               default: puts ("hppa1.0"); break;
-               }
-                  exit (0);
-              }
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
 EOF
                    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
                    test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -656,7 +698,7 @@ EOF
            # => hppa64-hp-hpux11.23
 
            if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-               grep __LP64__ >/dev/null
+               grep -q __LP64__
            then
                HP_ARCH="hppa2.0w"
            else
@@ -727,22 +769,22 @@ EOF
        exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
        echo c1-convex-bsd
-        exit ;;
+       exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
        if getsysinfo -f scalar_acc
        then echo c32-convex-bsd
        else echo c2-convex-bsd
        fi
-        exit ;;
+       exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
        echo c34-convex-bsd
-        exit ;;
+       exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
        echo c38-convex-bsd
-        exit ;;
+       exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
        echo c4-convex-bsd
-        exit ;;
+       exit ;;
     CRAY*Y-MP:*:*:*)
        echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
        exit ;;
@@ -766,14 +808,14 @@ EOF
        exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
        FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
        echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -785,34 +827,39 @@ EOF
        echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
        exit ;;
     *:FreeBSD:*:*)
-       case ${UNAME_MACHINE} in
-           pc98)
-               echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case ${UNAME_PROCESSOR} in
            amd64)
                echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
            *)
-               echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
        esac
        exit ;;
     i*:CYGWIN*:*)
        echo ${UNAME_MACHINE}-pc-cygwin
        exit ;;
+    *:MINGW64*:*)
+       echo ${UNAME_MACHINE}-pc-mingw64
+       exit ;;
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
+    *:MSYS*:*)
+       echo ${UNAME_MACHINE}-pc-msys
+       exit ;;
     i*:windows32*:*)
-       # uname -m includes "-pc" on this system.
-       echo ${UNAME_MACHINE}-mingw32
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
        exit ;;
     i*:PW*:*)
        echo ${UNAME_MACHINE}-pc-pw32
        exit ;;
-    *:Interix*:[3456]*)
-       case ${UNAME_MACHINE} in
+    *:Interix*:*)
+       case ${UNAME_MACHINE} in
            x86)
                echo i586-pc-interix${UNAME_RELEASE}
                exit ;;
-           EM64T | authenticamd | genuineintel)
+           authenticamd | genuineintel | EM64T)
                echo x86_64-unknown-interix${UNAME_RELEASE}
                exit ;;
            IA64)
@@ -822,6 +869,9 @@ EOF
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
        echo i${UNAME_MACHINE}-pc-mks
        exit ;;
+    8664:Windows_NT:*)
+       echo x86_64-pc-mks
+       exit ;;
     i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
        # How do we know it's Interix rather than the generic POSIX subsystem?
        # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
@@ -842,210 +892,160 @@ EOF
        exit ;;
     *:GNU:*:*)
        # the GNU system
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
        exit ;;
     *:GNU/*:*:*)
        # other systems with GNU libc and userland
-       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
        exit ;;
     i*86:Minix:*:*)
        echo ${UNAME_MACHINE}-pc-minix
        exit ;;
+    aarch64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
     arm*:Linux:*:*)
        eval $set_cc_for_build
        if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
            | grep -q __ARM_EABI__
        then
-           echo ${UNAME_MACHINE}-unknown-linux-gnu
+           echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        else
-           echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+           else
+               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+           fi
        fi
        exit ;;
     avr32*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     cris:Linux:*:*)
-       echo cris-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
        exit ;;
     crisv32:Linux:*:*)
-       echo crisv32-axis-linux-gnu
+       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+       exit ;;
+    e2k:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     frv:Linux:*:*)
-       echo frv-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    hexagon:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    i*86:Linux:*:*)
+       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
        exit ;;
     ia64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     m32r*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     m68*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
-    mips:Linux:*:*)
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-       #undef CPU
-       #undef mips
-       #undef mipsel
-       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-       CPU=mipsel
-       #else
-       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-       CPU=mips
-       #else
-       CPU=
-       #endif
-       #endif
-EOF
-       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-           /^CPU/{
-               s: ::g
-               p
-           }'`"
-       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-       ;;
-    mips64:Linux:*:*)
+    mips:Linux:*:* | mips64:Linux:*:*)
        eval $set_cc_for_build
        sed 's/^        //' << EOF >$dummy.c
        #undef CPU
-       #undef mips64
-       #undef mips64el
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
        #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-       CPU=mips64el
+       CPU=${UNAME_MACHINE}el
        #else
        #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-       CPU=mips64
+       CPU=${UNAME_MACHINE}
        #else
        CPU=
        #endif
        #endif
 EOF
-       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-           /^CPU/{
-               s: ::g
-               p
-           }'`"
-       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
        ;;
-    or32:Linux:*:*)
-       echo or32-unknown-linux-gnu
-       exit ;;
-    ppc:Linux:*:*)
-       echo powerpc-unknown-linux-gnu
-       exit ;;
-    ppc64:Linux:*:*)
-       echo powerpc64-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+       echo or1k-unknown-linux-${LIBC}
        exit ;;
-    alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-         EV5)   UNAME_MACHINE=alphaev5 ;;
-         EV56)  UNAME_MACHINE=alphaev56 ;;
-         PCA56) UNAME_MACHINE=alphapca56 ;;
-         PCA57) UNAME_MACHINE=alphapca56 ;;
-         EV6)   UNAME_MACHINE=alphaev6 ;;
-         EV67)  UNAME_MACHINE=alphaev67 ;;
-         EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+    or32:Linux:*:* | or1k*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     padre:Linux:*:*)
-       echo sparc-unknown-linux-gnu
+       echo sparc-unknown-linux-${LIBC}
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-${LIBC}
        exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
        # Look for CPU level
        case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-         PA7*) echo hppa1.1-unknown-linux-gnu ;;
-         PA8*) echo hppa2.0-unknown-linux-gnu ;;
-         *)    echo hppa-unknown-linux-gnu ;;
+         PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+         PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+         *)    echo hppa-unknown-linux-${LIBC} ;;
        esac
        exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-       echo hppa64-unknown-linux-gnu
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-${LIBC}
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-${LIBC}
+       exit ;;
+    ppc64le:Linux:*:*)
+       echo powerpc64le-unknown-linux-${LIBC}
+       exit ;;
+    ppcle:Linux:*:*)
+       echo powerpcle-unknown-linux-${LIBC}
        exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-       echo ${UNAME_MACHINE}-ibm-linux
+       echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
        exit ;;
     sh64*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     sh*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     vax:Linux:*:*)
-       echo ${UNAME_MACHINE}-dec-linux-gnu
+       echo ${UNAME_MACHINE}-dec-linux-${LIBC}
        exit ;;
     x86_64:Linux:*:*)
-       echo x86_64-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
        exit ;;
     xtensa*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
-    i*86:Linux:*:*)
-       # The BFD linker knows what the default object file format is, so
-       # first see if it will tell us. cd to the root directory to prevent
-       # problems with other programs or directories called `ld' in the path.
-       # Set LC_ALL=C to ensure ld outputs messages in English.
-       ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-                        | sed -ne '/supported targets:/!d
-                                   s/[         ][      ]*/ /g
-                                   s/.*supported targets: *//
-                                   s/ .*//
-                                   p'`
-        case "$ld_supported_targets" in
-         elf32-i386)
-               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-               ;;
-         a.out-i386-linux)
-               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-               exit ;;
-         "")
-               # Either a pre-BFD a.out linker (linux-gnuoldld) or
-               # one that does not give us useful --help.
-               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-               exit ;;
-       esac
-       # Determine whether the default compiler is a.out or elf
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-       #include <features.h>
-       #ifdef __ELF__
-       # ifdef __GLIBC__
-       #  if __GLIBC__ >= 2
-       LIBC=gnu
-       #  else
-       LIBC=gnulibc1
-       #  endif
-       # else
-       LIBC=gnulibc1
-       # endif
-       #else
-       #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-       LIBC=gnu
-       #else
-       LIBC=gnuaout
-       #endif
-       #endif
-       #ifdef __dietlibc__
-       LIBC=dietlibc
-       #endif
-EOF
-       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-           /^LIBC/{
-               s: ::g
-               p
-           }'`"
-       test x"${LIBC}" != x && {
-               echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-               exit
-       }
-       test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-       ;;
     i*86:DYNIX/ptx:4*:*)
        # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
        # earlier versions are messed up and put the nodename in both
@@ -1053,11 +1053,11 @@ EOF
        echo i386-sequent-sysv4
        exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
        # I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+       # Use sysv4.2uw... so that sysv4* matches it.
        echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
        exit ;;
     i*86:OS/2:*:*)
@@ -1074,7 +1074,7 @@ EOF
     i*86:syllable:*:*)
        echo ${UNAME_MACHINE}-pc-syllable
        exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
        echo i386-unknown-lynxos${UNAME_RELEASE}
        exit ;;
     i*86:*DOS:*:*)
@@ -1089,7 +1089,7 @@ EOF
        fi
        exit ;;
     i*86:*:5:[678]*)
-       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
        case `/bin/uname -X | grep "^Machine"` in
            *486*)           UNAME_MACHINE=i486 ;;
            *Pentium)        UNAME_MACHINE=i586 ;;
@@ -1117,13 +1117,13 @@ EOF
        exit ;;
     pc:*:*:*)
        # Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i586.
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
        # Note: whatever this is, it MUST be the same as what config.sub
        # prints for the "djgpp" host, or else GDB configury will decide that
        # this is a cross-build.
        echo i586-pc-msdosdjgpp
-        exit ;;
+       exit ;;
     Intel:Mach:3*:*)
        echo i386-pc-mach3
        exit ;;
@@ -1158,8 +1158,8 @@ EOF
        /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
          && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
     NCR*:*:4.2:* | MPRAS*:*:4.2:*)
        OS_REL='.3'
        test -r /etc/.relid \
@@ -1182,7 +1182,7 @@ EOF
     rs6000:LynxOS:2.*:*)
        echo rs6000-unknown-lynxos${UNAME_RELEASE}
        exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
        echo powerpc-unknown-lynxos${UNAME_RELEASE}
        exit ;;
     SM[BE]S:UNIX_SV:*:*)
@@ -1202,10 +1202,10 @@ EOF
                echo ns32k-sni-sysv
        fi
        exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
     *:UNIX_System_V:4*:FTX*)
        # From Gerald Hewes <hewes@openmarket.com>.
        # How about differentiating between stratus architectures? -djm
@@ -1231,11 +1231,11 @@ EOF
        exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
        if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
+               echo mips-nec-sysv${UNAME_RELEASE}
        else
-               echo mips-unknown-sysv${UNAME_RELEASE}
+               echo mips-unknown-sysv${UNAME_RELEASE}
        fi
-        exit ;;
+       exit ;;
     BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
        echo powerpc-be-beos
        exit ;;
@@ -1248,6 +1248,9 @@ EOF
     BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
        echo i586-pc-haiku
        exit ;;
+    x86_64:Haiku:*:*)
+       echo x86_64-unknown-haiku
+       exit ;;
     SX-4:SUPER-UX:*:*)
        echo sx4-nec-superux${UNAME_RELEASE}
        exit ;;
@@ -1274,9 +1277,31 @@ EOF
        exit ;;
     *:Darwin:*:*)
        UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-       case $UNAME_PROCESSOR in
-           unknown) UNAME_PROCESSOR=powerpc ;;
-       esac
+       eval $set_cc_for_build
+       if test "$UNAME_PROCESSOR" = unknown ; then
+           UNAME_PROCESSOR=powerpc
+       fi
+       if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+           if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+               if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                   (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                   grep IS_64BIT_ARCH >/dev/null
+               then
+                   case $UNAME_PROCESSOR in
+                       i386) UNAME_PROCESSOR=x86_64 ;;
+                       powerpc) UNAME_PROCESSOR=powerpc64 ;;
+                   esac
+               fi
+           fi
+       elif test "$UNAME_PROCESSOR" = i386 ; then
+           # Avoid executing cc on OS X 10.9, as it ships with a stub
+           # that puts up a graphical alert prompting to install
+           # developer tools.  Any system running Mac OS X 10.7 or
+           # later (Darwin 11 and later) is required to have a 64-bit
+           # processor. This is not true of the ARM version of Darwin
+           # that Apple uses in portable devices.
+           UNAME_PROCESSOR=x86_64
+       fi
        echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
        exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
@@ -1290,7 +1315,10 @@ EOF
     *:QNX:*:4*)
        echo i386-pc-qnx
        exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NEO-?:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
        echo nse-tandem-nsk${UNAME_RELEASE}
        exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1335,13 +1363,13 @@ EOF
        echo pdp10-unknown-its
        exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+       echo mips-sei-seiux${UNAME_RELEASE}
        exit ;;
     *:DragonFly:*:*)
        echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
        exit ;;
     *:*VMS:*:*)
-       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
        case "${UNAME_MACHINE}" in
            A*) echo alpha-dec-vms ; exit ;;
            I*) echo ia64-dec-vms ; exit ;;
@@ -1359,158 +1387,10 @@ EOF
     i*86:AROS:*:*)
        echo ${UNAME_MACHINE}-pc-aros
        exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-         ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-       printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-       printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-       { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit ;;
-    c34*)
-       echo c34-convex-bsd
+    x86_64:VMkernel:*:*)
+       echo ${UNAME_MACHINE}-unknown-esx
        exit ;;
-    c38*)
-       echo c38-convex-bsd
-       exit ;;
-    c4*)
-       echo c4-convex-bsd
-       exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
index a39437d..1acc966 100755 (executable)
@@ -1,44 +1,40 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2009-04-17'
+timestamp='2015-08-20'
 
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
 # If it is invalid, we print an error message on stderr and exit with code 1.
 # Otherwise, we print the canonical config type on stdout and succeed.
 
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
 # that are meaningful with *any* GNU software.
@@ -72,8 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -120,13 +115,18 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -149,10 +149,13 @@ case $os in
        -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
        -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
        -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis | -knuth | -cray)
+       -apple | -axis | -knuth | -cray | -microblaze*)
                os=
                basic_machine=$1
                ;;
+       -bluegene*)
+               os=-cnk
+               ;;
        -sim | -cisco | -oki | -wec | -winbond)
                os=
                basic_machine=$1
@@ -167,10 +170,10 @@ case $os in
                os=-chorusos
                basic_machine=$1
                ;;
-       -chorusrdb)
-               os=-chorusrdb
+       -chorusrdb)
+               os=-chorusrdb
                basic_machine=$1
-               ;;
+               ;;
        -hiux*)
                os=-hiuxwe2
                ;;
@@ -215,6 +218,12 @@ case $os in
        -isc*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
                ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
        -lynx*)
                os=-lynxos
                ;;
@@ -239,20 +248,29 @@ case $basic_machine in
        # Some are omitted here because they have special meanings below.
        1750a | 580 \
        | a29k \
+       | aarch64 | aarch64_be \
        | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
        | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
        | am33_2.0 \
-       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+       | arc | arceb \
+       | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+       | avr | avr32 \
+       | ba \
+       | be32 | be64 \
        | bfin \
-       | c4x | clipper \
+       | c4x | c8051 | clipper \
        | d10v | d30v | dlx | dsp16xx \
-       | fido | fr30 | frv \
+       | e2k | epiphany \
+       | fido | fr30 | frv | ft32 \
        | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
        | i370 | i860 | i960 | ia64 \
        | ip2k | iq2000 \
+       | k1om \
+       | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
-       | maxq | mb | microblaze | mcore | mep | metag \
+       | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
        | mips | mipsbe | mipseb | mipsel | mipsle \
        | mips16 \
        | mips64 | mips64el \
@@ -266,36 +284,55 @@ case $basic_machine in
        | mips64vr5900 | mips64vr5900el \
        | mipsisa32 | mipsisa32el \
        | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa32r6 | mipsisa32r6el \
        | mipsisa64 | mipsisa64el \
        | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64r6 | mipsisa64r6el \
        | mipsisa64sb1 | mipsisa64sb1el \
        | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipsr5900 | mipsr5900el \
        | mipstx39 | mipstx39el \
        | mn10200 | mn10300 \
        | moxie \
        | mt \
        | msp430 \
-       | nios | nios2 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 | nios2eb | nios2el \
        | ns16k | ns32k \
-       | or32 \
+       | open8 | or1k | or1knd | or32 \
        | pdp10 | pdp11 | pj | pjl \
-       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
        | pyramid \
+       | riscv32 | riscv64 \
+       | rl78 | rx \
        | score \
-       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
        | sh64 | sh64le \
        | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
        | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-       | spu | strongarm \
-       | tahoe | thumb | tic4x | tic80 | tron \
-       | v850 | v850e \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | visium \
        | we32k \
-       | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+       | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
                basic_machine=$basic_machine-unknown
                ;;
-       m6811 | m68hc11 | m6812 | m68hc12)
-               # Motorola 68HC11/12.
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       leon|leon[3-9])
+               basic_machine=sparc-$basic_machine
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
@@ -305,6 +342,21 @@ case $basic_machine in
                basic_machine=mt-unknown
                ;;
 
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
+               ;;
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
+               ;;
+
        # We use `pc' rather than `unknown'
        # because (1) that's what they normally are, and
        # (2) the word "unknown" tends to confuse beginning users.
@@ -319,25 +371,32 @@ case $basic_machine in
        # Recognize the basic CPU types with company name.
        580-* \
        | a29k-* \
+       | aarch64-* | aarch64_be-* \
        | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
        | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
        | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
        | avr-* | avr32-* \
+       | ba-* \
+       | be32-* | be64-* \
        | bfin-* | bs2000-* \
-       | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-       | clipper-* | craynv-* | cydra-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | c8051-* | clipper-* | craynv-* | cydra-* \
        | d10v-* | d30v-* | dlx-* \
-       | elxsi-* \
+       | e2k-* | elxsi-* \
        | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
        | h8300-* | h8500-* \
        | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
        | i*86-* | i860-* | i960-* | ia64-* \
        | ip2k-* | iq2000-* \
+       | k1om-* \
+       | le32-* | le64-* \
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
        | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
        | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+       | microblaze-* | microblazeel-* \
        | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
        | mips16-* \
        | mips64-* | mips64el-* \
@@ -351,32 +410,43 @@ case $basic_machine in
        | mips64vr5900-* | mips64vr5900el-* \
        | mipsisa32-* | mipsisa32el-* \
        | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa32r6-* | mipsisa32r6el-* \
        | mipsisa64-* | mipsisa64el-* \
        | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64r6-* | mipsisa64r6el-* \
        | mipsisa64sb1-* | mipsisa64sb1el-* \
        | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipsr5900-* | mipsr5900el-* \
        | mipstx39-* | mipstx39el-* \
        | mmix-* \
        | mt-* \
        | msp430-* \
-       | nios-* | nios2-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* | nios2eb-* | nios2el-* \
        | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
+       | or1k*-* \
        | orion-* \
        | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
        | pyramid-* \
-       | romp-* | rs6000-* \
+       | riscv32-* | riscv64-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
        | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
        | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
        | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
        | sparclite-* \
-       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-       | tahoe-* | thumb-* \
-       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
        | tron-* \
-       | v850-* | v850e-* | vax-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
+       | visium-* \
        | we32k-* \
-       | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
        | xstormy16-* | xtensa*-* \
        | ymp-* \
        | z8k-* | z80-*)
@@ -401,7 +471,7 @@ case $basic_machine in
                basic_machine=a29k-amd
                os=-udi
                ;;
-       abacus)
+       abacus)
                basic_machine=abacus-unknown
                ;;
        adobe68k)
@@ -451,6 +521,9 @@ case $basic_machine in
                basic_machine=i386-pc
                os=-aros
                ;;
+        asmjs)
+               basic_machine=asmjs-unknown
+               ;;
        aux)
                basic_machine=m68k-apple
                os=-aux
@@ -467,11 +540,24 @@ case $basic_machine in
                basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
                os=-linux
                ;;
+       bluegene*)
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        c90)
                basic_machine=c90-cray
                os=-unicos
                ;;
-        cegcc)
+       cegcc)
                basic_machine=arm-unknown
                os=-cegcc
                ;;
@@ -503,7 +589,7 @@ case $basic_machine in
                basic_machine=craynv-cray
                os=-unicosmp
                ;;
-       cr16)
+       cr16 | cr16-*)
                basic_machine=cr16-unknown
                os=-elf
                ;;
@@ -661,7 +747,6 @@ case $basic_machine in
        i370-ibm* | ibm*)
                basic_machine=i370-ibm
                ;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
        i*86v32)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-sysv32
@@ -700,6 +785,9 @@ case $basic_machine in
                basic_machine=m68k-isi
                os=-sysv
                ;;
+       leon-*|leon[3-9]-*)
+               basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+               ;;
        m68knommu)
                basic_machine=m68k-unknown
                os=-linux
@@ -719,8 +807,15 @@ case $basic_machine in
                basic_machine=ns32k-utek
                os=-sysv
                ;;
+       microblaze*)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw64)
+               basic_machine=x86_64-pc
+               os=-mingw64
+               ;;
        mingw32)
-               basic_machine=i386-pc
+               basic_machine=i686-pc
                os=-mingw32
                ;;
        mingw32ce)
@@ -748,6 +843,10 @@ case $basic_machine in
                basic_machine=powerpc-unknown
                os=-morphos
                ;;
+       moxiebox)
+               basic_machine=moxie-unknown
+               os=-moxiebox
+               ;;
        msdos)
                basic_machine=i386-pc
                os=-msdos
@@ -755,10 +854,18 @@ case $basic_machine in
        ms1-*)
                basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
                ;;
+       msys)
+               basic_machine=i686-pc
+               os=-msys
+               ;;
        mvs)
                basic_machine=i370-ibm
                os=-mvs
                ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
        ncr3000)
                basic_machine=i486-ncr
                os=-sysv4
@@ -823,6 +930,12 @@ case $basic_machine in
        np1)
                basic_machine=np1-gould
                ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
        nsr-tandem)
                basic_machine=nsr-tandem
                ;;
@@ -905,9 +1018,10 @@ case $basic_machine in
                ;;
        power)  basic_machine=power-ibm
                ;;
-       ppc)    basic_machine=powerpc-unknown
+       ppc | ppcbe)    basic_machine=powerpc-unknown
                ;;
-       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        ppcle | powerpclittle | ppc-le | powerpc-little)
                basic_machine=powerpcle-unknown
@@ -932,7 +1046,11 @@ case $basic_machine in
                basic_machine=i586-unknown
                os=-pw32
                ;;
-       rdos)
+       rdos | rdos64)
+               basic_machine=x86_64-pc
+               os=-rdos
+               ;;
+       rdos32)
                basic_machine=i386-pc
                os=-rdos
                ;;
@@ -1001,6 +1119,9 @@ case $basic_machine in
                basic_machine=i860-stratus
                os=-sysv4
                ;;
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        sun2)
                basic_machine=m68000-sun
                ;;
@@ -1057,20 +1178,8 @@ case $basic_machine in
                basic_machine=t90-cray
                os=-unicos
                ;;
-       tic54x | c54x*)
-               basic_machine=tic54x-unknown
-               os=-coff
-               ;;
-       tic55x | c55x*)
-               basic_machine=tic55x-unknown
-               os=-coff
-               ;;
-       tic6x | c6x*)
-               basic_machine=tic6x-unknown
-               os=-coff
-               ;;
        tile*)
-               basic_machine=tile-unknown
+               basic_machine=$basic_machine-unknown
                os=-linux-gnu
                ;;
        tx39)
@@ -1140,6 +1249,9 @@ case $basic_machine in
        xps | xps100)
                basic_machine=xps100-honeywell
                ;;
+       xscale-* | xscalee[bl]-*)
+               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+               ;;
        ymp)
                basic_machine=ymp-cray
                os=-unicos
@@ -1237,9 +1349,12 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+       # First match some system type aliases
+       # that might get confused with valid system types.
        # -solaris* is a basic system type, with this one exception.
+       -auroraux)
+               os=-auroraux
+               ;;
        -solaris1 | -solaris1.*)
                os=`echo $os | sed -e 's|solaris1|sunos4|'`
                ;;
@@ -1260,30 +1375,31 @@ case $os in
        # Each alternative MUST END IN A *, to match a version number.
        # -sysv* is not here because it comes later, after sysvr4.
        -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-             | -kopensolaris* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* | -plan9* \
              | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* | -aros* \
+             | -aos* | -aros* | -cloudabi* | -sortix* \
              | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
              | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-             | -openbsd* | -solidbsd* \
+             | -bitrig* | -openbsd* | -solidbsd* \
              | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
              | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
-             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
              | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
              | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
              | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
              | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-             | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
@@ -1322,7 +1438,7 @@ case $os in
        -opened*)
                os=-openedition
                ;;
-        -os400*)
+       -os400*)
                os=-os400
                ;;
        -wince*)
@@ -1371,7 +1487,7 @@ case $os in
        -sinix*)
                os=-sysv4
                ;;
-        -tpf*)
+       -tpf*)
                os=-tpf
                ;;
        -triton*)
@@ -1407,15 +1523,14 @@ case $os in
        -aros*)
                os=-aros
                ;;
-       -kaos*)
-               os=-kaos
-               ;;
        -zvmoe)
                os=-zvmoe
                ;;
        -dicos*)
                os=-dicos
                ;;
+       -nacl*)
+               ;;
        -none)
                ;;
        *)
@@ -1438,10 +1553,10 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+       score-*)
                os=-elf
                ;;
-        spu-*)
+       spu-*)
                os=-elf
                ;;
        *-acorn)
@@ -1453,8 +1568,23 @@ case $basic_machine in
        arm*-semi)
                os=-aout
                ;;
-        c4x-* | tic4x-*)
-               os=-coff
+       c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       c8051-*)
+               os=-elf
+               ;;
+       hexagon-*)
+               os=-elf
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
                ;;
        # This must come before the *-dec entry.
        pdp10-*)
@@ -1474,14 +1604,11 @@ case $basic_machine in
                ;;
        m68000-sun)
                os=-sunos3
-               # This also exists in the configure program, but was not the
-               # default.
-               # os=-sunos4
                ;;
        m68*-cisco)
                os=-aout
                ;;
-        mep-*)
+       mep-*)
                os=-elf
                ;;
        mips*-cisco)
@@ -1508,7 +1635,7 @@ case $basic_machine in
        *-ibm)
                os=-aix
                ;;
-       *-knuth)
+       *-knuth)
                os=-mmixware
                ;;
        *-wec)
@@ -1613,7 +1740,7 @@ case $basic_machine in
                        -sunos*)
                                vendor=sun
                                ;;
-                       -aix*)
+                       -cnk*|-aix*)
                                vendor=ibm
                                ;;
                        -beos*)
index df8eea7..fc98710 100755 (executable)
@@ -1,10 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,9 +27,9 @@ scriptversion=2009-04-28.21; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
   -h | --h*)
     cat <<\EOF
 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -40,11 +39,11 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
+  tmpdepfile  Temporary file to use when outputting dependencies.
   libtool     Whether libtool is used (yes/no).
 
 Report bugs to <bug-automake@gnu.org>.
@@ -57,6 +56,66 @@ EOF
     ;;
 esac
 
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
 
 rm -f "$tmpdepfile"
 
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
 # Some modes work just like other modes, but use different flags.  We
 # parameterize here, but still list the modes in the big case below,
 # to make depend.m4 easier to write.  Note that we *cannot* use a case
@@ -80,18 +142,32 @@ if test "$depmode" = hp; then
 fi
 
 if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
 fi
 
 cygpath_u="cygpath -u -f -"
 if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u="sed s,\\\\\\\\,/,g"
-   depmode=msvisualcpp
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
 fi
 
 case "$depmode" in
@@ -114,8 +190,7 @@ gcc3)
   done
   "$@"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -123,13 +198,17 @@ gcc3)
   ;;
 
 gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
 ## There are various ways to get dependency output from gcc.  Here's
 ## why we pick this rather obscure method:
 ## - Don't want to use -MD because we'd like the dependencies to end
 ##   up in a subdir.  Having to rename by hand is ugly.
 ##   (We might end up doing this anyway to support other compilers.)
 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
 ## - Using -M directly means running the compiler twice (even worse
 ##   than renaming).
   if test -z "$gccflag"; then
@@ -137,31 +216,31 @@ gcc)
   fi
   "$@" -Wp,"$gccflag$tmpdepfile"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
-## well.
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -179,8 +258,7 @@ sgi)
     "$@" -MDupdate "$tmpdepfile"
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -188,43 +266,41 @@ sgi)
 
   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
     echo "$object : \\" > "$depfile"
-
     # Clip off the initial element (the dependent).  Don't try to be
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
     echo >> "$depfile"
-
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
   else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.u
     tmpdepfile2=$base.u
@@ -237,9 +313,7 @@ aix)
     "$@" -M
   fi
   stat=$?
-
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
@@ -248,44 +322,100 @@ aix)
   do
     test -f "$tmpdepfile" && break
   done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
   fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
+  # and will wrap long lines using '\' :
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
 
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -297,8 +427,8 @@ icc)
   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
   # Some versions of the HPUX 10.20 sed can't process this invocation
   # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -309,9 +439,8 @@ hp2)
   # 'foo.d', which lands next to the object file, wherever that
   # happens to be.
   # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from  "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.d
     tmpdepfile2=$dir.libs/$base.d
@@ -322,8 +451,7 @@ hp2)
     "$@" +Maked
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
      rm -f "$tmpdepfile1" "$tmpdepfile2"
      exit $stat
   fi
@@ -333,77 +461,107 @@ hp2)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
     sed -ne '2,${
-              s/^ *//
-              s/ \\*$//
-              s/$/:/
-              p
-            }' "$tmpdepfile" >> "$depfile"
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
   else
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile" "$tmpdepfile2"
   ;;
 
 tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
 
 #nosideeffect)
   # This comment above is used by automake to tell side-effect
@@ -422,7 +580,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -442,18 +600,18 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -503,12 +661,15 @@ makedepend)
   touch "$tmpdepfile"
   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
   rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile" "$tmpdepfile".bak
   ;;
 
@@ -525,7 +686,7 @@ cpp)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -544,10 +705,10 @@ cpp)
     esac
   done
 
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
+  "$@" -E \
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    sed '$ s: \\$::' > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   cat < "$tmpdepfile" >> "$depfile"
@@ -579,23 +740,23 @@ msvisualcpp)
       shift
       ;;
     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-       set fnord "$@"
-       shift
-       shift
-       ;;
+        set fnord "$@"
+        shift
+        shift
+        ;;
     *)
-       set fnord "$@" "$arg"
-       shift
-       shift
-       ;;
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
     esac
   done
   "$@" -E 2>/dev/null |
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
index 6781b98..59990a1 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,25 +35,21 @@ scriptversion=2009-04-28.21; # UTC
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='  '
 nl='
 '
-IFS=" ""       $nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,42 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-       shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-       case $mode in
-         *' '* | *'    '* | *'
-'*       | *'*'* | *'?'* | *'['*)
-           echo "$0: invalid mode: $mode" >&2
-           exit 1;;
-       esac
-       shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-       shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-       shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)        shift
-       break;;
+    --) shift
+        break;;
 
-    -*)        echo "$0: invalid option: $1" >&2
-       exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -186,6 +186,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
   done
 fi
 
@@ -194,13 +198,26 @@ if test $# -eq 0; then
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call `install-sh -d' without argument.
+  # It's OK to call 'install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
 
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
@@ -211,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
-       u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
-       u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -228,9 +245,9 @@ fi
 
 for src
 do
-  # Protect names starting with `-'.
+  # Protect names problematic for 'test' and other utilities.
   case $src in
-    -*) src=./$src;;
+    -* | [=\(\)!]) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -252,51 +269,20 @@ do
       echo "$0: no destination specified." >&2
       exit 1
     fi
-
     dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
 
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-       echo "$0: $dst_arg: Is a directory" >&2
-       exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-       (dirname "$dst") 2>/dev/null ||
-       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-            X"$dst" : 'X\(//\)[^/]' \| \
-            X"$dst" : 'X\(//\)$' \| \
-            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-       echo X"$dst" |
-           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)[^/].*/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\).*/{
-                  s//\1/
-                  q
-                }
-                s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -307,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-       # Create intermediate dirs using mode 755 as modified by the umask.
-       # This is like FreeBSD 'install' as of 1997-10-28.
-       umask=`umask`
-       case $stripcmd.$umask in
-         # Optimize common cases.
-         *[2367][2367]) mkdir_umask=$umask;;
-         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-         *[0-7])
-           mkdir_umask=`expr $umask + 22 \
-             - $umask % 100 % 40 + $umask % 20 \
-             - $umask % 10 % 4 + $umask % 2
-           `;;
-         *) mkdir_umask=$umask,go-w;;
-       esac
-
-       # With -d, create the new directory with the user-specified mode.
-       # Otherwise, rely on $mkdir_umask.
-       if test -n "$dir_arg"; then
-         mkdir_mode=-m$mode
-       else
-         mkdir_mode=
-       fi
-
-       posix_mkdir=false
-       case $umask in
-         *[123567][0-7][0-7])
-           # POSIX mkdir -p sets u+wx bits regardless of umask, which
-           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-           ;;
-         *)
-           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-           if (umask $mkdir_umask &&
-               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-           then
-             if test -z "$dir_arg" || {
-                  # Check for POSIX incompatibilities with -m.
-                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                  # other-writeable bit of parent directory when it shouldn't.
-                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
-                  case $ls_ld_tmpdir in
-                    d????-?r-*) different_mode=700;;
-                    d????-?--*) different_mode=755;;
-                    *) false;;
-                  esac &&
-                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                  }
-                }
-             then posix_mkdir=:
-             fi
-             rmdir "$tmpdir/d" "$tmpdir"
-           else
-             # Remove any dirs left behind by ancient mkdir implementations.
-             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-           fi
-           trap '' 0;;
-       esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-       umask $mkdir_umask &&
-       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -384,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-       /*) prefix='/';;
-       -*) prefix='./';;
-       *)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-       test -z "$d" && continue
-
-       prefix=$prefix$d
-       if test -d "$prefix"; then
-         prefixes=
-       else
-         if $posix_mkdir; then
-           (umask=$mkdir_umask &&
-            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-           # Don't fail if two instances are running concurrently.
-           test -d "$prefix" || exit 1
-         else
-           case $prefix in
-             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-             *) qprefix=$prefix;;
-           esac
-           prefixes="$prefixes '$qprefix'"
-         fi
-       fi
-       prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-       # Don't fail if two instances are running concurrently.
-       (umask $mkdir_umask &&
-        eval "\$doit_exec \$mkdirprog $prefixes") ||
-         test -d "$dstdir" || exit 1
-       obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -465,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -486,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-       # Now remove or move aside any old file at destination location.
-       # We try this two ways since rm can't unlink itself on some
-       # systems and the destination file might be busy for other
-       # reasons.  In this case, the final cleanup might fail but the new
-       # file should still install successfully.
-       {
-         test ! -f "$dst" ||
-         $doit $rmcmd -f "$dst" 2>/dev/null ||
-         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-         } ||
-         { echo "$0: cannot unlink or rename $dst" >&2
-           (exit 1); exit 1
-         }
-       } &&
-
-       # Now rename the file to the real destination.
-       $doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
old mode 100755 (executable)
new mode 100644 (file)
index 6f650ae..bffda54
@@ -1,9 +1,9 @@
 
-# libtool (GNU libtool) 2.4
+# libtool (GNU libtool) 2.4.2
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -41,6 +41,7 @@
 #       --quiet, --silent    don't print informational messages
 #       --no-quiet, --no-silent
 #                            print informational messages (default)
+#       --no-warn            don't display warning messages
 #       --tag=TAG            use configuration variables from tag TAG
 #   -v, --verbose            print more informational messages than default
 #       --no-verbose         don't print the extra informational messages
@@ -69,7 +70,7 @@
 #         compiler:            $LTCC
 #         compiler flags:              $LTCFLAGS
 #         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4 Debian-2.4-2
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.11
 #         automake:    $automake_version
 #         autoconf:    $autoconf_version
 #
@@ -79,9 +80,9 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4 Debian-2.4-2"
+VERSION="2.4.2 Debian-2.4.2-1.11"
 TIMESTAMP=""
-package_revision=1.3293
+package_revision=1.3337
 
 # Be Bourne compatible
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
@@ -136,15 +137,10 @@ progpath="$0"
 
 : ${CP="cp -f"}
 test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
-: ${SED="/bin/sed"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
 : ${Xsed="$SED -e 1s/^X//"}
 
@@ -387,7 +383,7 @@ case $progpath in
      ;;
   *)
      save_IFS="$IFS"
-     IFS=:
+     IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
        IFS="$save_IFS"
        test -x "$progdir/$progname" && break
@@ -771,8 +767,8 @@ func_help ()
        s*\$LTCFLAGS*'"$LTCFLAGS"'*
        s*\$LD*'"$LD"'*
        s/\$with_gnu_ld/'"$with_gnu_ld"'/
-       s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-       s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+       s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+       s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
        p
        d
      }
@@ -1052,6 +1048,7 @@ opt_finish=false
 opt_help=false
 opt_help_all=false
 opt_silent=:
+opt_warning=:
 opt_verbose=:
 opt_silent=false
 opt_verbose=false
@@ -1120,6 +1117,10 @@ esac
                        opt_silent=false
 func_append preserve_args " $opt"
                        ;;
+      --no-warning|--no-warn)
+                       opt_warning=false
+func_append preserve_args " $opt"
+                       ;;
       --no-verbose)
                        opt_verbose=false
 func_append preserve_args " $opt"
@@ -2059,7 +2060,7 @@ func_mode_compile ()
     *.[cCFSifmso] | \
     *.ada | *.adb | *.ads | *.asm | \
     *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
       func_xform "$libobj"
       libobj=$func_xform_result
       ;;
@@ -3201,11 +3202,13 @@ func_mode_install ()
 
       # Set up the ranlib parameters.
       oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
 
       func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
 
       if test -n "$stripme" && test -n "$old_striplib"; then
-       func_show_eval "$old_striplib $oldlib" 'exit $?'
+       func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
       fi
 
       # Do each command in the postinstall commands.
@@ -3470,7 +3473,7 @@ static const void *lt_preloaded_setup() {
          # linked before any other PIC object.  But we must not use
          # pic_flag when linking with -static.  The problem exists in
          # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-         *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+         *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
            pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
          *-*-hpux*)
            pic_flag_for_symtable=" $pic_flag"  ;;
@@ -3982,14 +3985,17 @@ func_exec_program_core ()
 # launches target application with the remaining arguments.
 func_exec_program ()
 {
-  for lt_wr_arg
-  do
-    case \$lt_wr_arg in
-    --lt-*) ;;
-    *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
-    esac
-    shift
-  done
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
   func_exec_program_core \${1+\"\$@\"}
 }
 
@@ -5057,9 +5063,15 @@ void lt_dump_script (FILE* f)
 {
 EOF
            func_emit_wrapper yes |
-              $SED -e 's/\([\\"]\)/\\\1/g' \
-                  -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
-
+             $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
             cat <<"EOF"
 }
 EOF
@@ -5643,7 +5655,8 @@ func_mode_link ()
        continue
        ;;
 
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
        func_append compiler_flags " $arg"
        func_append compile_command " $arg"
        func_append finalize_command " $arg"
@@ -6150,7 +6163,8 @@ func_mode_link ()
        lib=
        found=no
        case $deplib in
-       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
          if test "$linkmode,$pass" = "prog,link"; then
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
@@ -6834,7 +6848,7 @@ func_mode_link ()
                 test "$hardcode_direct_absolute" = no; then
                add="$dir/$linklib"
              elif test "$hardcode_minus_L" = yes; then
-               add_dir="-L$dir"
+               add_dir="-L$absdir"
                # Try looking first in the location we're being installed to.
                if test -n "$inst_prefix_dir"; then
                  case $libdir in
@@ -7319,6 +7333,7 @@ func_mode_link ()
          # which has an extra 1 added just for fun
          #
          case $version_type in
+         # correct linux to gnu/linux during the next big refactor
          darwin|linux|osf|windows|none)
            func_arith $number_major + $number_minor
            current=$func_arith_result
@@ -7438,7 +7453,7 @@ func_mode_link ()
          versuffix="$major.$revision"
          ;;
 
-       linux)
+       linux) # correct to gnu/linux during the next big refactor
          func_arith $current - $age
          major=.$func_arith_result
          versuffix="$major.$age.$revision"
@@ -8026,6 +8041,11 @@ EOF
 
       # Test again, we may have decided not to build it any more
       if test "$build_libtool_libs" = yes; then
+       # Remove ${wl} instances when linking with ld.
+       # FIXME: should test the right _cmds variable.
+       case $archive_cmds in
+         *\$LD\ *) wl= ;;
+        esac
        if test "$hardcode_into_libs" = yes; then
          # Hardcode the library paths
          hardcode_libdirs=
@@ -8056,7 +8076,7 @@ EOF
            elif test -n "$runpath_var"; then
              case "$perm_rpath " in
              *" $libdir "*) ;;
-             *) func_apped perm_rpath " $libdir" ;;
+             *) func_append perm_rpath " $libdir" ;;
              esac
            fi
          done
@@ -8064,11 +8084,7 @@ EOF
          if test -n "$hardcode_libdir_separator" &&
             test -n "$hardcode_libdirs"; then
            libdir="$hardcode_libdirs"
-           if test -n "$hardcode_libdir_flag_spec_ld"; then
-             eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-           else
-             eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-           fi
+           eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
          fi
          if test -n "$runpath_var" && test -n "$perm_rpath"; then
            # We should set the runpath_var.
@@ -9158,6 +9174,8 @@ EOF
            esac
          done
        fi
+       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+       tool_oldlib=$func_to_tool_file_result
        eval cmds=\"$old_archive_cmds\"
 
        func_len " $cmds"
@@ -9267,7 +9285,8 @@ EOF
              *.la)
                func_basename "$deplib"
                name="$func_basename_result"
-               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+               func_resolve_sysroot "$deplib"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
                test -z "$libdir" && \
                  func_fatal_error "\`$deplib' is not a valid libtool archive"
                func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
index 28055d2..f62bbae 100755 (executable)
@@ -1,11 +1,10 @@
 #! /bin/sh
-# Common stub for a few missing GNU programs while installing.
+# Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -26,69 +25,40 @@ scriptversion=2009-04-28.21; # UTC
 # the same distribution terms that you use for the rest of that program.
 
 if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
+  echo 1>&2 "Try '$0 --help' for more information"
   exit 1
 fi
 
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
+case $1 in
 
-msg="missing on your system"
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
 
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
 
   -h|--h|--he|--hel|--help)
     echo "\
 $0 [OPTION]... PROGRAM [ARGUMENT]...
 
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
 
 Options:
   -h, --help      display this help and exit
   -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
 
 Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
 
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
 
 Send bug reports to <bug-automake@gnu.org>."
     exit $?
@@ -100,272 +70,141 @@ Send bug reports to <bug-automake@gnu.org>."
     ;;
 
   -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
     exit 1
     ;;
 
 esac
 
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar*)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-          sed 's/\.am$/.in/' |
-          while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo "#! /bin/sh"
-       echo "# Created by GNU Automake missing as a replacement of"
-       echo "#  $ $@"
-       echo "exit 0"
-       chmod +x $file
-       exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-       case $LASTARG in
-       *.y)
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.c
-           fi
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.h
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f y.tab.h; then
-       echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-       echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-       case $LASTARG in
-       *.l)
-           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" lex.yy.c
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f lex.yy.c; then
-       echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-        you modified a dependency of a manual page.  You may need the
-        \`Help2man' package in order for those modifications to take
-        effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo ".ab help2man is required to generate this page"
-       exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-       /^@setfilename/{
-         s/.* \([^ ]*\) *$/\1/
-         p
-         q
-       }' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar*)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-       case $firstarg in
-       *o*)
-           firstarg=`echo "$firstarg" | sed s/o//`
-           tar "$firstarg" "$@" && exit 0
-           ;;
-       esac
-       case $firstarg in
-       *h*)
-           firstarg=`echo "$firstarg" | sed s/h//`
-           tar "$firstarg" "$@" && exit 0
-           ;;
-       esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
 
-exit 0
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
index 53353df..6257617 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,717 @@
+2013-04-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * Makefile.am
+    Make sure checkprograms are built as part of 'make test-tarball'.
+    Closes: https://github.com/erikd/libsndfile/issues/37
+
+2013-03-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/dft_cmp.c
+    Fix a buffer overflow detected using GCC 4.8's -fsantiize=address runtime
+    error checking functionality. This was a buffer overflow in libsndfile's
+    test suite, not in the actual library code.
+
+2013-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * M4/gcc_version.m4
+    Fix to work with OpenBSD's sed.
+
+2013-03-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ALAC/alac_encoder.c
+    Patch from Michael Pruett (author of libaudiofile) to add correct byte
+    swapping for the mChannelLayoutTag field.
+
+2013-03-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/bugs.html
+    Bugs should bt reported on the github issue tracker.
+
+2013-02-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac
+    Improve sanitization of FLAC_CFLAGS value.
+
+2013-02-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/Makefile.am
+    Call python interpreter instead of using '#!' in script. Thanks to Jan
+    Stary for reporting this.
+
+    * doc/index.html doc/FAQ.html
+    Make internal links relative. Patch from Jan Stary.
+
+2013-02-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/test_endswap.def src/test_endswap.tpl
+    Add tests for psf_put_be32() and psf_put_be64().
+
+    * src/sfendian.h src/test_endswap.(def|tpl)
+    Add functions psf_get_be(16|32|64) with tests.
+    These are needed for platforms where un-aligned accesses cause bus faults.
+
+    * src/ALAC/ag_enc.c src/ALAC/alac_decoder.c
+    Replace all un-aligned accesses with safe alternatives.
+    Closes: https://github.com/erikd/libsndfile/issues/19
+
+2013-02-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sfendian.h
+    Add big endian versions of H2BE_16 and H2BE_32.
+
+2013-02-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ALAC/
+    Replace Apple endswap routines with ones from libsndfile.
+
+    * merge from libsndfile-cart repo
+    Add ability to set and get a cart chunk with WAV and RF64.
+    Orignal patch by Chris Roberts <c.roberts@csrfm.com> required a number of
+    tweaks.
+
+2013-02-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h
+    Bump SF_HEADER_LEN from 8192 to 12292, the value it was in the 1.0.25
+    release.
+
+2013-02-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/alac.c
+    Fix segfault when encoding 8 channel files.
+    Closes: https://github.com/erikd/libsndfile/issues/30
+
+2013-02-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ALAC/EndianPortable.c
+    Fall back to compiler's __BYTE_ORDER__ for endian-ness detection.
+
+2013-02-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac src/common.h src/ima_adpcm.c src/ms_adpcm.c src/paf.c
+    Drop tests for and #ifdef hackery for C99 struct flexible array feature.
+    libsndfile assumes the compiler supports most of the ISO C99 standard.
+
+    * src/alac.c
+    Fix valgrind invalid realloc. Reported by nu774.
+    Closes: https://github.com/erikd/libsndfile/issues/31
+
+2013-02-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/alac.c
+    The 'pakt' chunk header should now be written correctly.
+    Closes: https://github.com/erikd/libsndfile/issues/24
+
+    * configure.ac Makefile.am
+    Use PKG_INSTALLDIR when it exists. Suggestion from Christoph Thompson.
+    Closes: https://github.com/erikd/libsndfile/pull/28
+
+2013-02-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src/caf.c
+    Read the ALAC 'pakt' header and stash the values.
+
+    * src/sfendian.h
+    Add functions psf_put_be64() and psf_put_be32().
+
+    * src/alac.c
+    Start work on filling on the 'pakt' chunk header.
+
+2013-02-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/FAQ.html
+    Add missing opening <P> tag.
+
+    * src/alac.c
+    Increase ALAC_BYTE_BUFFER_SIZE to 82000.
+
+2013-01-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/FAQ.html
+    Improve question #8.
+
+2013-01-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ogg_opus.c
+    Add skeleton implementation so someone else can run with it.
+
+2012-12-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src/dwd.c src/rx2.c src/txw.c
+    Fix for compiling when configured with --enable-experimental. Thanks to
+    Eric Wong for reporting this.
+
+2012-12-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac programs/sndfile-play.c
+    OS X 10.8 uses a different audio API to previous versions.
+    Fix compile failure on by disabling sndfile-play on this version.
+    Someone needs to supply code for the new API.
+
+2012-11-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * Octave/Makefile.am Octave/octave_test.sh
+    Fix 'make distcheck'.
+
+2012-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * M4/octave.m4
+    Relax constraints on Octave version.
+
+2012-10-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/utils.tpl
+    Improve compare_*_or_die() functions.
+
+    * src/command.c
+    Fix bug reported by Keiler Florian. When reading short or int data from a
+    file containing float data, and setting SFC_SET_SCALE_FLOAT_INT_READ to
+    SF_TRUE would fail 3, 5, 7 and other channels counts. Problem was that
+    psf_calc_signal_max() was not calculating the signal max correctly.
+    Calculation of the signal max was failing because it was trying to read
+    a sample count that was not an integer multiple of the channel count.
+
+    * tests/channel_test.c tests/Makefile.am tests/test_wrapper.sh.in
+    Add test for the above.
+
+2012-09-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.hh
+    Added a constructor to allow the use of SF_VIRTUAL_IO. Patch from
+    DannyDaemonic : https://github.com/erikd/libsndfile/pull/20
+
+2012-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/octave.html
+    Fix link to octave.sourceforge.net. Thanks to IOhannes m zmoelnig.
+
+    * src/mat5.c
+    Allow reading of mat5 files without a specified sample rate (default to
+    44.1kHz). Thanks to IOhannes m zmoelnig.
+
+2012-08-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/paf.c
+    Error out if channel count is zero. Bug report from William ELla via
+    launchpad:
+    https://bugs.launchpad.net/ubuntu/+source/libsndfile/+bug/1036831
+
+2012-08-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac programs/sndfile-play.c
+    Patch from Ricci Adams to use OSX's AudioQueues on OSX 10.7 and greater.
+
+2012-07-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * programs/common.c
+    Accept "ogg" as a file extention for Ogg/Vorbis files.
+
+2012-06-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/flac.c
+    Make sure any previously allocated FLAC stream encoder and stream decoder
+    objects are deleted before a new one is allocated.
+
+2012-06-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/utils.tpl
+    Rename gen_lowpass_noise_float() to gen_lowpass_signal_float() and add a
+    sine wave component so that different FLAC compression levels can be
+    tested.
+
+    * src/sndfile.h.in doc/command.html
+    Add SFC_SET_COMPRESSION_LEVEL and document it.
+
+    * src/sndfile.c
+    Catch SFC_SET_VBR_ENCODING_QUALITY command and implement it as the inverse
+    of SFC_SET_COMPRESSION_LEVEL.
+
+    * src/ogg_vorbis.c src/flac.c
+    Implement SFC_SET_COMPRESSION_LEVEL command.
+
+    * tests/test_wrapper.sh.in tests/compression_size_test.c
+    Use the compression_size_test on FLAC as well.
+
+2012-06-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/
+    Rename vorbis_test.c -> compression_size_test.c so it can be extended to
+    test FLAC as well.
+
+2012-06-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/broadcast.c
+    Fix a bug where a file with a 'bext' chunk with a zero length coding
+    history field would get corrupted when the file was closed.
+    Reported by Paul Davis of the Ardour project.
+
+    * src/test_broadcast_var.c
+    Add a test for the above.
+
+2012-05-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.c
+    sf_format_check: For SF_FORMAT_AIFF, reject endian-ness setttings for
+    non-PCM formats.
+
+2012-04-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/aiff.c
+    Fix regression in handling of odd length SSND chunks.
+    Thanks Olivier Tristan for the example file.
+
+    * src/aiff.c src/wav.c
+    Exit parser loop when marker == 0.
+
+2012-04-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/FAQ.html
+    Fix text. Thanks to Richard Collins.
+
+2012-03-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/caf.c
+    Exit parse loop if the marker is zero. Pass jump offsets as size_t instead
+    of int.
+
+2012-03-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/alac.c
+    Fix segfault when decoding CAF/ALAC file with more than 4 channels.
+    Fixes github issue #8 reported by Charles Van Winkle.
+
+2012-03-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h
+    Change 'typedef SF_CHUNK_ITERATOR { ... } SF_CHUNK_ITERATOR' into 'struct
+    SF_CHUNK_ITERATOR { ... }' to prevent older compilers from complaining of
+    re-typedef-ing of SF_CHUNK_ITERATOR.
+
+    * configure.ac
+    Fix if test for empty $prefix.
+
+2012-03-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/*.c tests/chunk_test.c
+    Reworking of custom chunk handling code.
+    - Memory for the iterator is now attached to the SF_PRIVATE struct and
+      freed one sf_close().
+    - Rename sf_create_chunk_iterator() ->  sf_get_chunk_iterator().
+    - Each SNDFILE handle never has more than one SF_CHUNK_ITERATOR handle.
+
+    * tests/string_test.c
+    Fix un-initialised char buffer.
+
+2012-03-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/*.c tests/chunk_test.c
+    Add improved handling of custom chunk getting and settings. Set of patches
+    from IOhannes m zmoelnig submitted via github pull request #6.
+
+    * src/alac.c
+    Fix calculated frame count for files with zero block length.
+
+2012-03-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/avr.c
+    Remove double assignment to psf->endian. Thanks Kao Dome.
+
+    * src/gsm610.c
+    Fix clearing of buffers. Thanks Kao Dome.
+
+    * src/paf.c
+    Remove duplicate code. Thanks Kao Dome.
+
+    * src/test_strncpy_crlf.c
+    Fix minor error in test. Thanks Kao Dome.
+
+    * src/common.h src/*.c
+    Fix a bunch of valgrind errors.
+
+2012-03-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.c
+    Fix typo in error string 'Uknown' -> 'Unknown'.
+
+    * tests/fix_this.c
+    Fix potential int overflow.
+
+2012-03-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/alac.c
+    Fix decoding of last block so that the decode length is not a multiple of
+    the block length. Fixes github issue #4 reported by Charles Van Winkle.
+
+    * src/sfconfig.h src/sfendian.h
+    Fix for MinGW cross compiling. Use '#if (defined __*66__)' instead of
+    '#if __*86__' because the MinGW header use '#ifdef __x86_64__'.
+
+2012-03-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ALAC/ src/alac.c
+    Unify the interface between libsndfile and Apple ALAC codec. Regardless of
+    file bit width samples are now passed between the two as int32_t that are
+    justified towards the most significant bit. Without this modification, 16
+    conversion functions would have been needed between the libsndfile (short,
+    int, float, double) types and the ALAC types (16, 20, 24 and 32 bit). With
+    this mod, only 4 are needed.
+
+    * tests/floating_point_test.tpl tests/write_read_test.(def|tpl)
+    Add tests for 20 and 24 bit ALAC/CAF files.
+
+    * src/command.c
+    Add ALAC/CAF to the SFC_GET_FORMAT_* commands. Fixes github issue #5.
+
+    * configure.ac
+    Only use automake AM_SLIENT_RULES where supported. Thanks Dave Yeo.
+
+    * tests/pipe_test.tpl
+    Disable tests on OS/2. Thanks Dave Yeo.
+
+2012-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac src/sfconfig.h src/sfendian.h
+    For GCC, use inline assembler for endian swapping. This should work with
+    older versions of GCC like the one currently used in OS/2.
+
+2012-03-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/alac.c
+    Make sure temp file gets opened in binary mode.
+
+    * src/alac.c src/common.c src/common.h
+    Fix function alac_write16_d().
+
+    * tests/floating_point_test.tpl
+    Add tests for 16 bit ALAC/CAF.
+
+    * src/alac.c src/common.c src/common.h
+    Add support for 32 bit ALAC/CAF files.
+
+    * tests/floating_point_test.tpl tests/write_read_test.tpl
+    Add tests for 32 bit ALAC/CAF files.
+
+2012-03-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/
+    Refactor chunk storage so it work on big as well as little endian CPUs.
+
+    * tests/chunk_test.c
+    Clean up error messages.
+
+    * src/sfendian.h src/*.c
+    Rename endian swapping macros and add ENDSWAP_64 and BE2H_64.
+
+    * configure.ac
+    Detect presence of <x86intrin.h> header file.
+
+    * src/sfendian.h
+    Use <x86intrin.h> intrinsics (ie for MinGW) when <byteswap.h> is not
+    present.
+    Make ENDSWAP_64() work with i686-w64-mingw32 compiler.
+
+    * src/ALAC/EndianPortable.c
+    Add support for __powerpc__.
+
+    * src/sfconfig.h
+    Make sure HAVE_X86INTRIN_H is either 1 or 0.
+
+2012-03-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/ALAC/*
+    Big dump of code for Apple's ALAC file format. The copyyright to this code
+    is owned by Apple who have released it under an Apache style license. A few
+    small modifications were made to allow this to be integrated into libsndfile
+    but unfortunately the history of those changes were lost because they were
+    developed in a Bzr tree and during that time libsndfile moved to Git.
+
+    * src/alac.c src/caf.c src/common.[ch] src/Makefile.am src/sndfile.h.in
+        src/sndfile.c
+    Hook new ALAC codec in.
+
+    * programs/sndfile-convert.c
+    Add support for alac codec.
+
+    * tests/write_read_test.tpl
+    Expand tests to cover ALAC.
+
+2012-03-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/aiff.c src/wav.c
+    Fix a couple of regressions from version 1.0.25.
+
+2012-03-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/strings.c
+    Minor refactoring. Make sure that the memory allocation size if always > 0
+    to avoid undefined behaviour.
+
+2012-02-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/chunk.c
+    Fix buffer overrun introduced in recently added chunk logging. This chunk
+    logging has not yet made it to a libsndfile release version. Thanks to
+    Olivier Tristan for providing an example file.
+
+    * src/wav.c
+    Fix handling of odd sized chunks which was causing the parser to lose some
+    chunks. Thanks to Olivier Tristan for providing an example file.
+
+2012-02-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/util.tpl
+    Used gnu_printf format checking with mingw-w64 compiler.
+
+    * tests/header_test.tpl
+    Printf format fixes.
+
+2012-02-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * M4/extra_pkg.m4
+    Update PKG_CHECK_MOD_VERSION macro to add an AC_TRY_LINK step. This fix
+    allows the configure process to catch attempts to link incompatible
+    libraries. For example, linking 32 bit version of eg libFLAC to a 64 bit
+    version of libsndfile will now fail. Similarly, when cross compiling
+    libsndfile from Linux to Windows linking the Linux versions of a library
+    to the Windows version of libsndfile will now also fail.
+
+    * src/sndfile.h.in src/sndfile.c src/common.h src/create_symbols_file.py
+    Add API function sf_current_byterate().
+
+    * src/dwvw.c src/flac.c src/ogg_vorbis.c src/sds.c
+    Add codec specific handlers for current byterate.
+
+    * tests/floating_point_test.tpl
+    Add initial test for sf_current_byterate().
+
+2012-02-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.[ch]
+    Add function psf_decode_frame_count().
+
+    * src/dwvw.c
+    Fix a termnation bug that caused the decoder to go into an infinite loop.
+
+2012-02-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/wav.c
+    Fix a regression in the WAV header parser. Thanks to Olivier Tristan for
+    bug report and the example file.
+
+2012-02-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.c
+    Return error when SF_BROADCAST_INFO struct has bad coding_history_size.
+    Thanks to Alex Weiss for the report.
+
+2012-02-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/au.c src/flac.c src/g72x.c src/ogg_vorbis.c src/wav_w64.c
+    Don't fake psf->bytewidth values.
+
+2012-02-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/string_test.c
+    Fix valgrind warnings.
+
+    * src/common.h src/sndfile.c src/strings.c
+    Make string storage dynamically allocated.
+
+    * src/sndfile.c
+    Add extra validation for custom chunk handling.
+
+2012-02-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/wav.c
+    Improve handlling unknown chunk types. Thanks to Olivier Tristan for sending
+    example files.
+
+    * src/utils.tpl
+    Add GCC specific testing for format string parameters for exit_if_true().
+
+    * tests/*.c tests/*.tpl
+    Fix all printf format warnings.
+
+    * programs/sndfile-play.c
+    Remove un-needed OSX include <Carbon.h>. Thanks jamesfmilne for github
+    issue #3.
+
+    * tests/chunk_test.c
+    Extend custom chunk test.
+
+2012-02-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/wav.c
+    Jump over some more chunk types while parsing.
+
+2012-02-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src/strings.c
+    Change way strings are stored in SF_PRIVATE in preparation for dynamically
+    allocating the storage.
+
+2012-02-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src*.c
+    Improve encapsulation of string data in SF_PRIVATE.
+
+2012-02-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src*.c
+    Remove the buffer union from SF_PRIVATE. Most uses of this have been
+    replaced with a BUF_UNION that is allocated on the stack.
+
+2012-01-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/common.h src*.c
+    Rename logbuffer field of SF_PRIVATE to parselog and reduce its size.
+    Put the parselog buffer and the index inside a struct within SF_PRIVATE.
+
+2012-01-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac
+    Fix typo, FLAC_CLFAGS -> FLAC_CFLAGS. Thanks to Jeremy Friesner.
+
+2012-01-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.c src/ogg.c
+    Fix misleading error message when trying to create an SF_FORMAT_OGG file
+    with anything other than SF_FORMAT_FILE. Thanks to Charles Van Winkle for
+    the bug report. Github issue #1.
+
+2012-01-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.c src/wav.c
+    Allow files opened in RDWR mode with string data in the tailer to be
+    extended. Thanks to Bodo for the patch.
+
+    * tests/string_test.c
+    Add tests for the above changes (patch from Bodo).
+
+2012-01-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/aiff.c
+    Refactor reading of chunk size and use of psf_store_read_chunk().
+
+    * src/(caf|wav).c
+    Correct storing of chunk offset.
+
+2012-01-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/aiff.c src/wav.c src/common.h
+    Refactor common code into src/common.h.
+
+    * src/caf.c
+    Make custom chunks work for CAF files.
+
+    * tests/chunk_test.c tests/test_wrapper.sh.in
+    Test CAF files with custom chunks.
+
+    * src/sndfile.c
+    Prevent psf->codec_close() being called more than once.
+
+2012-01-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * programs/sndfile-cmp.c
+    Catch the case where the second file has more frames than the first.
+
+2012-01-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/create_symbols_file.py
+    Add sf_set_chunk/sf_get_chunk_size/sf_get_chunk_data.
+
+2011-12-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/chunk_test.c tests/Makefile.am
+    New test for custom chunks.
+
+    * src/aiff.c src/chunk.c src/common.h src/sndfile.c
+    Make custom chunks work on AIFF files.
+
+    * src/wav.c
+    Make custom chunks work on WAV files (includes refactoring).
+
+2011-11-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sndfile.h.in src/common.h src/sndfile.c
+    Start working on setting/getting chunks.
+
+2011-11-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/binheader_writef_check.py src/create_symbols_file.py
+    Make it work for Python 2 and 3. Thanks Michael.
+
+2011-11-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * libsndfile.spec.in
+    Change field name 'URL' to 'Url'.
+
+    * src/sndfile.h.in
+    Add SF_SEEK_SET/CUR/END.
+
+2011-11-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/id3.c
+    Fix a stack overflow that can occur when parsing a file with multiple
+    ID3 headers which would cause libsndfile to go into an infinite recursion
+    until it blew the stack. Thanks to Anders Svensson for supplying an example
+    file.
+
+2011-10-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/double64.c src/float32.c src/common.h
+    Make (float32|double_64)_(be|le)_read() functions const correct.
+
+2011-10-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sfendian.h
+    Minor tweaking of types. Cast to ptr to correct final type rather void*.
+
+    * programs/sndfile-play.c tests/utils.tpl
+    Fix compiler warnings with latest MinGW cross compiler.
+
+2011-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/file_io.c
+    Use the non-deprecated resource fork name on OSX. Thanks to Olivier Tristan.
+
+2011-10-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/wav.c
+    Jump over the 'olym' chunks when parsing.
+
+2011-10-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * tests/write_read_test.tpl
+    Remove windows only truncate() implementation.
+
+2011-09-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * src/sd2.c src/sndfile.c
+    Make sure 23 bit PCM SD2 files are readable/writeable.
+
+    * tests/write_read_test.tpl
+    Add tests for 32 bit PCM SD2 files.
+
+2011-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac
+    Use AC_SYS_LARGEFILE instead of AC_SYS_EXTRA_LARGEFILE as suggested by
+    Jan Willies.
+
+2011-08-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * configure.ac Makefile.am
+    Move ACLOCAL_AMFLAGS setup to Makefile.am.
+
+2011-07-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * doc/command.html
+    Merge two separate blocks of SFC_SET_VBR_ENCODING_QUALITY documentation.
+
+    * src/paf.c
+    Replace ppaf24->samplesperblock with a compile time constant.
+
 2011-07-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
 
     * src/ogg_vorbis.c
     * src/sndfile.c
     Only support writing mono SVX files. Multichannel SVX files are not
     interleaved and there is no support infrastructure to cache and write
-       multiple channels to create a non-interleaved file.
+    multiple channels to create a non-interleaved file.
 
     * src/file_io.c
     Don't call close() on a file descriptor of -1. Thanks to Jeremy Friesner
     Add channel map tests.
 
     * src/common.h src/sndfile.c
-    Add a pointer the the SF_PRIVATE struct and make sure it gets freed in
+    Add a pointer to the SF_PRIVATE struct and make sure it gets freed in
     sf_close().
 
 2006-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
 
     * src/strings.c
     Found and fixed a bug which was causing psf_store_string() to fail on
-    Motorola 68k processors. Many thanks fo Joshua Haberman (Debian maintainer
+    Motorola 68k processors. Many thanks to Joshua Haberman (Debian maintainer
     of libsndfile) for compiling and running debug code to help me debug the
     problem.
 
     Document SFC_SET_RAW_START_OFFSET.
 
     * tests/raw_test.c tests/Makefile.am
-    Add new file for for testing SF_FORMAT_RAW specific functionality.
+    Add new file for testing SF_FORMAT_RAW specific functionality.
 
     * tests/dwvw_test.c
     Updates.
@@ -9048,4 +9762,3 @@ This is the boundary between version 1 of the library above and version 0 below.
     * src/aiff.c:
     Changed reading of 'COMM' chunk to avoid reading an int
     which overlaps an int (4 byte) boundary.
-
index 1ec5172..e2d984a 100644 (file)
@@ -1,5 +1,5 @@
 ## Process this file with automake to produce Makefile.in
 
-EXTRA_DIST = add_cflags.m4 clip_mode.m4 endian.m4 extra_largefile.m4 \
+EXTRA_DIST = add_cflags.m4 clip_mode.m4 endian.m4 \
        flexible_array.m4 llrint.m4 lrint.m4 lrintf.m4 octave.m4 extra_pkg.m4
 
index 2b12106..1e61adb 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,36 +89,48 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = M4
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -102,13 +168,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -172,7 +239,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -211,7 +280,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -223,9 +291,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -238,7 +308,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-EXTRA_DIST = add_cflags.m4 clip_mode.m4 endian.m4 extra_largefile.m4 \
+EXTRA_DIST = add_cflags.m4 clip_mode.m4 endian.m4 \
        flexible_array.m4 llrint.m4 lrint.m4 lrintf.m4 octave.m4 extra_pkg.m4
 
 all: all-am
@@ -256,7 +326,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu M4/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu M4/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -280,11 +349,11 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -331,10 +400,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -415,15 +489,18 @@ uninstall-am:
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       distclean distclean-generic distclean-libtool distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+       cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/M4/clang.m4 b/M4/clang.m4
new file mode 100644 (file)
index 0000000..4cf3077
--- /dev/null
@@ -0,0 +1,31 @@
+dnl @synopsis MN_C_COMPILER_IS_CLANG
+dnl
+dnl Find out if a compiler claiming to be gcc really is gcc (fuck you clang).
+dnl @version 1.0       Oct 31 2013
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is
+dnl provided "as is" without express or implied warranty.
+dnl
+
+
+AC_DEFUN([MN_C_COMPILER_IS_CLANG],
+[AC_CACHE_CHECK(whether we are using the CLANG C compiler,
+       mn_cv_c_compiler_clang,
+       [       AC_LANG_ASSERT(C)
+               AC_TRY_LINK([
+                       #include <stdio.h>
+                       ],
+                       [
+                       #ifndef __clang__
+                               This is not clang!
+                       #endif
+                       ],
+               mn_cv_c_compiler_clang=yes,
+               mn_cv_c_compiler_clang=no
+               ])
+       )
+])
diff --git a/M4/extra_largefile.m4 b/M4/extra_largefile.m4
deleted file mode 100644 (file)
index 3e614c3..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-dnl By default, many hosts won't let programs access large files;
-dnl one must use special compiler options to get large-file access to work.
-dnl For more details about this brain damage please see:
-dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
-
-dnl Written by Paul Eggert <eggert@twinsun.com>.
-
-dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
-dnl MN_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME)
-AC_DEFUN([MN_SYS_EXTRA_LARGEFILE_FLAGS],
-  [AC_CACHE_CHECK([for $1 value to request large file support],
-     ac_cv_sys_largefile_$1,
-     [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || {
-       ac_cv_sys_largefile_$1=no
-       ifelse($1, CFLAGS,
-         [case "$host_os" in
-          # IRIX 6.2 and later require cc -n32.
-changequote(, )dnl
-          irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
-changequote([, ])dnl
-            if test "$GCC" != yes; then
-              ac_cv_sys_largefile_CFLAGS=-n32
-            fi
-            ac_save_CC="$CC"
-            CC="$CC $ac_cv_sys_largefile_CFLAGS"
-            AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no)
-            CC="$ac_save_CC"
-          esac])
-      }])])
-
-dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
-dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL)
-AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND],
-  [case $2 in
-   no) ;;
-   ?*)
-     case "[$]$1" in
-     '') $1=$2 ;;
-     *) $1=[$]$1' '$2 ;;
-     esac ;;
-   esac])
-
-dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
-dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT)
-AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE],
-  [AC_CACHE_CHECK([for $1], $2,
-     [$2=no
-changequote(, )dnl
-      $4
-      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       -D$1)
-         $2=1 ;;
-       -D$1=*)
-         $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
-       esac
-      done
-changequote([, ])dnl
-      ])
-   if test "[$]$2" != no; then
-     AC_DEFINE_UNQUOTED([$1], [$]$2, [$3])
-   fi])
-
-AC_DEFUN([AC_SYS_EXTRA_LARGEFILE],
-  [AC_REQUIRE([AC_CANONICAL_HOST])
-   AC_ARG_ENABLE(largefile,
-     [  --disable-largefile     omit support for large files])
-   if test "$enable_largefile" != no; then
-     AC_CHECK_TOOL(GETCONF, getconf)
-     MN_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS)
-     MN_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS)
-     MN_SYS_EXTRA_LARGEFILE_FLAGS(LIBS)
-       
-     for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       no) ;;
-       -D_FILE_OFFSET_BITS=*) ;;
-       -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
-       -D_LARGE_FILES | -D_LARGE_FILES=*) ;;
-       -D?* | -I?*)
-        AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;;
-       *)
-        AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;;
-       esac
-     done
-     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS")
-     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS")
-     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS,
-       ac_cv_sys_file_offset_bits,
-       [Number of bits in a file offset, on hosts where this is settable.])
-       [case "$host_os" in
-       # HP-UX 10.20 and later
-       hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
-         ac_cv_sys_file_offset_bits=64 ;;
-       esac]
-     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE,
-       ac_cv_sys_largefile_source,
-       [Define to make fseeko etc. visible, on some hosts.],
-       [case "$host_os" in
-       # HP-UX 10.20 and later
-       hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
-         ac_cv_sys_largefile_source=1 ;;
-       esac])
-     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES,
-       ac_cv_sys_large_files,
-       [Define for large files, on AIX-style hosts.],
-       [case "$host_os" in
-       # AIX 4.2 and later
-       aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
-         ac_cv_sys_large_files=1 ;;
-       esac])
-   fi
-  ])
-
index a92d090..afe474e 100644 (file)
@@ -1,5 +1,6 @@
 # extra_pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
-# 
+#
+# Copyright (c) 2008-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 # Copyright (c) 2004 Scott James Remnant <scott@netsplit.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -40,6 +41,25 @@ AC_MSG_CHECKING([for $2 ])
 _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
 _PKG_CONFIG([$1][_LIBS], [libs], [$2])
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_[]$1[]_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_[]$1[]_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+AC_TRY_LINK([], puts ("");, pkg_link=yes, pkg_link=no)
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
 and $1[]_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.])
@@ -48,7 +68,7 @@ if test $pkg_failed = yes; then
         _PKG_SHORT_ERRORS_SUPPORTED
         if test $_pkg_short_errors_supported = yes; then
                $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
-        else 
+        else
                $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
         fi
        # Put the nasty error message in config.log where it belongs
index 1ef28d9..f8c5cbe 100644 (file)
@@ -20,8 +20,8 @@ if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then
        AC_MSG_RESULT($GCC_VERSION)
 
        changequote(,)dnl
-       GCC_MINOR_VERSION=`echo $GCC_VERSION | sed "s/^[0-9]\+\.//" | sed "s/\..*//"`
        GCC_MAJOR_VERSION=`echo $GCC_VERSION | sed "s/\..*//"`
+       GCC_MINOR_VERSION=`echo $GCC_VERSION | sed "s/$GCC_MAJOR_VERSION\.//" | sed "s/\..*//"`
        changequote([,])dnl
        fi
 
index 8ff3c76..d7c043f 100644 (file)
@@ -1,8 +1,8 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -11,8 +11,8 @@
 
 m4_define([_LT_COPYING], [dnl
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 #   This file is part of GNU Libtool.
@@ -146,6 +146,8 @@ AC_REQUIRE([AC_CANONICAL_BUILD])dnl
 AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
 
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
 _LT_DECL([], [host_alias], [0], [The host system])dnl
 _LT_DECL([], [host], [0])dnl
 _LT_DECL([], [host_os], [0])dnl
@@ -637,7 +639,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
 m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
 configured by $[0], generated by m4_PACKAGE_STRING.
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
@@ -801,6 +803,7 @@ AC_DEFUN([LT_LANG],
 m4_case([$1],
   [C],                 [_LT_LANG(C)],
   [C++],               [_LT_LANG(CXX)],
+  [Go],                        [_LT_LANG(GO)],
   [Java],              [_LT_LANG(GCJ)],
   [Fortran 77],                [_LT_LANG(F77)],
   [Fortran],           [_LT_LANG(FC)],
@@ -822,6 +825,31 @@ m4_defun([_LT_LANG],
 ])# _LT_LANG
 
 
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
 # _LT_LANG_DEFAULT_CONFIG
 # -----------------------
 m4_defun([_LT_LANG_DEFAULT_CONFIG],
@@ -852,6 +880,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
        m4_ifdef([LT_PROG_GCJ],
        [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
 
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
 AC_PROVIDE_IFELSE([LT_PROG_RC],
   [LT_LANG(RC)],
   [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
@@ -954,7 +986,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
          -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
         _lt_result=$?
-       if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -962,6 +1000,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        rm -rf libconftest.dylib*
        rm -f conftest.*
       fi])
+
     AC_CACHE_CHECK([for -exported_symbols_list linker flag],
       [lt_cv_ld_exported_symbols_list],
       [lt_cv_ld_exported_symbols_list=no
@@ -973,6 +1012,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
        [lt_cv_ld_exported_symbols_list=no])
        LDFLAGS="$save_LDFLAGS"
     ])
+
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
       [lt_cv_ld_force_load=no
       cat > conftest.c << _LT_EOF
@@ -990,7 +1030,9 @@ _LT_EOF
       echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
       $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
       _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
        lt_cv_ld_force_load=yes
       else
        cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1035,8 +1077,8 @@ _LT_EOF
 ])
 
 
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
 # Checks for linker and compiler features on darwin
 m4_defun([_LT_DARWIN_LINKER_FEATURES],
 [
@@ -1047,6 +1089,8 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
   if test "$lt_cv_ld_force_load" = "yes"; then
     _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
@@ -1268,7 +1312,7 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
@@ -1280,9 +1324,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
            LD="${LD-ld} -m elf_i386_fbsd"
            ;;
          x86_64-*linux*)
-           LD="${LD-ld} -m elf_i386"
+           case `/usr/bin/file conftest.o` in
+             *x86-64*)
+               LD="${LD-ld} -m elf32_x86_64"
+               ;;
+             *)
+               LD="${LD-ld} -m elf_i386"
+               ;;
+           esac
+           ;;
+         powerpc64le-*)
+           LD="${LD-ld} -m elf32lppclinux"
            ;;
-         ppc64-*linux*|powerpc64-*linux*)
+         powerpc64-*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -1301,7 +1355,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         ppc*-*linux*|powerpc*-*linux*)
+         powerpcle-*)
+           LD="${LD-ld} -m elf64lppc"
+           ;;
+         powerpc-*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -1330,14 +1387,27 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
     CFLAGS="$SAVE_CFLAGS"
   fi
   ;;
-sparc*-*solaris*)
+*-*solaris*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
     *64-bit*)
       case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
       *)
        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
          LD="${LD-ld} -64"
@@ -1414,13 +1484,13 @@ old_postuninstall_cmds=
 if test -n "$RANLIB"; then
   case $host_os in
   openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
     ;;
   esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
 fi
 
 case $host_os in
@@ -1600,6 +1670,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=196608
     ;;
 
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
   osf*)
     # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
     # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -1626,7 +1701,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
@@ -1639,7 +1715,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
              test $i != 17 # 1/2 MB should be enough
       do
@@ -2185,7 +2261,7 @@ need_version=unknown
 
 case $host_os in
 aix3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
@@ -2194,7 +2270,7 @@ aix3*)
   ;;
 
 aix[[4-9]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
@@ -2259,7 +2335,7 @@ beos*)
   ;;
 
 bsdi[[45]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
@@ -2398,7 +2474,7 @@ m4_if([$1], [],[
   ;;
 
 dgux*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -2406,10 +2482,6 @@ dgux*)
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -2417,7 +2489,7 @@ freebsd* | dragonfly*)
     objformat=`/usr/bin/objformat`
   else
     case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
+    freebsd[[23]].*) objformat=aout ;;
     *) objformat=elf ;;
     esac
   fi
@@ -2435,7 +2507,7 @@ freebsd* | dragonfly*)
   esac
   shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  freebsd2*)
+  freebsd2.*)
     shlibpath_overrides_runpath=yes
     ;;
   freebsd3.[[01]]* | freebsdelf3.[[01]]*)
@@ -2454,19 +2526,8 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
@@ -2527,7 +2588,7 @@ hpux9* | hpux10* | hpux11*)
   ;;
 
 interix[[3-9]]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -2543,7 +2604,7 @@ irix5* | irix6* | nonstopux*)
     nonstopux*) version_type=nonstopux ;;
     *)
        if test "$lt_cv_prog_gnu_ld" = yes; then
-               version_type=linux
+               version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
        fi ;;
@@ -2580,9 +2641,9 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2657,7 +2718,7 @@ netbsd*)
   ;;
 
 newsos6)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
@@ -2726,7 +2787,7 @@ rdos*)
   ;;
 
 solaris*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2751,7 +2812,7 @@ sunos4*)
   ;;
 
 sysv4 | sysv4.3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -2775,7 +2836,7 @@ sysv4 | sysv4.3*)
 
 sysv4*MP*)
   if test -d /usr/nec ;then
-    version_type=linux
+    version_type=linux # correct to gnu/linux during the next big refactor
     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
     soname_spec='$libname${shared_ext}.$major'
     shlibpath_var=LD_LIBRARY_PATH
@@ -2806,7 +2867,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
 
 tpf*)
   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2816,7 +2877,7 @@ tpf*)
   ;;
 
 uts4*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -3197,10 +3258,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3238,8 +3295,8 @@ irix5* | irix6* | nonstopux*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -3658,6 +3715,7 @@ for ac_symprfx in "" "_"; do
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -3990,7 +4048,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
        case $cc_basename in
          KCC*)
            # KAI C++ Compiler
@@ -4242,7 +4300,9 @@ m4_if([$1], [CXX], [
     case $cc_basename in
     nvcc*) # Cuda Compiler Driver 2.2
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
       ;;
     esac
   else
@@ -4287,7 +4347,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -4334,18 +4394,33 @@ m4_if([$1], [CXX], [
        ;;
       *)
        case `$CC -V 2>&1 | sed 5q` in
-       *Sun\ F* | *Sun*Fortran*)
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
          # Sun Fortran 8.3 passes all unrecognized flags to the linker
          _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
          _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
          ;;
+       *Sun\ F* | *Sun*Fortran*)
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+         ;;
        *Sun\ C*)
          # Sun C 5.9
          _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
          _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
          ;;
+        *Intel*\ [[CF]]*Compiler*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+         ;;
+       *Portland\ Group*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         ;;
        esac
        ;;
       esac
@@ -4505,7 +4580,9 @@ m4_if([$1], [CXX], [
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl*) ;;
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
     *)
       _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
@@ -4533,7 +4610,6 @@ m4_if([$1], [CXX], [
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_direct_absolute, $1)=no
   _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
   _LT_TAGVAR(hardcode_libdir_separator, $1)=
   _LT_TAGVAR(hardcode_minus_L, $1)=no
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -4787,8 +4863,7 @@ _LT_EOF
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-         _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
          _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          if test "x$supports_anon_versioning" = xyes; then
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
@@ -5084,6 +5159,7 @@ _LT_EOF
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
        _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
        # Don't use ranlib
        _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
@@ -5130,10 +5206,6 @@ _LT_EOF
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
 
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
     # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
     # support.  Future versions do this automatically, but an explicit c++rt0.o
     # does not break anything, and helps significantly (at the cost of a little
@@ -5146,7 +5218,7 @@ _LT_EOF
       ;;
 
     # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
+    freebsd2.*)
       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5185,7 +5257,6 @@ _LT_EOF
       fi
       if test "$with_gnu_ld" = no; then
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-       _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
@@ -5627,9 +5698,6 @@ _LT_TAGDECL([], [no_undefined_flag], [1],
 _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
     [Flag to hardcode $libdir into a binary during linking.
     This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
@@ -5787,7 +5855,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -6157,7 +6224,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         esac
         ;;
 
-      freebsd[[12]]*)
+      freebsd2.*)
         # C++ shared libraries reported to be fairly broken before
        # switch to ELF
         _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6173,9 +6240,6 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -6337,7 +6401,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
            # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -6918,12 +6982,18 @@ public class foo {
   }
 };
 _LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
 ])
 
 _lt_libdeps_save_CFLAGS=$CFLAGS
 case "$CC $CFLAGS " in #(
 *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
 *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
 esac
 
 dnl Parse the compiler output and extract the necessary
@@ -7120,7 +7190,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_automatic, $1)=no
@@ -7253,7 +7322,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
 _LT_TAGVAR(hardcode_direct, $1)=no
 _LT_TAGVAR(hardcode_direct_absolute, $1)=no
 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
 _LT_TAGVAR(hardcode_libdir_separator, $1)=
 _LT_TAGVAR(hardcode_minus_L, $1)=no
 _LT_TAGVAR(hardcode_automatic, $1)=no
@@ -7440,6 +7508,77 @@ CFLAGS=$lt_save_CFLAGS
 ])# _LT_LANG_GCJ_CONFIG
 
 
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
 # _LT_LANG_RC_CONFIG([TAG])
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
@@ -7509,6 +7648,13 @@ dnl aclocal-1.4 backwards compatibility:
 dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
 
 
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
 # LT_PROG_RC
 # ----------
 AC_DEFUN([LT_PROG_RC],
index 17cfd51..5d9acd8 100644 (file)
@@ -326,9 +326,24 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 # MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
        [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
     [pic_mode=default])
 
 test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
index 9c7b5d4..07a8602 100644 (file)
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
-# serial 3293 ltversion.m4
+# serial 3337 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4])
-m4_define([LT_PACKAGE_REVISION], [1.3293])
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4'
-macro_revision='1.3293'
+[macro_version='2.4.2'
+macro_revision='1.3337'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
index 216306f..88d5a5b 100644 (file)
@@ -18,10 +18,10 @@ dnl Find the version of Octave.
 dnl @version 1.0       Aug 23 2007
 dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
 dnl
-dnl Permission to use, copy, modify, distribute, and sell this file for any 
-dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
 dnl and this permission notice appear in all copies.  No representations are
-dnl made about the suitability of this software for any purpose.  It is 
+dnl made about the suitability of this software for any purpose.  It is
 dnl provided "as is" without express or implied warranty.
 dnl
 
@@ -52,10 +52,10 @@ dnl Find the version of Octave.
 dnl @version 1.0       Aug 23 2007
 dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
 dnl
-dnl Permission to use, copy, modify, distribute, and sell this file for any 
-dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
 dnl and this permission notice appear in all copies.  No representations are
-dnl made about the suitability of this software for any purpose.  It is 
+dnl made about the suitability of this software for any purpose.  It is
 dnl provided "as is" without express or implied warranty.
 dnl
 
@@ -119,7 +119,7 @@ if test "x$prog_concat" = "xyesyesyes" ; then
                        2.*)
                                AC_MSG_WARN([Octave version 2.X is not supported.])
                                ;;
-                       3.0.*)
+                       3.*)
                                OCTAVE_DEST_ODIR=`$OCTAVE_CONFIG --oct-site-dir | sed 's%^/usr%${prefix}%'`
                                OCTAVE_DEST_MDIR=`$OCTAVE_CONFIG --m-site-dir | sed 's%^/usr%${prefix}%'`
 
diff --git a/M4/really_gcc.m4 b/M4/really_gcc.m4
new file mode 100644 (file)
index 0000000..67aed78
--- /dev/null
@@ -0,0 +1,33 @@
+dnl @synopsis MN_GCC_REALLY_IS_GCC
+dnl
+dnl Find out if a compiler claiming to be gcc really is gcc (fuck you clang).
+dnl @version 1.0       Oct 31 2013
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any
+dnl purpose is hereby granted without fee, provided that the above copyright
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is
+dnl provided "as is" without express or implied warranty.
+dnl
+
+# If the configure script has already detected GNU GCC, then make sure it
+# isn't CLANG masquerading as GCC.
+
+AC_DEFUN([MN_GCC_REALLY_IS_GCC],
+[      AC_LANG_ASSERT(C)
+       if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then
+               AC_TRY_LINK([
+                       #include <stdio.h>
+                       ],
+                       [
+                       #ifdef __clang__
+                               This is clang!
+                       #endif
+                       ],
+               ac_cv_c_compiler_gnu=yes,
+               ac_cv_c_compiler_gnu=no
+               )
+               fi
+
+])
diff --git a/M4/stack_protect.m4 b/M4/stack_protect.m4
new file mode 100644 (file)
index 0000000..bf27e6e
--- /dev/null
@@ -0,0 +1,73 @@
+dnl Copyright (C) 2013  Xiph.org Foundation
+dnl
+dnl Redistribution and use in source and binary forms, with or without
+dnl modification, are permitted provided that the following conditions
+dnl are met:
+dnl
+dnl - Redistributions of source code must retain the above copyright
+dnl notice, this list of conditions and the following disclaimer.
+dnl
+dnl - Redistributions in binary form must reproduce the above copyright
+dnl notice, this list of conditions and the following disclaimer in the
+dnl documentation and/or other materials provided with the distribution.
+dnl
+dnl - Neither the name of the Xiph.org Foundation nor the names of its
+dnl contributors may be used to endorse or promote products derived from
+dnl this software without specific prior written permission.
+dnl
+dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+dnl ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+dnl A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+dnl CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+dnl EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+dnl PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+dnl Want to know of GCC stack protector works, botfor the C and for the C++
+dnl compiler.
+dnl
+dnl Just checking if the compiler accepts the required CFLAGSs is not enough
+dnl because we have seen at least one instance where this check was
+dnl in-sufficient.
+dnl
+dnl Instead, try to compile and link a test program with the stack protector
+dnl flags. If that works, we use it.
+
+AC_DEFUN([XIPH_GCC_STACK_PROTECTOR],
+[AC_LANG_ASSERT(C)
+       AC_MSG_CHECKING([if $CC supports stack smash protection])
+       xiph_stack_check_old_cflags="$CFLAGS"
+       SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4"
+       CFLAGS=$SSP_FLAGS
+       AC_TRY_LINK([
+                       #include <stdio.h>
+                       ],
+               [puts("Hello, World!"); return 0;],
+               AC_MSG_RESULT([yes])
+                       CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS",
+               AC_MSG_RESULT([no])
+                       CFLAGS="$xiph_stack_check_old_cflags"
+               )
+])# XIPH_GCC_STACK_PROTECTOR
+
+AC_DEFUN([XIPH_GXX_STACK_PROTECTOR],
+[AC_LANG_PUSH([C++])
+       AC_MSG_CHECKING([if $CXX supports stack smash protection])
+       xiph_stack_check_old_cflags="$CFLAGS"
+       SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4"
+       CFLAGS=$SSP_FLAGS
+       AC_TRY_LINK([
+                       #include <cstdio>
+                       ],
+               [puts("Hello, World!"); return 0;],
+               AC_MSG_RESULT([yes])
+                       CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS",
+               AC_MSG_RESULT([no])
+                       CFLAGS="$xiph_stack_check_old_cflags"
+               )
+       AC_LANG_POP([C++])
+])# XIPH_GXX_STACK_PROTECTOR
index c7c1474..65f397f 100644 (file)
@@ -1,6 +1,8 @@
 ## Process this file with automake to produce Makefile.in
 
-DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror
+ACLOCAL_AMFLAGS = -I M4
+
+DISTCHECK_CONFIGURE_FLAGS = --enable-werror
 
 if BUILD_OCTAVE_MOD
 octave_dir = Octave
@@ -9,11 +11,11 @@ endif
 SUBDIRS = M4 man doc Win32 src $(octave_dir) examples regtest tests programs
 DIST_SUBDIRS = M4 man doc Win32 src Octave examples regtest tests programs
 
-EXTRA_DIST = libsndfile.spec.in sndfile.pc.in
+EXTRA_DIST = libsndfile.spec.in sndfile.pc.in Scripts/android-configure.sh \
+       Scripts/linux-to-win-cross-configure.sh Scripts/build-test-tarball.mk.in
 
 CLEANFILES = *~
 
-pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = sndfile.pc
 
 m4datadir = $(datadir)/aclocal
@@ -36,6 +38,7 @@ testprogs :
        (cd tests ; make testprogs)
 
 
-test-tarball : build-test-tarball.mk
-       make all
-       make -f build-test-tarball.mk
+test-tarball : Scripts/build-test-tarball.mk
+       (cd src ; make all libsndfile.la checkprograms)
+       (cd tests ; make all checkprograms)
+       make -f Scripts/build-test-tarball.mk
index fb6a47b..0910005 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,47 +90,56 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(srcdir)/build-test-tarball.mk.in \
-       $(srcdir)/libsndfile.spec.in $(srcdir)/sndfile.pc.in \
-       $(top_srcdir)/configure AUTHORS COPYING Cfg/compile \
-       Cfg/config.guess Cfg/config.sub Cfg/depcomp Cfg/install-sh \
-       Cfg/ltmain.sh Cfg/missing ChangeLog INSTALL NEWS
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+       $(am__configure_deps) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
-CONFIG_CLEAN_FILES = build-test-tarball.mk libsndfile.spec sndfile.pc
+CONFIG_CLEAN_FILES = Scripts/build-test-tarball.mk libsndfile.spec \
+       sndfile.pc echo-install-dirs
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-       html-recursive info-recursive install-data-recursive \
-       install-dvi-recursive install-exec-recursive \
-       install-html-recursive install-info-recursive \
-       install-pdf-recursive install-ps-recursive install-recursive \
-       installcheck-recursive installdirs-recursive pdf-recursive \
-       ps-recursive uninstall-recursive
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -98,22 +161,61 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
 DATA = $(pkgconfig_DATA)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-       distdir dist dist-all distcheck
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+CSCOPE = cscope
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/echo-install-dirs.in \
+       $(srcdir)/libsndfile.spec.in $(srcdir)/sndfile.pc.in \
+       $(top_srcdir)/Cfg/compile $(top_srcdir)/Cfg/config.guess \
+       $(top_srcdir)/Cfg/config.sub $(top_srcdir)/Cfg/install-sh \
+       $(top_srcdir)/Cfg/ltmain.sh $(top_srcdir)/Cfg/missing \
+       $(top_srcdir)/Scripts/build-test-tarball.mk.in AUTHORS COPYING \
+       Cfg/compile Cfg/config.guess Cfg/config.sub Cfg/depcomp \
+       Cfg/install-sh Cfg/ltmain.sh Cfg/missing ChangeLog INSTALL \
+       NEWS README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
 am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
 am__relativize = \
   dir0=`pwd`; \
   sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -141,10 +243,12 @@ am__relativize = \
   reldir="$$dir2"
 DIST_ARCHIVES = $(distdir).tar.gz
 GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
 distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -182,13 +286,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -252,7 +357,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -291,7 +398,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -303,9 +409,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -318,19 +426,21 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror
+ACLOCAL_AMFLAGS = -I M4
+DISTCHECK_CONFIGURE_FLAGS = --enable-werror
 @BUILD_OCTAVE_MOD_TRUE@octave_dir = Octave
 SUBDIRS = M4 man doc Win32 src $(octave_dir) examples regtest tests programs
 DIST_SUBDIRS = M4 man doc Win32 src Octave examples regtest tests programs
-EXTRA_DIST = libsndfile.spec.in sndfile.pc.in
+EXTRA_DIST = libsndfile.spec.in sndfile.pc.in Scripts/android-configure.sh \
+       Scripts/linux-to-win-cross-configure.sh Scripts/build-test-tarball.mk.in
+
 CLEANFILES = *~
-pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = sndfile.pc
 m4datadir = $(datadir)/aclocal
 all: all-recursive
 
 .SUFFIXES:
-am--refresh:
+am--refresh: Makefile
        @:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
@@ -345,7 +455,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -364,12 +473,14 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
        $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
 $(am__aclocal_m4_deps):
-build-test-tarball.mk: $(top_builddir)/config.status $(srcdir)/build-test-tarball.mk.in
+Scripts/build-test-tarball.mk: $(top_builddir)/config.status $(top_srcdir)/Scripts/build-test-tarball.mk.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
 libsndfile.spec: $(top_builddir)/config.status $(srcdir)/libsndfile.spec.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
 sndfile.pc: $(top_builddir)/config.status $(srcdir)/sndfile.pc.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
+echo-install-dirs: $(top_builddir)/config.status $(srcdir)/echo-install-dirs.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -381,8 +492,11 @@ distclean-libtool:
        -rm -f libtool config.lt
 install-pkgconfigDATA: $(pkgconfig_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -396,27 +510,28 @@ uninstall-pkgconfigDATA:
        @$(NORMAL_UNINSTALL)
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+       dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
@@ -431,57 +546,12 @@ $(RECURSIVE_TARGETS):
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
        fi; test -z "$$fail"
 
-$(RECURSIVE_CLEAN_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
-       dot_seen=no; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       rev=''; for subdir in $$list; do \
-         if test "$$subdir" = "."; then :; else \
-           rev="$$subdir $$rev"; \
-         fi; \
-       done; \
-       rev="$$rev ."; \
-       target=`echo $@ | sed s/-recursive//`; \
-       for subdir in $$rev; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done && test -z "$$fail"
-tags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-       done
-ctags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-       done
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
        if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
@@ -497,12 +567,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
          fi; \
        done; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -514,15 +579,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -531,9 +592,31 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+       test ! -s cscope.files \
+         || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+       -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+       -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
 distdir: $(DISTFILES)
        $(am__remove_distdir)
@@ -569,13 +652,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -604,36 +684,42 @@ distdir: $(DISTFILES)
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
        tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-bzip2: distdir
-       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-       $(am__remove_distdir)
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__post_remove_distdir)
 
-dist-lzma: distdir
-       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-       $(am__remove_distdir)
+dist-lzip: distdir
+       tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+       $(am__post_remove_distdir)
 
 dist-xz: distdir
-       tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-       $(am__remove_distdir)
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__post_remove_distdir)
 
 dist-tarZ: distdir
+       @echo WARNING: "Support for distribution archives compressed with" \
+                      "legacy program 'compress' is deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-shar: distdir
+       @echo WARNING: "Support for shar distribution archives is" \
+                      "deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-zip: distdir
        -rm -f $(distdir).zip
        zip -rq $(distdir).zip $(distdir)
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
-dist dist-all: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-       $(am__remove_distdir)
+dist dist-all:
+       $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+       $(am__post_remove_distdir)
 
 # This target untars the dist file and tries a VPATH configuration.  Then
 # it guarantees that the distribution is self-contained by making another
@@ -644,8 +730,8 @@ distcheck: dist
          GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-       *.tar.lzma*) \
-         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.lz*) \
+         lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
        *.tar.xz*) \
          xz -dc $(distdir).tar.xz | $(am__untar) ;;\
        *.tar.Z*) \
@@ -655,17 +741,19 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod a+w $(distdir)
-       mkdir $(distdir)/_build
-       mkdir $(distdir)/_inst
+       chmod -R a-w $(distdir)
+       chmod u+w $(distdir)
+       mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
          && am__cwd=`pwd` \
-         && $(am__cd) $(distdir)/_build \
-         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+         && $(am__cd) $(distdir)/_build/sub \
+         && ../../configure \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
            $(DISTCHECK_CONFIGURE_FLAGS) \
+           --srcdir=../.. --prefix="$$dc_install_base" \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -688,13 +776,21 @@ distcheck: dist
          && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
          && cd "$$am__cwd" \
          || exit 1
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
        @(echo "$(distdir) archives ready for distribution: "; \
          list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
          sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
-       @$(am__cd) '$(distuninstallcheck_dir)' \
-       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
           || { echo "ERROR: files left after uninstall:" ; \
                if test -n "$(DESTDIR)"; then \
                  echo "  (check DESTDIR support)"; \
@@ -728,10 +824,15 @@ install-am: all-am
 
 installcheck: installcheck-recursive
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -814,25 +915,26 @@ ps-am:
 
 uninstall-am: uninstall-pkgconfigDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-       install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-       all all-am am--refresh check check-am clean clean-generic \
-       clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
-       dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
-       distcheck distclean distclean-generic distclean-libtool \
-       distclean-tags distcleancheck distdir distuninstallcheck dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-recursive uninstall uninstall-am \
-       uninstall-pkgconfigDATA
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+       am--refresh check check-am clean clean-cscope clean-generic \
+       clean-libtool cscope cscopelist-am ctags ctags-am dist \
+       dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+       dist-xz dist-zip distcheck distclean distclean-generic \
+       distclean-libtool distclean-tags distcleancheck distdir \
+       distuninstallcheck dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-pkgconfigDATA install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+       uninstall-am uninstall-pkgconfigDATA
+
+.PRECIOUS: Makefile
 
 
 #===============================================================================
@@ -852,9 +954,10 @@ testprogs :
        (cd src ; make testprogs)
        (cd tests ; make testprogs)
 
-test-tarball : build-test-tarball.mk
-       make all
-       make -f build-test-tarball.mk
+test-tarball : Scripts/build-test-tarball.mk
+       (cd src ; make all libsndfile.la checkprograms)
+       (cd tests ; make all checkprograms)
+       make -f Scripts/build-test-tarball.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/NEWS b/NEWS
index 9626d45..c8acbe6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Version 1.0.26 (2015-11-22)
+  * Fix for CVE-2014-9496, SD2 buffer read overflow.
+  * Fix for CVE-2014-9756, file_io.c divide by zero.
+  * Fix for CVE-2015-7805, AIIF heap write overflow.
+  * Add support for ALAC encoder in a CAF container.
+  * Add support for Cart chunks in WAV files.
+  * Minor bug fixes and improvements.
+
 Version 1.0.25 (2011-07-13)
   * Fix for Secunia Advisory SA45125, heap overflow in PAF file handler.
   * Accept broken WAV files with blockalign == 0.
index 40968dd..3f0078e 100644 (file)
@@ -21,7 +21,7 @@ OCT_LIB_DIR = @OCT_LIB_DIR@
 OCT_LIBS = @OCT_LIBS@
 
 SNDFILEDIR = $(top_builddir)/src
-INCLUDES = -I$(SNDFILEDIR)
+AM_CPPFLAGS = -I$(SNDFILEDIR)
 
 oct_module_srcs = sndfile.cc
 oct_module_files = sndfile.oct PKG_ADD
@@ -76,3 +76,4 @@ uninstall-local :
 
 clean-local :
        rm -f sndfile.o sndfile.oct
+       @if test $(abs_builddir) != $(abs_srcdir) ; then rm -f PKG_ADD ; fi
index 5ee3126..8a49a5d 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,33 +90,44 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = Octave
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -84,11 +149,18 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(octconfigdir)"
 DATA = $(noinst_DATA) $(octconfig_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -128,13 +200,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -198,7 +271,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -237,7 +312,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -249,9 +323,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -277,7 +353,7 @@ OCT_CXXFLAGS = @OCT_CXXFLAGS@
 OCT_LIB_DIR = @OCT_LIB_DIR@
 OCT_LIBS = @OCT_LIBS@
 SNDFILEDIR = $(top_builddir)/src
-INCLUDES = -I$(SNDFILEDIR)
+AM_CPPFLAGS = -I$(SNDFILEDIR)
 oct_module_srcs = sndfile.cc
 oct_module_files = sndfile.oct PKG_ADD
 
@@ -303,7 +379,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Octave/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu Octave/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -329,8 +404,11 @@ clean-libtool:
        -rm -rf .libs _libs
 install-octconfigDATA: $(octconfig_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(octconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(octconfigdir)"
        @list='$(octconfig_DATA)'; test -n "$(octconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(octconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(octconfigdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -344,14 +422,12 @@ uninstall-octconfigDATA:
        @$(NORMAL_UNINSTALL)
        @list='$(octconfig_DATA)'; test -n "$(octconfigdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(octconfigdir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(octconfigdir)" && rm -f $$files
-tags: TAGS
-TAGS:
+       dir='$(DESTDIR)$(octconfigdir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -401,10 +477,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -485,17 +566,19 @@ uninstall-am: uninstall-local uninstall-octconfigDATA
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       clean-local distclean distclean-generic distclean-libtool \
-       distdir dvi dvi-am html html-am info info-am install \
-       install-am install-data install-data-am install-dvi \
+       clean-local cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
        install-dvi-am install-exec install-exec-am install-exec-local \
        install-html install-html-am install-info install-info-am \
        install-man install-octconfigDATA install-pdf install-pdf-am \
        install-ps install-ps-am install-strip installcheck \
        installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-       uninstall-local uninstall-octconfigDATA
+       mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+       uninstall-am uninstall-local uninstall-octconfigDATA
+
+.PRECIOUS: Makefile
 
 
 # Use Octave's mkoctfile to do all the heavy lifting. Unfortunately, its
@@ -537,6 +620,7 @@ uninstall-local :
 
 clean-local :
        rm -f sndfile.o sndfile.oct
+       @if test $(abs_builddir) != $(abs_srcdir) ; then rm -f PKG_ADD ; fi
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 319d86b..3c6f36e 100755 (executable)
@@ -2,20 +2,28 @@
 
 
 # Check where we're being run from.
-if [ -d Octave ]; then
+if test -d Octave ; then
        cd Octave
+       octave_src_dir=$(pwd)
+elif test -z "$octave_src_dir" ; then
+       echo
+       echo "Error : \$octave_src_dir is undefined."
+       echo
+       exit 1
+else
+       octave_src_dir=$(cd $octave_src_dir && pwd)
        fi
 
 # Find libsndfile shared object.
 libsndfile_lib_location=""
 
-if [ -f "../src/.libs/libsndfile.so" ]; then
+if test -f "../src/.libs/libsndfile.so" ; then
        libsndfile_lib_location="../src/.libs/"
-elif [ -f "../src/libsndfile.so" ]; then
+elif test -f "../src/libsndfile.so" ; then
        libsndfile_lib_location="../src/"
-elif [ -f "../src/.libs/libsndfile.dylib" ]; then
+elif test -f "../src/.libs/libsndfile.dylib" ; then
        libsndfile_lib_location="../src/.libs/"
-elif [ -f "../src/libsndfile.dylib" ]; then
+elif test -f "../src/libsndfile.dylib" ; then
        libsndfile_lib_location="../src/"
 else
        echo
@@ -30,9 +38,9 @@ libsndfile_lib_location=`(cd $libsndfile_lib_location && pwd)`
 # Find sndfile.oct
 sndfile_oct_location=""
 
-if [ -f .libs/sndfile.oct ]; then
+if test -f .libs/sndfile.oct ; then
        sndfile_oct_location=".libs"
-elif [ -f sndfile.oct ]; then
+elif test -f sndfile.oct ; then
        sndfile_oct_location="."
 else
        echo "Not able to find the sndfile.oct binaries we've just built."
@@ -47,7 +55,7 @@ case `file -b $sndfile_oct_location/sndfile.oct` in
                exit 0
                ;;
        *)
-               echo "Not able to find the sndfile.oct binaries we've just built."
+               echo "Not able to find the sndfile.oct binary we just built."
                exit 1
                ;;
        esac
@@ -55,16 +63,19 @@ case `file -b $sndfile_oct_location/sndfile.oct` in
 
 # Make sure the TERM environment variable doesn't contain anything wrong.
 unset TERM
-
+# echo "octave_src_dir : $octave_src_dir"
 # echo "libsndfile_lib_location : $libsndfile_lib_location"
 # echo "sndfile_oct_location : $sndfile_oct_location"
 
-export LD_LIBRARY_PATH="$libsndfile_lib_location:$LD_LIBRARY_PATH"
+if test ! -f PKG_ADD ; then
+       cp $octave_src_dir/PKG_ADD .
+       fi
 
-octave_src_dir=`(cd $octave_src_dir && pwd)`
+export LD_LIBRARY_PATH="$libsndfile_lib_location:$LD_LIBRARY_PATH"
 
 octave_script="$octave_src_dir/octave_test.m"
 
 (cd $sndfile_oct_location && octave -qH $octave_script)
-
-
+res=$?
+echo
+exit $res
diff --git a/README b/README
index 0676711..5a0f15b 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This is libsndfile, 1.0.25
+This is libsndfile, 1.0.26
 
 libsndfile is a library of C routines for reading and writing
 files containing sampled audio data.
@@ -20,6 +20,9 @@ Bormann. Their original code can be found at :
 The src/G72x directory contains code written and released by Sun Microsystems
 under a suitably free license.
 
+The src/ALAC directory contains code written and released by Apple Inc and
+released under the Apache license.
+
 
 LINUX
 -----
@@ -63,3 +66,6 @@ The libsndfile home page is at :
 
        http://www.mega-nerd.com/libsndfile/
 
+Bugs and support questions can be raised at :
+
+       https://github.com/erikd/libsndfile/
diff --git a/Scripts/android-configure.sh b/Scripts/android-configure.sh
new file mode 100755 (executable)
index 0000000..c981d49
--- /dev/null
@@ -0,0 +1,92 @@
+#!/bin/bash -e
+
+# Copyright (C) 2013 Erik de Castro Lopo <erikd@mega-nerd.com>
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Neither the author nor the names of any contributors may be used
+#       to endorse or promote products derived from this software without
+#       specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Android NDK version number; eg r8e, r9 etc
+ANDROID_NDK_VER=r9
+
+# Android NDK gcc version; eg 4.7, 4.9 etc.
+ANDROID_GCC_VER=4.8
+
+# Android API version; eg 9 (Android 2.3), 14 (Android 4.0) etc.
+ANDROID_API_VER=9
+
+#-------------------------------------------------------------------------------
+# No more user config beyond here.
+
+BUILD_MACHINE=$(uname -s | tr 'A-Z' 'a-z')-$(uname -m)
+
+function die_with {
+       echo $1
+       exit 1
+}
+
+export CROSS_COMPILE=arm-linux-androideabi
+
+# I put all my dev stuff in here
+export DEV_PREFIX=$HOME/Android
+test -d ${DEV_PREFIX} || die_with "Error : DEV_PREFIX '$DEV_PREFIX' does not exist."
+
+# Don't forget to adjust this to your NDK path
+export ANDROID_NDK=${DEV_PREFIX}/android-ndk-${ANDROID_NDK_VER}
+test -d ${ANDROID_NDK} || die_with "Error : ANDROID_NDK '$ANDROID_NDK' does not exist."
+
+export ANDROID_PREFIX=${ANDROID_NDK}/toolchains/arm-linux-androideabi-${ANDROID_GCC_VER}/prebuilt/${BUILD_MACHINE}
+test -d ${ANDROID_PREFIX} || die_with "Error : ANDROID_PREFIX '$ANDROID_PREFIX' does not exist."
+
+export SYSROOT=${ANDROID_NDK}/platforms/android-${ANDROID_API_VER}/arch-arm
+test -d ${SYSROOT} || die_with "Error : SYSROOT '$SYSROOT' does not exist."
+
+export CROSS_PREFIX=${ANDROID_PREFIX}/bin/${CROSS_COMPILE}
+test -f ${CROSS_PREFIX}-gcc || die_with "Error : CROSS_PREFIX compiler '${CROSS_PREFIX}-gcc' does not exist."
+
+
+# Non-exhaustive lists of compiler + binutils
+# Depending on what you compile, you might need more binutils than that
+export CPP=${CROSS_PREFIX}-cpp
+export AR=${CROSS_PREFIX}-ar
+export AS=${CROSS_PREFIX}-as
+export NM=${CROSS_PREFIX}-nm
+export CC=${CROSS_PREFIX}-gcc
+export CXX=${CROSS_PREFIX}-g++
+export LD=${CROSS_PREFIX}-ld
+export RANLIB=${CROSS_PREFIX}-ranlib
+
+# Don't mix up .pc files from your host and build target
+export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
+
+# Set up the needed FLAGS.
+export CFLAGS="${CFLAGS} -gstabs --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include"
+export CXXFLAGS="${CXXFLAGS} -gstabs -fno-exceptions --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/include/ -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/libs/armeabi/include"
+
+export CPPFLAGS="${CFLAGS}"
+export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib"
+
+# Create a symlink to the gdbclient.
+test -h gdbclient || ln -s ${ANDROID_PREFIX}/bin/arm-linux-androideabi-gdb gdbclient
+
+./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} "$@"
similarity index 77%
rename from build-test-tarball.mk.in
rename to Scripts/build-test-tarball.mk.in
index b6f2f23..931edb6 100644 (file)
@@ -10,6 +10,11 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
 
 HOST_TRIPLET = @HOST_TRIPLET@
 
+SRC_BINDIR = @SRC_BINDIR@
+TEST_BINDIR = @TEST_BINDIR@
+
+LIBRARY := $(SRC_BINDIR)libsndfile.so.$(LIB_VERSION)
+
 LIB_VERSION := $(shell echo $(PACKAGE_VERSION) | sed -e 's/[a-z].*//')
 
 TESTNAME = libsndfile-testsuite-$(HOST_TRIPLET)-$(PACKAGE_VERSION)
@@ -24,9 +29,9 @@ testprogs += sfversion@EXEEXT@ stdin_test@EXEEXT@ stdout_test@EXEEXT@ cpp_test@E
 # Find the single test program in src/ .
 srcprogs := $(shell if test -x src/.libs/test_main$(EXEEXT) ; then echo "src/.libs/test_main$(EXEEXT)" ; else echo "src/test_main$(EXEEXT)" ; fi)
 
-libfiles := $(shell if test ! -z $(EXEEXT) ; then echo "src/libsndfile-1.def src/.libs/libsndfile-1.dll" ; else echo "src/.libs/libsndfile.so.$(LIB_VERSION)" ; fi)
+libfiles := $(shell if test ! -z $(EXEEXT) ; then echo "src/libsndfile-1.def src/.libs/libsndfile-1.dll" ; elif test -f $(LIBRARY) ; then echo $(LIBRARY) ; fi  ; fi)
 
-files := $(addprefix tests/.libs/,$(subst @EXEEXT@,$(EXEEXT),$(testprogs))) $(libfiles) $(srcprogs)
+testbins := $(addprefix $(TEST_BINDIR),$(subst @EXEEXT@,$(EXEEXT),$(testprogs))) $(libfiles) $(srcprogs)
 
 
 all : $(TARBALL)
@@ -44,10 +49,10 @@ $(TARBALL) : $(TESTNAME)/test_wrapper.sh
        @echo "Created : $(TARBALL)"
        @echo
 
-$(TESTNAME)/test_wrapper.sh : $(files) tests/test_wrapper.sh tests/pedantic-header-test.sh
+$(TESTNAME)/test_wrapper.sh : $(testbins) tests/test_wrapper.sh tests/pedantic-header-test.sh
        rm -rf $(TESTNAME)
        mkdir -p $(TESTNAME)/tests/
-       cp $(files) $(TESTNAME)/tests/
+       cp $(testbins) $(TESTNAME)/tests/
        cp tests/test_wrapper.sh $(TESTNAME)/
        cp tests/pedantic-header-test.sh $(TESTNAME)/tests/
        chmod u+x $@
diff --git a/Scripts/linux-to-win-cross-configure.sh b/Scripts/linux-to-win-cross-configure.sh
new file mode 100755 (executable)
index 0000000..c1fdc07
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+case "$1" in
+       w32)
+               compiler_name=i686-w64-mingw32
+               ;;
+       w64)
+               compiler_name=x86_64-w64-mingw32
+               ;;
+       *)
+               echo "$0 (w32|w64) <other args>"
+               exit 0
+               ;;
+       esac
+
+shift
+
+build_cpu=$(dpkg-architecture -qDEB_BUILD_GNU_CPU)
+build_host=$build_cpu-linux
+
+./configure --host=$compiler_name --target=$compiler_name --build=$build_host \
+               --program-prefix='' --disable-sqlite --disable-static $@
index dbb0481..7aeae44 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,36 +89,48 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = Win32
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -102,13 +168,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -172,7 +239,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -211,7 +280,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -223,9 +291,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -254,7 +324,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Win32/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu Win32/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -278,11 +347,11 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -329,10 +398,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -413,15 +487,18 @@ uninstall-am:
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       distclean distclean-generic distclean-libtool distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+       cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index 08376d0..cbe000e 100644 (file)
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
-# serial 1 (pkg-config-0.24)
-# 
-# Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-# ----------------------------------
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29)
+dnl
+dnl Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright Â© 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
 AC_DEFUN([PKG_PROG_PKG_CONFIG],
 [m4_pattern_forbid([^_?PKG_[A-Z_]+$])
 m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
@@ -66,18 +98,19 @@ if test -n "$PKG_CONFIG"; then
                PKG_CONFIG=""
        fi
 fi[]dnl
-])# PKG_PROG_PKG_CONFIG
-
-# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# Check to see whether a particular set of modules exists.  Similar
-# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-#
-# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-# only at the first occurence in configure.ac, so if the first place
-# it's called might be skipped (such as if it is within an "if", you
-# have to call PKG_CHECK_EXISTS manually
-# --------------------------------------------------------------
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
 AC_DEFUN([PKG_CHECK_EXISTS],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
 if test -n "$PKG_CONFIG" && \
@@ -87,8 +120,10 @@ m4_ifvaln([$3], [else
   $3])dnl
 fi])
 
-# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-# ---------------------------------------------
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
 m4_define([_PKG_CONFIG],
 [if test -n "$$1"; then
     pkg_cv_[]$1="$$1"
@@ -100,10 +135,11 @@ m4_define([_PKG_CONFIG],
  else
     pkg_failed=untried
 fi[]dnl
-])# _PKG_CONFIG
+])dnl _PKG_CONFIG
 
-# _PKG_SHORT_ERRORS_SUPPORTED
-# -----------------------------
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
 AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -111,19 +147,17 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
 else
         _pkg_short_errors_supported=no
 fi[]dnl
-])# _PKG_SHORT_ERRORS_SUPPORTED
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
 
 
-# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-# [ACTION-IF-NOT-FOUND])
-#
-#
-# Note that if there is a possibility the first call to
-# PKG_CHECK_MODULES might not happen, you should be sure to include an
-# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-#
-#
-# --------------------------------------------------------------
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
 AC_DEFUN([PKG_CHECK_MODULES],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
 AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
@@ -177,9 +211,92 @@ else
         AC_MSG_RESULT([yes])
        $3
 fi[]dnl
-])# PKG_CHECK_MODULES
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+    [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+    [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -191,10 +308,10 @@ fi[]dnl
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -210,22 +327,22 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
 #
 # Of course, Automake must honor this variable whenever it calls a
 # tool from the auxiliary directory.  The problem is that $srcdir (and
@@ -244,7 +361,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 #
 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir
 # are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
+# harmless because $srcdir is '.', but things will broke when you
 # start a VPATH build or use an absolute $srcdir.
 #
 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -262,30 +379,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 9
-
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
 # Define a conditional.
 AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ([2.52])dnl
m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
 AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -304,16 +417,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 10
 
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
 # will think it sees a *use*, and therefore will trigger all it's
 # C support machinery.  Also note that it means that autoscan, seeing
@@ -323,7 +434,7 @@ fi])])
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
 # We try a few techniques and use that to set a single cache variable.
 #
 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -336,12 +447,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
 AC_REQUIRE([AM_MAKE_INCLUDE])dnl
 AC_REQUIRE([AM_DEP_TRACK])dnl
 
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
 
 AC_CACHE_CHECK([dependency style of $depcc],
                [am_cv_$1_dependencies_compiler_type],
@@ -349,8 +461,9 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -389,16 +502,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -407,16 +520,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
        break
       fi
       ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -464,7 +577,7 @@ AM_CONDITIONAL([am__fastdep$1], [
 # AM_SET_DEPDIR
 # -------------
 # Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
 AC_DEFUN([AM_SET_DEPDIR],
 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -474,34 +587,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
 # AM_DEP_TRACK
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
+  am__nodep='_no'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
 AC_SUBST([AMDEPBACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 [{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -514,7 +632,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -526,21 +644,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`AS_DIRNAME(["$file"])`
@@ -558,7 +674,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
 # This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
+# is enabled.  FIXME.  This creates each '.P' file that we will
 # need in order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
@@ -568,18 +684,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 16
-
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
 
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
 # AM_INIT_AUTOMAKE([OPTIONS])
 # -----------------------------------------------
@@ -592,7 +711,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
+[AC_PREREQ([2.65])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -621,33 +740,42 @@ AC_SUBST([CYGPATH_W])
 # Define the identity of the package.
 dnl Distinguish between old-style and new-style calls.
 m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
 _AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
 
 # Some tools Automake needs.
 AC_REQUIRE([AM_SANITY_CHECK])dnl
 AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -656,34 +784,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
                             [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-                 [_AM_DEPENDENCIES(CC)],
-                 [define([AC_PROG_CC],
-                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+                 [_AM_DEPENDENCIES([CC])],
+                 [m4_define([AC_PROG_CC],
+                            m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                 [_AM_DEPENDENCIES(CXX)],
-                 [define([AC_PROG_CXX],
-                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+                 [_AM_DEPENDENCIES([CXX])],
+                 [m4_define([AC_PROG_CXX],
+                            m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                 [_AM_DEPENDENCIES(OBJC)],
-                 [define([AC_PROG_OBJC],
-                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+                 [_AM_DEPENDENCIES([OBJC])],
+                 [m4_define([AC_PROG_OBJC],
+                            m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+                 [_AM_DEPENDENCIES([OBJCXX])],
+                 [m4_define([AC_PROG_OBJCXX],
+                            m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
 ])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
 ])
 
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
 m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
 
-
 # When config.status generates a header, we must update the stamp-h file.
 # This file resides in the same directory as the config header
 # that is generated.  The stamp files are numbered to have different names.
@@ -705,7 +881,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -716,7 +892,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -724,16 +900,14 @@ if test x"${install_sh}" != xset; then
     install_sh="\${SHELL} $am_aux_dir/install-sh"
   esac
 fi
-AC_SUBST(install_sh)])
+AC_SUBST([install_sh])])
 
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # Check whether the underlying file-system supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
 AC_DEFUN([AM_SET_LEADING_DOT],
@@ -749,14 +923,12 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
-
 # AM_MAKE_INCLUDE()
 # -----------------
 # Check to see how make treats includes.
@@ -774,7 +946,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -799,52 +971,14 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 6
-
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
 AC_DEFUN([AM_MISSING_PROG],
@@ -852,11 +986,10 @@ AC_DEFUN([AM_MISSING_PROG],
 $1=${$1-"${am_missing_run}$2"}
 AC_SUBST($1)])
 
-
 # AM_MISSING_HAS_RUN
 # ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 AC_REQUIRE_AUX_FILE([missing])dnl
@@ -869,63 +1002,35 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
+  AC_MSG_WARN(['missing' script is too old or missing])
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
-
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
 AC_DEFUN([_AM_MANGLE_OPTION],
 [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
 
 # _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
 
 # _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
 [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -936,24 +1041,82 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # AM_SANITY_CHECK
 # ---------------
 AC_DEFUN([AM_SANITY_CHECK],
 [AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -964,32 +1127,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+       && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$[2]" = conftest.file
    )
 then
@@ -999,36 +1170,85 @@ else
    AC_MSG_ERROR([newly created file is older than distributed files!
 Check your system clock])
 fi
-AC_MSG_RESULT(yes)])
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
 
-# Copyright (C) 2009  Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_SILENT_RULES([DEFAULT])
 # --------------------------
 # Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
+# ("yes" being less verbose, "no" or empty being verbose).
 AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
 esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
 AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
 AM_BACKSLASH='\'
 AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1036,34 +1256,32 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 
 # AM_PROG_INSTALL_STRIP
 # ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
+# One issue with vendor 'install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
 # is unlikely to handle the host's binaries.
 # Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
+# always use install-sh in "make install-strip", and initialize
 # STRIPPROG with the value of the STRIP variable (set by the user).
 AC_DEFUN([AM_PROG_INSTALL_STRIP],
 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
 # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
@@ -1071,24 +1289,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
 AC_DEFUN([_AM_SUBST_NOTMAKE])
 
 # AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
 # Public sister of _AM_SUBST_NOTMAKE.
 AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # _AM_PROG_TAR(FORMAT)
 # --------------------
 # Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
 #
 # Substitute a variable $(am__tar) that is a command
 # writing to stdout a FORMAT-tarball containing the directory
@@ -1098,86 +1314,124 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 # Substitute a variable $(am__untar) that extract such
 # a tarball read from stdin.
 #     $(am__untar) < result.tar
+#
 AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
 
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
 
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
   rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
 
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
 AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
 m4_include([M4/add_cflags.m4])
 m4_include([M4/add_cxxflags.m4])
+m4_include([M4/clang.m4])
 m4_include([M4/clip_mode.m4])
 m4_include([M4/endian.m4])
-m4_include([M4/extra_largefile.m4])
 m4_include([M4/extra_pkg.m4])
-m4_include([M4/flexible_array.m4])
 m4_include([M4/gcc_version.m4])
 m4_include([M4/libtool.m4])
 m4_include([M4/lrint.m4])
@@ -1188,3 +1442,5 @@ m4_include([M4/ltversion.m4])
 m4_include([M4/lt~obsolete.m4])
 m4_include([M4/mkoctfile_version.m4])
 m4_include([M4/octave.m4])
+m4_include([M4/really_gcc.m4])
+m4_include([M4/stack_protect.m4])
index 6591791..f5c83c3 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,13 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for libsndfile 1.0.25.
+# Generated by GNU Autoconf 2.69 for libsndfile 1.0.26.
 #
 # Report bugs to <sndfile@mega-nerd.com>.
 #
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -136,6 +134,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -169,7 +192,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -222,21 +246,25 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-       # neutralization value for shells without unset; and this also
-       # works around shells that cannot unset nonexistent variables.
-       # Preserve -v and -x to the replacement shell.
-       BASH_ENV=/dev/null
-       ENV=/dev/null
-       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-       export CONFIG_SHELL
-       case $- in # ((((
-         *v*x* | *x*v* ) as_opts=-vx ;;
-         *v* ) as_opts=-v ;;
-         *x* ) as_opts=-x ;;
-         * ) as_opts= ;;
-       esac
-       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -339,6 +367,14 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -460,6 +496,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -494,16 +534,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -515,28 +555,8 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -570,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='libsndfile'
 PACKAGE_TARNAME='libsndfile'
-PACKAGE_VERSION='1.0.25'
-PACKAGE_STRING='libsndfile 1.0.25'
+PACKAGE_VERSION='1.0.26'
+PACKAGE_STRING='libsndfile 1.0.26'
 PACKAGE_BUGREPORT='sndfile@mega-nerd.com'
 PACKAGE_URL='http://www.mega-nerd.com/libsndfile/'
 
@@ -617,19 +637,21 @@ am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
 LIBTOOL_DEPS
+TEST_BINDIR
+SRC_BINDIR
 EXTERNAL_LIBS
 EXTERNAL_CFLAGS
 SNDIO_LIBS
 ALSA_LIBS
 OS_SPECIFIC_LINKS
 OS_SPECIFIC_CFLAGS
+HAVE_EXTERNAL_LIBS
 WIN_RC_VERSION
 CLEAN_VERSION
 SHARED_VERSION_INFO
 SHLIB_VERSION_ARG
 HTML_FGCOLOUR
 HTML_BGCOLOUR
-htmldocdir
 HOST_TRIPLET
 GCC_MINOR_VERSION
 GCC_MAJOR_VERSION
@@ -648,6 +670,7 @@ OGG_LIBS
 OGG_CFLAGS
 FLAC_LIBS
 FLAC_CFLAGS
+pkgconfigdir
 PKG_CONFIG_LIBDIR
 PKG_CONFIG_PATH
 PKG_CONFIG
@@ -667,16 +690,15 @@ BUILD_OCTAVE_MOD_TRUE
 SF_COUNT_MAX
 SIZEOF_SF_COUNT_T
 TYPEOF_SF_COUNT_T
-GETCONF
 ENABLE_TEST_COVERAGE_FALSE
 ENABLE_TEST_COVERAGE_TRUE
 LINUX_MINGW_CROSS_TEST_FALSE
 LINUX_MINGW_CROSS_TEST_TRUE
+HAVE_XCODE_SELECT
 HAVE_WINE
 HAVE_AUTOGEN
 RC
 CXXCPP
-CPP
 OTOOL64
 OTOOL
 LIPO
@@ -694,8 +716,6 @@ ac_ct_DUMPBIN
 DUMPBIN
 LD
 FGREP
-EGREP
-GREP
 LIBTOOL
 SED
 am__fastdepCXX_FALSE
@@ -704,9 +724,13 @@ CXXDEPMODE
 ac_ct_CXX
 CXXFLAGS
 CXX
+EGREP
+GREP
+CPP
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
+am__nodep
 AMDEPBACKSLASH
 AMDEP_FALSE
 AMDEP_TRUE
@@ -720,9 +744,10 @@ CPPFLAGS
 LDFLAGS
 CFLAGS
 CC
-ACLOCAL_AMFLAGS
 AM_BACKSLASH
 AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
 am__untar
 am__tar
 AMTAR
@@ -777,6 +802,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -809,7 +835,8 @@ with_gnu_ld
 with_sysroot
 enable_libtool_lock
 enable_experimental
-enable_gcc_werror
+enable_werror
+enable_stack_smash_protection
 enable_gcc_pipe
 enable_gcc_opt
 enable_cpu_clip
@@ -823,6 +850,7 @@ enable_largefile
 with_octave
 with_mkoctfile
 with_octave_config
+with_pkgconfigdir
 '
       ac_precious_vars='build_alias
 host_alias
@@ -832,10 +860,10 @@ CFLAGS
 LDFLAGS
 LIBS
 CPPFLAGS
+CPP
 CXX
 CXXFLAGS
 CCC
-CPP
 CXXCPP
 PKG_CONFIG
 PKG_CONFIG_PATH
@@ -890,6 +918,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1142,6 +1171,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1279,7 +1317,7 @@ fi
 for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
                datadir sysconfdir sharedstatedir localstatedir includedir \
                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-               libdir localedir mandir
+               libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1307,8 +1345,6 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1394,7 +1430,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures libsndfile 1.0.25 to adapt to many kinds of systems.
+\`configure' configures libsndfile 1.0.26 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1434,6 +1470,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1465,7 +1502,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libsndfile 1.0.25:";;
+     short | recursive ) echo "Configuration of libsndfile 1.0.26:";;
    esac
   cat <<\_ACEOF
 
@@ -1473,17 +1510,21 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
   --enable-shared[=PKGS]  build shared libraries [default=yes]
   --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
   --enable-experimental   enable experimental code
-  --enable-gcc-werror     enable -Werror in all Makefiles
+  --enable-werror         enable -Werror in all Makefiles
+  --enable-stack-smash-protection
+                          Enable GNU GCC stack smash protection
   --disable-gcc-pipe      disable gcc -pipe option
   --disable-gcc-opt       disable gcc optimisations
   --disable-cpu-clip      disable tricky cpu specific clipper
@@ -1498,7 +1539,7 @@ Optional Features:
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic              try to use only PIC/non-PIC objects [default=use
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-sysroot=DIR Search for dependent libraries within DIR
@@ -1506,6 +1547,8 @@ Optional Packages:
   --with-octave           choose the octave version
   --with-mkoctfile        choose the mkoctfile version
   --with-octave-config    choose the octave-config version
+  --with-pkgconfigdir     pkg-config installation directory
+                          ['${libdir}/pkgconfig']
 
 Some influential environment variables:
   CC          C compiler command
@@ -1515,9 +1558,9 @@ Some influential environment variables:
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
-  CPP         C preprocessor
   CXXCPP      C++ preprocessor
   PKG_CONFIG  path to pkg-config utility
   PKG_CONFIG_PATH
@@ -1610,10 +1653,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libsndfile configure 1.0.25
-generated by GNU Autoconf 2.68
+libsndfile configure 1.0.26
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1662,21 +1705,20 @@ fi
 
 } # ac_fn_c_try_compile
 
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
 $as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
     grep -v '^ *+' conftest.err >conftest.er1
@@ -1684,29 +1726,120 @@ $as_echo "$ac_try_echo"; } >&5
     mv -f conftest.er1 conftest.err
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-        test -z "$ac_cxx_werror_flag" ||
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
         test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
+       }; then :
   ac_retval=0
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_retval=1
+    ac_retval=1
 fi
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_cxx_try_compile
+} # ac_fn_c_try_cpp
 
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to sndfile@mega-nerd.com ##
+## ------------------------------------ ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -1714,37 +1847,33 @@ case "(($ac_try" in
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
 $as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
+  (eval "$ac_link") 2>&5
   ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-        test -z "$ac_c_werror_flag" ||
-        test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-        test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
-       }; then :
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
   ac_retval=0
 else
-  $as_echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_retval=1
+       ac_retval=$ac_status
 fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_c_try_link
+} # ac_fn_c_try_run
 
 # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
 # -------------------------------------------------------
@@ -1777,20 +1906,21 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_header_compile
 
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
 $as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  (eval "$ac_compile") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
     grep -v '^ *+' conftest.err >conftest.er1
@@ -1798,29 +1928,29 @@ $as_echo "$ac_try_echo"; } >&5
     mv -f conftest.er1 conftest.err
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
         test ! -s conftest.err
-       }; then :
+       } && test -s conftest.$ac_objext; then :
   ac_retval=0
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-    ac_retval=1
+       ac_retval=1
 fi
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_c_try_cpp
+} # ac_fn_cxx_try_compile
 
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -1828,33 +1958,37 @@ case "(($ac_try" in
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
 $as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
+  (eval "$ac_link") 2>conftest.err
   ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
   ac_retval=0
 else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_retval=$ac_status
+       ac_retval=1
 fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_c_try_run
+} # ac_fn_c_try_link
 
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
@@ -1987,7 +2121,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -2006,97 +2140,6 @@ fi
 
 } # ac_fn_cxx_try_link
 
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------ ##
-## Report this to sndfile@mega-nerd.com ##
-## ------------------------------------ ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
 # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
 # ---------------------------------------------
 # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
@@ -2160,7 +2203,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2176,7 +2220,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2202,7 +2247,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2218,7 +2264,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2252,7 +2299,8 @@ int
 main ()
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
 
   ;
   return 0;
@@ -2378,8 +2426,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libsndfile $as_me 1.0.25, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+It was created by libsndfile $as_me 1.0.26, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -2759,6 +2807,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 
 
+
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
   as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
@@ -2874,7 +2923,7 @@ test -n "$target_alias" &&
 ac_config_headers="$ac_config_headers src/config.h"
 
 
-am__api_version='1.11'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2913,7 +2962,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -2971,9 +3020,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
 $as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -2984,32 +3030,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+       && test "$*" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$2" = conftest.file
    )
 then
@@ -3021,6 +3075,16 @@ Check your system clock" "$LINENO" 5
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -3031,8 +3095,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -3043,15 +3107,15 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -3060,10 +3124,10 @@ if test x"${install_sh}" != xset; then
   esac
 fi
 
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
+# will honor the 'STRIP' environment variable to overrule this program.
 if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -3082,7 +3146,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3122,7 +3186,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3173,7 +3237,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -3202,12 +3266,6 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
 $as_echo "$MKDIR_P" >&6; }
 
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -3226,7 +3284,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3290,6 +3348,45 @@ else
 fi
 rmdir .tst 2>/dev/null
 
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
 if test "`cd $srcdir && pwd`" != "`pwd`"; then
   # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
   # is not polluted with repeated "-I."
@@ -3311,8 +3408,8 @@ fi
 
 
 # Define the identity of the package.
- PACKAGE=$PACKAGE_NAME
- VERSION=$PACKAGE_VERSION
+ PACKAGE='libsndfile'
+ VERSION='1.0.26'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3340,34 +3437,111 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
 
-AMTAR=${AMTAR-"${am_missing_run}tar"}
 
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
 
 
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
 
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
 
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
 fi
 
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=0;;
 esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
 AM_BACKSLASH='\'
 
 
-ACLOCAL_AMFLAGS="-I M4"
-
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3375,6 +3549,69 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3397,7 +3634,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3437,7 +3674,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3490,7 +3727,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3531,7 +3768,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3589,7 +3826,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3633,7 +3870,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -4079,8 +4316,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -4164,67 +4400,64 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-       @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
+int
+main ()
+{
 
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
 fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
 fi
-
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 depcc="$CC"   am_compiler_list=
@@ -4238,8 +4471,9 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -4273,16 +4507,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -4291,16 +4525,16 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
        break
       fi
       ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -4354,255 +4588,881 @@ else
 fi
 
 
-if test "x$CC" != xcc; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
-fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
-                     sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+   case $ac_cv_prog_cc_stdc in #(
+  no) :
+    ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #(
+  *) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
 
-int
-main ()
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
 {
+  int datasize;
+  double data[];
+};
 
-  ;
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
   return 0;
 }
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-   test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-then
-  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
-  if test "x$CC" != xcc; then
-    # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.$ac_ext >&5'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-      rm -f conftest2.*
-      if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-        test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-      then
-       # cc works too.
-       :
-      else
-       # cc exists but doesn't like -o.
-       eval ac_cv_prog_cc_${ac_cc}_c_o=no
-      fi
-    fi
-  fi
-else
-  eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f core conftest*
 
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
 
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+  const char *str;
+  int number;
+  float fnumber;
 
-fi
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
 
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
+int
+main ()
+{
 
+  // Check bool.
+  _Bool success = false;
 
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
 
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
 
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
 
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
 
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+  ni.number = 58;
 
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
 
-  test -n "$ac_ct_CXX" && break
-done
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
 
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
 fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
 
-  fi
 fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+else
+  ac_cv_prog_cc_stdc=no
+fi
+
+fi
+ ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5
+$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; }
+  if ${ac_cv_prog_cc_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+
+  case $ac_cv_prog_cc_stdc in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;; #(
+  '') :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;; #(
+  *) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5
+$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+  if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#         define __EXTENSIONS__ 1
+          $ac_includes_default
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_safe_to_define___extensions__=yes
+else
+  ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
   (eval "$ac_compiler $ac_option >&5") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -4748,8 +5608,9 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -4783,16 +5644,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -4801,16 +5662,16 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
        break
       fi
       ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -4848,20 +5709,88 @@ else
   am_cv_CXX_dependencies_compiler_type=none
 fi
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the CLANG C compiler" >&5
+$as_echo_n "checking whether we are using the CLANG C compiler... " >&6; }
+if ${mn_cv_c_compiler_clang+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+
+                       #ifndef __clang__
+                               This is not clang!
+                       #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  mn_cv_c_compiler_clang=yes
+else
+  mn_cv_c_compiler_clang=no
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mn_cv_c_compiler_clang" >&5
+$as_echo "$mn_cv_c_compiler_clang" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+       if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+
+                       #ifdef __clang__
+                               This is clang!
+                       #endif
 
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_c_compiler_gnu=yes
 else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
+  ac_cv_c_compiler_gnu=no
+
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+               fi
+
 
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
@@ -4886,7 +5815,7 @@ do
     for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+      as_fn_executable_p "$ac_path_SED" || continue
 # Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
@@ -4944,8 +5873,8 @@ esac
 
 
 
-macro_version='2.4'
-macro_revision='1.3293'
+macro_version='2.4.2'
+macro_revision='1.3337'
 
 
 
@@ -5052,7 +5981,7 @@ do
     for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+      as_fn_executable_p "$ac_path_SED" || continue
 # Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
@@ -5112,136 +6041,6 @@ Xsed="$SED -e 1s/^X//"
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
 $as_echo_n "checking for fgrep... " >&6; }
 if ${ac_cv_path_FGREP+:} false; then :
@@ -5261,7 +6060,7 @@ do
     for ac_prog in fgrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+      as_fn_executable_p "$ac_path_FGREP" || continue
 # Check for GNU ac_path_FGREP and select it if it is found.
   # Check for GNU $ac_path_FGREP
 case `"$ac_path_FGREP" --version 2>&1` in
@@ -5517,7 +6316,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5561,7 +6360,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5719,6 +6518,11 @@ else
     lt_cv_sys_max_cmd_len=196608
     ;;
 
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
   osf*)
     # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
     # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -5745,7 +6549,8 @@ else
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
@@ -5758,7 +6563,7 @@ else
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
              test $i != 17 # 1/2 MB should be enough
       do
@@ -5980,7 +6785,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6020,7 +6825,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6146,10 +6951,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -6187,8 +6988,8 @@ irix5* | irix6* | nonstopux*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -6326,7 +7127,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6366,7 +7167,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6450,7 +7251,6 @@ test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
 
 
 
-
 if test -n "$ac_tool_prefix"; then
   for ac_prog in ar
   do
@@ -6470,7 +7270,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6514,7 +7314,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6639,7 +7439,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6679,7 +7479,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6738,7 +7538,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6778,7 +7578,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6828,13 +7628,13 @@ old_postuninstall_cmds=
 if test -n "$RANLIB"; then
   case $host_os in
   openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
     ;;
   esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
 fi
 
 case $host_os in
@@ -6981,6 +7781,7 @@ for ac_symprfx in "" "_"; do
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -7269,7 +8070,7 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
@@ -7285,9 +8086,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
            LD="${LD-ld} -m elf_i386_fbsd"
            ;;
          x86_64-*linux*)
-           LD="${LD-ld} -m elf_i386"
+           case `/usr/bin/file conftest.o` in
+             *x86-64*)
+               LD="${LD-ld} -m elf32_x86_64"
+               ;;
+             *)
+               LD="${LD-ld} -m elf_i386"
+               ;;
+           esac
            ;;
-         ppc64-*linux*|powerpc64-*linux*)
+         powerpc64le-*)
+           LD="${LD-ld} -m elf32lppclinux"
+           ;;
+         powerpc64-*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -7306,7 +8117,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         ppc*-*linux*|powerpc*-*linux*)
+         powerpcle-*)
+           LD="${LD-ld} -m elf64lppc"
+           ;;
+         powerpc-*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -7369,7 +8183,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
     CFLAGS="$SAVE_CFLAGS"
   fi
   ;;
-sparc*-*solaris*)
+*-*solaris*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
@@ -7380,7 +8194,20 @@ sparc*-*solaris*)
     case `/usr/bin/file conftest.o` in
     *64-bit*)
       case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
       *)
        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
          LD="${LD-ld} -64"
@@ -7413,7 +8240,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7453,7 +8280,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7533,7 +8360,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7573,7 +8400,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7625,7 +8452,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7665,7 +8492,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_NMEDIT="nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7717,7 +8544,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7757,7 +8584,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_LIPO="lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7809,7 +8636,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7841,99 +8668,7 @@ if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -7941,8 +8676,8 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -7952,17 +8687,17 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -7970,432 +8705,267 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    OTOOL64=$ac_ct_OTOOL64
+    OTOOL=$ac_ct_OTOOL
   fi
 else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-       # By default we will add the -single_module flag. You can override
-       # by either setting the environment variable LT_MULTI_MODULE
-       # non-empty at configure time, or by adding -multi_module to the
-       # link flags.
-       rm -rf libconftest.dylib*
-       echo "int foo(void){return 1;}" > conftest.c
-       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-       if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-         lt_cv_apple_cc_single_mod=yes
-       else
-         cat conftest.err >&5
-       fi
-       rm -rf libconftest.dylib*
-       rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
+  OTOOL="$ac_cv_prog_OTOOL"
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-       LDFLAGS="$save_LDFLAGS"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-       lt_cv_ld_force_load=yes
-      else
-       cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-       10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-       10.[012]*)
-         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-       10.*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
 else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
 do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-else
-  # Broken: fails on valid input.
-continue
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
-    done
-    ac_cv_prog_CPP=$CPP
 
 fi
-  CPP=$ac_cv_prog_CPP
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
 do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
 else
-  # Broken: fails on valid input.
-continue
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
 else
-  # Passes both tests.
-ac_preproc_ok=:
-break
+  OTOOL64="$ac_cv_prog_OTOOL64"
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
 
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
 
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
 
-fi
 
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
 
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&5
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&5
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
 
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-                  (('a' <= (c) && (c) <= 'i') \
-                    || ('j' <= (c) && (c) <= 'r') \
-                    || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
 
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
 int
 main ()
 {
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-       || toupper (i) != TOUPPER (i))
-      return 2;
+
+  ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
 else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
+  lt_cv_ld_exported_symbols_list=no
 fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-                 inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       LDFLAGS="$save_LDFLAGS"
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
 
-done
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[012]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
 
 for ac_header in dlfcn.h
 do :
@@ -8500,7 +9070,22 @@ fi
 
 # Check whether --with-pic was given.
 if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
 else
   pic_mode=default
 fi
@@ -8578,6 +9163,10 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
 
 
+
+
+
+
 test -z "$LN_S" && LN_S="ln -s"
 
 
@@ -9037,7 +9626,9 @@ lt_prog_compiler_static=
     case $cc_basename in
     nvcc*) # Cuda Compiler Driver 2.2
       lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
       ;;
     esac
   else
@@ -9081,7 +9672,7 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -9128,18 +9719,33 @@ lt_prog_compiler_static=
        ;;
       *)
        case `$CC -V 2>&1 | sed 5q` in
-       *Sun\ F* | *Sun*Fortran*)
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
          # Sun Fortran 8.3 passes all unrecognized flags to the linker
          lt_prog_compiler_pic='-KPIC'
          lt_prog_compiler_static='-Bstatic'
          lt_prog_compiler_wl=''
          ;;
+       *Sun\ F* | *Sun*Fortran*)
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Qoption ld '
+         ;;
        *Sun\ C*)
          # Sun C 5.9
          lt_prog_compiler_pic='-KPIC'
          lt_prog_compiler_static='-Bstatic'
          lt_prog_compiler_wl='-Wl,'
          ;;
+        *Intel*\ [CF]*Compiler*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fPIC'
+         lt_prog_compiler_static='-static'
+         ;;
+       *Portland\ Group*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fpic'
+         lt_prog_compiler_static='-Bstatic'
+         ;;
        esac
        ;;
       esac
@@ -9501,7 +10107,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   hardcode_direct=no
   hardcode_direct_absolute=no
   hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
   hardcode_libdir_separator=
   hardcode_minus_L=no
   hardcode_shlibpath_var=unsupported
@@ -9754,8 +10359,7 @@ _LT_EOF
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-         hardcode_libdir_flag_spec=
-         hardcode_libdir_flag_spec_ld='-rpath $libdir'
+         hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
          archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          if test "x$supports_anon_versioning" = xyes; then
            archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
@@ -10135,6 +10739,7 @@ fi
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
        enable_shared_with_static_runtimes=yes
+       exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
        export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
        # Don't use ranlib
        old_postinstall_cmds='chmod 644 $oldlib'
@@ -10180,6 +10785,7 @@ fi
   hardcode_shlibpath_var=unsupported
   if test "$lt_cv_ld_force_load" = "yes"; then
     whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
   else
     whole_archive_flag_spec=''
   fi
       hardcode_shlibpath_var=no
       ;;
 
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
     # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
     # support.  Future versions do this automatically, but an explicit c++rt0.o
     # does not break anything, and helps significantly (at the cost of a little
@@ -10224,7 +10826,7 @@ fi
       ;;
 
     # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
+    freebsd2.*)
       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
       hardcode_minus_L=yes
@@ -10263,7 +10865,6 @@ fi
       fi
       if test "$with_gnu_ld" = no; then
        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-       hardcode_libdir_flag_spec_ld='+b $libdir'
        hardcode_libdir_separator=:
        hardcode_direct=yes
        hardcode_direct_absolute=yes
@@ -10887,11 +11488,6 @@ esac
 
 
 
-
-
-
-
-
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
@@ -10981,7 +11577,7 @@ need_version=unknown
 
 case $host_os in
 aix3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
@@ -10990,7 +11586,7 @@ aix3*)
   ;;
 
 aix[4-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
@@ -11055,7 +11651,7 @@ beos*)
   ;;
 
 bsdi[45]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
@@ -11194,7 +11790,7 @@ darwin* | rhapsody*)
   ;;
 
 dgux*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -11202,10 +11798,6 @@ dgux*)
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -11213,7 +11805,7 @@ freebsd* | dragonfly*)
     objformat=`/usr/bin/objformat`
   else
     case $host_os in
-    freebsd[123]*) objformat=aout ;;
+    freebsd[23].*) objformat=aout ;;
     *) objformat=elf ;;
     esac
   fi
@@ -11231,7 +11823,7 @@ freebsd* | dragonfly*)
   esac
   shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  freebsd2*)
+  freebsd2.*)
     shlibpath_overrides_runpath=yes
     ;;
   freebsd3.[01]* | freebsdelf3.[01]*)
@@ -11250,19 +11842,8 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
@@ -11323,7 +11904,7 @@ hpux9* | hpux10* | hpux11*)
   ;;
 
 interix[3-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -11339,7 +11920,7 @@ irix5* | irix6* | nonstopux*)
     nonstopux*) version_type=nonstopux ;;
     *)
        if test "$lt_cv_prog_gnu_ld" = yes; then
-               version_type=linux
+               version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
        fi ;;
@@ -11376,9 +11957,9 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -11472,7 +12053,7 @@ netbsd*)
   ;;
 
 newsos6)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
@@ -11541,7 +12122,7 @@ rdos*)
   ;;
 
 solaris*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -11566,7 +12147,7 @@ sunos4*)
   ;;
 
 sysv4 | sysv4.3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -11590,7 +12171,7 @@ sysv4 | sysv4.3*)
 
 sysv4*MP*)
   if test -d /usr/nec ;then
-    version_type=linux
+    version_type=linux # correct to gnu/linux during the next big refactor
     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
     soname_spec='$libname${shared_ext}.$major'
     shlibpath_var=LD_LIBRARY_PATH
@@ -11621,7 +12202,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
 
 tpf*)
   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -11631,7 +12212,7 @@ tpf*)
   ;;
 
 uts4*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -12556,7 +13137,6 @@ export_dynamic_flag_spec_CXX=
 hardcode_direct_CXX=no
 hardcode_direct_absolute_CXX=no
 hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_flag_spec_ld_CXX=
 hardcode_libdir_separator_CXX=
 hardcode_minus_L_CXX=no
 hardcode_shlibpath_var_CXX=unsupported
@@ -13140,6 +13720,7 @@ fi
   hardcode_shlibpath_var_CXX=unsupported
   if test "$lt_cv_ld_force_load" = "yes"; then
     whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
   else
     whole_archive_flag_spec_CXX=''
   fi
@@ -13184,7 +13765,7 @@ fi
         esac
         ;;
 
-      freebsd[12]*)
+      freebsd2.*)
         # C++ shared libraries reported to be fairly broken before
        # switch to ELF
         ld_shlibs_CXX=no
@@ -13200,9 +13781,6 @@ fi
         ld_shlibs_CXX=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
@@ -13364,7 +13942,7 @@ fi
         inherit_rpath_CXX=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
            # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -13860,6 +14438,7 @@ _lt_libdeps_save_CFLAGS=$CFLAGS
 case "$CC $CFLAGS " in #(
 *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
 *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
 esac
 
 if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
@@ -14223,7 +14802,7 @@ lt_prog_compiler_static_CXX=
            ;;
        esac
        ;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
        case $cc_basename in
          KCC*)
            # KAI C++ Compiler
@@ -14649,7 +15228,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl*) ;;
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
     *)
       export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
       exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
@@ -14805,8 +15386,6 @@ esac
 
 
 
-
-
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
@@ -14832,7 +15411,7 @@ need_version=unknown
 
 case $host_os in
 aix3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
@@ -14841,7 +15420,7 @@ aix3*)
   ;;
 
 aix[4-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
@@ -14906,7 +15485,7 @@ beos*)
   ;;
 
 bsdi[45]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
@@ -15043,7 +15622,7 @@ darwin* | rhapsody*)
   ;;
 
 dgux*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -15051,10 +15630,6 @@ dgux*)
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
 freebsd* | dragonfly*)
   # DragonFly does not have aout.  When/if they implement a new
   # versioning mechanism, adjust this.
@@ -15062,7 +15637,7 @@ freebsd* | dragonfly*)
     objformat=`/usr/bin/objformat`
   else
     case $host_os in
-    freebsd[123]*) objformat=aout ;;
+    freebsd[23].*) objformat=aout ;;
     *) objformat=elf ;;
     esac
   fi
@@ -15080,7 +15655,7 @@ freebsd* | dragonfly*)
   esac
   shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  freebsd2*)
+  freebsd2.*)
     shlibpath_overrides_runpath=yes
     ;;
   freebsd3.[01]* | freebsdelf3.[01]*)
@@ -15099,19 +15674,8 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
@@ -15172,7 +15736,7 @@ hpux9* | hpux10* | hpux11*)
   ;;
 
 interix[3-9]*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -15188,7 +15752,7 @@ irix5* | irix6* | nonstopux*)
     nonstopux*) version_type=nonstopux ;;
     *)
        if test "$lt_cv_prog_gnu_ld" = yes; then
-               version_type=linux
+               version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
        fi ;;
@@ -15225,9 +15789,9 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -15321,7 +15885,7 @@ netbsd*)
   ;;
 
 newsos6)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
@@ -15390,7 +15954,7 @@ rdos*)
   ;;
 
 solaris*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -15415,7 +15979,7 @@ sunos4*)
   ;;
 
 sysv4 | sysv4.3*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -15439,7 +16003,7 @@ sysv4 | sysv4.3*)
 
 sysv4*MP*)
   if test -d /usr/nec ;then
-    version_type=linux
+    version_type=linux # correct to gnu/linux during the next big refactor
     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
     soname_spec='$libname${shared_ext}.$major'
     shlibpath_var=LD_LIBRARY_PATH
@@ -15470,7 +16034,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
 
 tpf*)
   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -15480,7 +16044,7 @@ tpf*)
   ;;
 
 uts4*)
-  version_type=linux
+  version_type=linux # correct to gnu/linux during the next big refactor
   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
   soname_spec='${libname}${release}${shared_ext}$major'
   shlibpath_var=LD_LIBRARY_PATH
@@ -15619,6 +16183,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+
+
         ac_config_commands="$ac_config_commands libtool"
 
 
@@ -15644,7 +16210,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RC="${ac_tool_prefix}windres"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -15684,7 +16250,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RC="windres"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -15804,6 +16370,19 @@ CC=$lt_save_CC
 CFLAGS=$lt_save_CFLAGS
 
 
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+
 # Extract the first word of "autogen", so it can be a program name with args.
 set dummy autogen; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -15820,7 +16399,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_HAVE_AUTOGEN="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -15858,7 +16437,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_HAVE_WINE="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -15880,20 +16459,45 @@ $as_echo "no" >&6; }
 fi
 
 
+# Extract the first word of "xcode-select", so it can be a program name with args.
+set dummy xcode-select; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_HAVE_XCODE_SELECT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$HAVE_XCODE_SELECT"; then
+  ac_cv_prog_HAVE_XCODE_SELECT="$HAVE_XCODE_SELECT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_XCODE_SELECT="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+  test -z "$ac_cv_prog_HAVE_XCODE_SELECT" && ac_cv_prog_HAVE_XCODE_SELECT="no"
+fi
+fi
+HAVE_XCODE_SELECT=$ac_cv_prog_HAVE_XCODE_SELECT
+if test -n "$HAVE_XCODE_SELECT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_XCODE_SELECT" >&5
+$as_echo "$HAVE_XCODE_SELECT" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
+
 #------------------------------------------------------------------------------------
 # Rules for library version information:
 #
 
 
 #====================================================================================
-# Check for support of the struct hack.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking C99 struct flexible array support" >&5
-$as_echo_n "checking C99 struct flexible array support... " >&6; }
-if ${ac_cv_c99_flexible_array+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Initialize to unknown
-ac_cv_c99_flexible_array=no
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-       #include <stdlib.h>
-       typedef struct {
-       int k;
-       char buffer [] ;
-       } MY_STRUCT ;
-
-int
-main ()
-{
-  MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_c99_flexible_array=yes
-else
-  ac_cv_c99_flexible_array=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c99_flexible_array" >&5
-$as_echo "$ac_cv_c99_flexible_array" >&6; }
-
-
-if test x$ac_cv_c99_flexible_array = xyes ; then
-
-$as_echo "#define HAVE_FLEXIBLE_ARRAY 1" >>confdefs.h
-
-else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** This compiler does not support the 1999 ISO C Standard ***" >&5
-$as_echo "$as_me: WARNING: *** This compiler does not support the 1999 ISO C Standard ***" >&2;}
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** feature known as the flexible array struct member.     ***" >&5
-$as_echo "$as_me: WARNING: *** feature known as the flexible array struct member.     ***" >&2;}
-       $as_echo "#define HAVE_FLEXIBLE_ARRAY 0" >>confdefs.h
-
-       fi
-
-#====================================================================================
 # Couple of initializations here. Fill in real values later.
 
 SHLIB_VERSION_ARG=""
@@ -16232,9 +16782,15 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-# Check whether --enable-gcc-werror was given.
-if test "${enable_gcc_werror+set}" = set; then :
-  enableval=$enable_gcc_werror;
+# Check whether --enable-werror was given.
+if test "${enable_werror+set}" = set; then :
+  enableval=$enable_werror;
+fi
+
+
+# Check whether --enable-stack-smash-protection was given.
+if test "${enable_stack_smash_protection+set}" = set; then :
+  enableval=$enable_stack_smash_protection;
 fi
 
 
@@ -16640,8 +17196,7 @@ _ACEOF
 # Unfortunately there is more than one way of ensuring this so need to do some
 # pretty rigourous testing here.
 
-unset ac_cv_sizeof_off_t
-
+# Check for common 64 bit file offset types.
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
@@ -16674,26 +17229,8 @@ cat >>confdefs.h <<_ACEOF
 #define SIZEOF_OFF_T $ac_cv_sizeof_off_t
 _ACEOF
 
-       # Fake default value.
-
-case "$host_os" in
-       mingw32msvc | mingw32)
-               TYPEOF_SF_COUNT_T="__int64"
-               SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
-               SIZEOF_SF_COUNT_T=8
 
-$as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
-
-               ;;
-       *)
-               if test "x$ac_cv_sizeof_off_t" = "x8" ; then
-                       # If sizeof (off_t) is 8, no further checking is needed.
-                       TYPEOF_SF_COUNT_T="int64_t"
-                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
-                       SIZEOF_SF_COUNT_T=8
-               else
-                       # Check for common 64 bit file offset types.
-                       # The cast to long int works around a bug in the HP C Compiler
+# The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
 # This bug is HP SR number 8606223364.
@@ -16725,8 +17262,8 @@ cat >>confdefs.h <<_ACEOF
 #define SIZEOF_LOFF_T $ac_cv_sizeof_loff_t
 _ACEOF
 
-       # Fake default value.
-                       # The cast to long int works around a bug in the HP C Compiler
+
+# The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
 # This bug is HP SR number 8606223364.
@@ -16758,140 +17295,121 @@ cat >>confdefs.h <<_ACEOF
 #define SIZEOF_OFF64_T $ac_cv_sizeof_off64_t
 _ACEOF
 
-       # Fake default value.
 
-                       TYPEOF_SF_COUNT_T="unknown"
-                       if test "x$ac_cv_sizeof_loff_t" = "x8" ; then
-                               TYPEOF_SF_COUNT_T="int64_t"
-                               SIZEOF_SF_COUNT_T=8
-                       elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then
-                               TYPEOF_SF_COUNT_T="int64_t"
-                               SIZEOF_SF_COUNT_T=8
-                               fi
 
+if test "$enable_largefile:$ac_cv_sizeof_off_t" = "no:8" ; then
+       echo
+       echo "Error : Cannot disable large file support because sizeof (off_t) == 8."
+       echo
+       exit 1
+       fi
+
+
+case "$host_os" in
+       mingw32*)
+               TYPEOF_SF_COUNT_T="__int64"
+               SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+               SIZEOF_SF_COUNT_T=8
+
+$as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
+
+               ;;
+       *)
+               SIZEOF_SF_COUNT_T=0
+               if test "x$ac_cv_sizeof_off_t" = "x8" ; then
+                       # If sizeof (off_t) is 8, no further checking is needed.
+                       TYPEOF_SF_COUNT_T="int64_t"
+                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+                       SIZEOF_SF_COUNT_T=8
+               elif test "x$ac_cv_sizeof_loff_t" = "x8" ; then
+                       TYPEOF_SF_COUNT_T="int64_t"
+                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+                       SIZEOF_SF_COUNT_T=8
+               elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then
+                       TYPEOF_SF_COUNT_T="int64_t"
+                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+                       SIZEOF_SF_COUNT_T=8
+               else
                        # Save the old sizeof (off_t) value  and then unset it to see if it
                        # changes when Large File Support is enabled.
-
                        pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t
                        unset ac_cv_sizeof_off_t
 
-
-   # Check whether --enable-largefile was given.
+                       # Check whether --enable-largefile was given.
 if test "${enable_largefile+set}" = set; then :
   enableval=$enable_largefile;
 fi
 
-   if test "$enable_largefile" != no; then
-     if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
-set dummy ${ac_tool_prefix}getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GETCONF"; then
-  ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_GETCONF="${ac_tool_prefix}getconf"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-GETCONF=$ac_cv_prog_GETCONF
-if test -n "$GETCONF"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
+if test "$enable_largefile" != no; then
 
-fi
-if test -z "$ac_cv_prog_GETCONF"; then
-  ac_ct_GETCONF=$GETCONF
-  # Extract the first word of "getconf", so it can be a program name with args.
-set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_GETCONF+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_GETCONF"; then
-  ac_cv_prog_ac_ct_GETCONF="$ac_ct_GETCONF" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_GETCONF="getconf"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+        if ac_fn_c_try_compile "$LINENO"; then :
+  break
 fi
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
 fi
-ac_ct_GETCONF=$ac_cv_prog_ac_ct_GETCONF
-if test -n "$ac_ct_GETCONF"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GETCONF" >&5
-$as_echo "$ac_ct_GETCONF" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
 fi
-
-  if test "x$ac_ct_GETCONF" = x; then
-    GETCONF=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    GETCONF=$ac_ct_GETCONF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
   fi
-else
-  GETCONF="$ac_cv_prog_GETCONF"
-fi
 
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS value to request large file support" >&5
-$as_echo_n "checking for CFLAGS value to request large file support... " >&6; }
-if ${ac_cv_sys_largefile_CFLAGS+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_cv_sys_largefile_CFLAGS=`($GETCONF LFS_CFLAGS) 2>/dev/null` || {
-       ac_cv_sys_largefile_CFLAGS=no
-       case "$host_os" in
-          # IRIX 6.2 and later require cc -n32.
-          irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
-            if test "$GCC" != yes; then
-              ac_cv_sys_largefile_CFLAGS=-n32
-            fi
-            ac_save_CC="$CC"
-            CC="$CC $ac_cv_sys_largefile_CFLAGS"
-            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
 int
 main ()
 {
@@ -16900,178 +17418,122 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-else
-  ac_cv_sys_largefile_CFLAGS=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-            CC="$ac_save_CC"
-          esac
-      }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CFLAGS" >&5
-$as_echo "$ac_cv_sys_largefile_CFLAGS" >&6; }
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LDFLAGS value to request large file support" >&5
-$as_echo_n "checking for LDFLAGS value to request large file support... " >&6; }
-if ${ac_cv_sys_largefile_LDFLAGS+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_sys_largefile_LDFLAGS=`($GETCONF LFS_LDFLAGS) 2>/dev/null` || {
-       ac_cv_sys_largefile_LDFLAGS=no
-
-      }
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_LDFLAGS" >&5
-$as_echo "$ac_cv_sys_largefile_LDFLAGS" >&6; }
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBS value to request large file support" >&5
-$as_echo_n "checking for LIBS value to request large file support... " >&6; }
-if ${ac_cv_sys_largefile_LIBS+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_sys_largefile_LIBS=`($GETCONF LFS_LIBS) 2>/dev/null` || {
-       ac_cv_sys_largefile_LIBS=no
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
-      }
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_LIBS" >&5
-$as_echo "$ac_cv_sys_largefile_LIBS" >&6; }
-
-     for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       no) ;;
-       -D_FILE_OFFSET_BITS=*) ;;
-       -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
-       -D_LARGE_FILES | -D_LARGE_FILES=*) ;;
-       -D?* | -I?*)
-        case "$ac_flag" in
-   no) ;;
-   ?*)
-     case "$CPPFLAGS" in
-     '') CPPFLAGS="$ac_flag" ;;
-     *) CPPFLAGS=$CPPFLAGS' '"$ac_flag" ;;
-     esac ;;
-   esac ;;
-       *)
-        case "$ac_flag" in
-   no) ;;
-   ?*)
-     case "$CFLAGS" in
-     '') CFLAGS="$ac_flag" ;;
-     *) CFLAGS=$CFLAGS' '"$ac_flag" ;;
-     esac ;;
-   esac ;;
-       esac
-     done
-     case "$ac_cv_sys_largefile_LDFLAGS" in
-   no) ;;
-   ?*)
-     case "$LDFLAGS" in
-     '') LDFLAGS="$ac_cv_sys_largefile_LDFLAGS" ;;
-     *) LDFLAGS=$LDFLAGS' '"$ac_cv_sys_largefile_LDFLAGS" ;;
-     esac ;;
-   esac
-     case "$ac_cv_sys_largefile_LIBS" in
-   no) ;;
-   ?*)
-     case "$LIBS" in
-     '') LIBS="$ac_cv_sys_largefile_LIBS" ;;
-     *) LIBS=$LIBS' '"$ac_cv_sys_largefile_LIBS" ;;
-     esac ;;
-   esac
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_sys_file_offset_bits=no
-
-      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       -D_FILE_OFFSET_BITS)
-         ac_cv_sys_file_offset_bits=1 ;;
-       -D_FILE_OFFSET_BITS=*)
-         ac_cv_sys_file_offset_bits=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
-       esac
-      done
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
 $as_echo "$ac_cv_sys_file_offset_bits" >&6; }
-   if test "$ac_cv_sys_file_offset_bits" != no; then
-
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
 cat >>confdefs.h <<_ACEOF
 #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
 _ACEOF
-
-   fi
-       case "$host_os" in
-       # HP-UX 10.20 and later
-       hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
-         ac_cv_sys_file_offset_bits=64 ;;
-       esac
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE" >&5
-$as_echo_n "checking for _LARGEFILE_SOURCE... " >&6; }
-if ${ac_cv_sys_largefile_source+:} false; then :
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_cv_sys_largefile_source=no
-      case "$host_os" in
-       # HP-UX 10.20 and later
-       hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
-         ac_cv_sys_largefile_source=1 ;;
-       esac
-      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       -D_LARGEFILE_SOURCE)
-         ac_cv_sys_largefile_source=1 ;;
-       -D_LARGEFILE_SOURCE=*)
-         ac_cv_sys_largefile_source=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
-       esac
-      done
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
-$as_echo "$ac_cv_sys_largefile_source" >&6; }
-   if test "$ac_cv_sys_largefile_source" != no; then
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
-cat >>confdefs.h <<_ACEOF
-#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+  ;
+  return 0;
+}
 _ACEOF
-
-   fi
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES" >&5
-$as_echo_n "checking for _LARGE_FILES... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_sys_large_files=no
-      case "$host_os" in
-       # AIX 4.2 and later
-       aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
-         ac_cv_sys_large_files=1 ;;
-       esac
-      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
-       case "$ac_flag" in
-       -D_LARGE_FILES)
-         ac_cv_sys_large_files=1 ;;
-       -D_LARGE_FILES=*)
-         ac_cv_sys_large_files=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
-       esac
-      done
-
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
 $as_echo "$ac_cv_sys_large_files" >&6; }
-   if test "$ac_cv_sys_large_files" != no; then
-
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
 cat >>confdefs.h <<_ACEOF
 #define _LARGE_FILES $ac_cv_sys_large_files
 _ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
 
-   fi
-   fi
+
+fi
 
 
                        if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then
@@ -17116,16 +17578,11 @@ cat >>confdefs.h <<_ACEOF
 #define SIZEOF_OFF_T $ac_cv_sizeof_off_t
 _ACEOF
 
-       # Fake default value.
+
 
                        if test "x$ac_cv_sizeof_off_t" = "x8" ; then
                                TYPEOF_SF_COUNT_T="int64_t"
                                SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
-                       elif test "x$ac_cv_sizeof_off_t" = "x$pre_largefile_sizeof_off_t" ; then
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This machine does not seem to support 64 bit file offsets." >&5
-$as_echo "$as_me: WARNING: This machine does not seem to support 64 bit file offsets." >&2;}
-                               TYPEOF_SF_COUNT_T="off_t"
-                               SIZEOF_SF_COUNT_T=$ac_cv_sizeof_off_t
                        elif test "x$TYPEOF_SF_COUNT_T" = "xunknown" ; then
                                echo
                                echo "*** The configure process has determined that this system is capable"
@@ -17484,7 +17941,7 @@ _ACEOF
 fi
 done
 
-for ac_func in open read write lseek pread pwrite
+for ac_func in open read write lseek lseek64
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17496,7 +17953,7 @@ _ACEOF
 fi
 done
 
-for ac_func in fstat ftruncate fsync
+for ac_func in fstat fstat64 ftruncate fsync
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17613,7 +18070,7 @@ _ACEOF
 
 fi
 
-for ac_func in floor ceil fmod
+for ac_func in floor ceil fmod lround
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17766,7 +18223,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_HAVE_OCTAVE="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -17833,7 +18290,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_HAVE_MKOCTFILE="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -17897,7 +18354,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_HAVE_OCTAVE_CONFIG="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -17953,7 +18410,7 @@ $as_echo "$as_me: WARNING: ** Octave libsndfile modules will not be built.
                                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Octave version 2.X is not supported." >&5
 $as_echo "$as_me: WARNING: Octave version 2.X is not supported." >&2;}
                                ;;
-                       3.0.*)
+                       3.*)
                                OCTAVE_DEST_ODIR=`$OCTAVE_CONFIG --oct-site-dir | sed 's%^/usr%${prefix}%'`
                                OCTAVE_DEST_MDIR=`$OCTAVE_CONFIG --m-site-dir | sed 's%^/usr%${prefix}%'`
 
@@ -18031,7 +18488,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -18074,7 +18531,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -18125,6 +18582,21 @@ $as_echo "no" >&6; }
        fi
 fi
 
+
+
+# Check whether --with-pkgconfigdir was given.
+if test "${with_pkgconfigdir+set}" = set; then :
+  withval=$with_pkgconfigdir;
+else
+  with_pkgconfigdir='${libdir}/pkgconfig'
+fi
+
+pkgconfigdir=$with_pkgconfigdir
+
+
+
+
+
 if test -n "$PKG_CONFIG" ; then
        if test x$enable_external_libs = xno ; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** External libs (FLAC, Ogg, Vorbis) disabled. ***" >&5
@@ -18132,19 +18604,19 @@ $as_echo "$as_me: WARNING: *** External libs (FLAC, Ogg, Vorbis) disabled. ***"
        else
 
 pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for flac >= 1.2.1 " >&5
-$as_echo_n "checking for flac >= 1.2.1 ... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for flac >= 1.3.1 " >&5
+$as_echo_n "checking for flac >= 1.3.1 ... " >&6; }
 
 if test -n "$FLAC_CFLAGS"; then
     pkg_cv_FLAC_CFLAGS="$FLAC_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.2.1\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "flac >= 1.2.1") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.3.1\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "flac >= 1.3.1") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FLAC_CFLAGS=`$PKG_CONFIG --cflags "flac >= 1.2.1" 2>/dev/null`
+  pkg_cv_FLAC_CFLAGS=`$PKG_CONFIG --cflags "flac >= 1.3.1" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -18156,12 +18628,12 @@ if test -n "$FLAC_LIBS"; then
     pkg_cv_FLAC_LIBS="$FLAC_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.2.1\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "flac >= 1.2.1") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.3.1\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "flac >= 1.3.1") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FLAC_LIBS=`$PKG_CONFIG --libs "flac >= 1.2.1" 2>/dev/null`
+  pkg_cv_FLAC_LIBS=`$PKG_CONFIG --libs "flac >= 1.3.1" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
     pkg_failed=untried
 fi
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_FLAC_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_FLAC_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 
 
 if test $pkg_failed = yes; then
@@ -18180,9 +18688,9 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               FLAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "flac >= 1.2.1"`
+               FLAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "flac >= 1.3.1"`
         else
-               FLAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "flac >= 1.2.1"`
+               FLAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "flac >= 1.3.1"`
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$FLAC_PKG_ERRORS" >&5
@@ -18201,7 +18709,7 @@ $as_echo "yes" >&6; }
 fi
 
                # Make sure the FLAC_CFLAGS value is sane.
-               FLAC_CFLAGS=`echo $FLAC_CLFAGS | $SED "s/FLAC$//"`
+               FLAC_CFLAGS=`echo $FLAC_CFLAGS | $SED "s|include/FLAC|include|"`
 
 
 pkg_failed=no
@@ -18237,11 +18745,47 @@ if test -n "$OGG_LIBS"; then
   pkg_cv_OGG_LIBS=`$PKG_CONFIG --libs "ogg >= 1.1.3" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
-  pkg_failed=yes
-fi
- else
-    pkg_failed=untried
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_OGG_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_OGG_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
 
 
 
     pkg_failed=untried
 fi
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_SPEEX_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_SPEEX_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 
 
 if test $pkg_failed = yes; then
     pkg_failed=untried
 fi
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_VORBIS_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_VORBIS_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 
 
 if test $pkg_failed = yes; then
     pkg_failed=untried
 fi
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_VORBISENC_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_VORBISENC_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 
 
 if test $pkg_failed = yes; then
@@ -18496,8 +19148,8 @@ fi
                HAVE_EXTERNAL_LIBS=1
                enable_external_libs=yes
 
-               EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
-               EXTERNAL_LIBS="$FLAC_LIBS $VORBISENC_LIBS $SPEEX_LIBS"
+               EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
+               EXTERNAL_LIBS="$FLAC_LIBS $OGG_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS "
        else
                echo
                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** One or more of the external libraries (ie libflac, libogg and" >&5
     pkg_failed=untried
 fi
 
+pkg_link_saved_CFLAGS=$CFLAGS
+pkg_link_saved_LIBS=$LIBS
+
+eval "pkg_CFLAGS=\${pkg_cv_SQLITE3_CFLAGS}"
+eval "pkg_LIBS=\${pkg_cv_SQLITE3_LIBS}"
+
+CFLAGS="$CFLAGS $pkg_CFLAGS"
+LIBS="$LIBS $pkg_LIBS"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+puts ("");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pkg_link=yes
+else
+  pkg_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+CFLAGS=$pkg_link_saved_CFLAGS
+LIBS=$pkg_link_saved_LIBS
+
+if test $pkg_link = no ; then
+       $as_echo_n "link failed ... "
+       pkg_failed=yes
+       fi
+
 
 
 if test $pkg_failed = yes; then
@@ -18764,20 +19452,29 @@ _ACEOF
 OS_SPECIFIC_CFLAGS=""
 OS_SPECIFIC_LINKS=""
 os_is_win32=0
-os_is_macosx=0
+os_is_openbsd=0
 use_windows_api=0
+osx_darwin_version=0
 
 case "$host_os" in
        darwin* | rhapsody*)
-               os_is_macosx=1
-               OS_SPECIFIC_CFLAGS="-I/Developer/Headers/FlatCarbon"
-               OS_SPECIFIC_LINKS="-framework CoreAudio"
+               osx_darwin_version=$(echo "$host_os" | sed 's/\..*//;s/darwin//g')
+               if test x$HAVE_XCODE_SELECT = xyes ; then
+                       developer_path=`xcode-select --print-path`
+               else
+                       developer_path="/Developer"
+                       fi
+               OS_SPECIFIC_CFLAGS="-I${developer_path}/Headers/FlatCarbon"
+               OS_SPECIFIC_LINKS="-framework CoreAudio -framework AudioToolbox -framework CoreFoundation"
                ;;
        mingw*)
                os_is_win32=1
                use_windows_api=1
                OS_SPECIFIC_LINKS="-lwinmm"
                ;;
+       openbsd*)
+               os_is_openbsd=1
+               ;;
        esac
 
 
@@ -18787,7 +19484,7 @@ _ACEOF
 
 
 cat >>confdefs.h <<_ACEOF
-#define OS_IS_MACOSX ${os_is_macosx}
+#define OS_IS_OPENBSD ${os_is_openbsd}
 _ACEOF
 
 
@@ -18796,6 +19493,10 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define OSX_DARWIN_VERSION ${osx_darwin_version}
+_ACEOF
+
  if test ${use_windows_api} -eq 1; then
   USE_WIN_VERSION_FILE_TRUE=
   USE_WIN_VERSION_FILE_FALSE='#'
@@ -18833,7 +19534,10 @@ done
 # Check for OpenBSD's sndio.
 
 SNDIO_LIBS=""
-for ac_header in sndio.h
+HAVE_SNDIO_H=0
+case "$host_os" in
+       openbsd*)
+               for ac_header in sndio.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "sndio.h" "ac_cv_header_sndio_h" "$ac_includes_default"
 if test "x$ac_cv_header_sndio_h" = xyes; then :
 
 done
 
-if test x$ac_cv_header_sndio_h = xyes ; then
-       SNDIO_LIBS="-lsndio"
-       fi
+               if test x$ac_cv_header_sndio_h = xyes ; then
+                       SNDIO_LIBS="-lsndio"
+                       HAVE_SNDIO_H=1
+                       fi
+               ;;
+       *)
+               ;;
+       esac
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SNDIO_H ${HAVE_SNDIO_H}
+_ACEOF
+
 
 #====================================================================================
 # Test for sanity when cross-compiling.
 
-if test x$cross_compiling = xyes ; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
-$as_echo "$as_me: WARNING: ******************************************************************" >&2;}
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** We are cross-compiling, so have to assume sizeof (short) == 2 " >&5
-$as_echo "$as_me: WARNING: *** We are cross-compiling, so have to assume sizeof (short) == 2 " >&2;}
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** and sizeof (int) == 4. If this is not the case there is no    " >&5
-$as_echo "$as_me: WARNING: *** and sizeof (int) == 4. If this is not the case there is no    " >&2;}
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** chance of this working. Please contact the mantainer.         " >&5
-$as_echo "$as_me: WARNING: *** chance of this working. Please contact the mantainer.         " >&2;}
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
-$as_echo "$as_me: WARNING: ******************************************************************" >&2;}
-       fi
-
 if test $ac_cv_sizeof_short != 2 ; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
 $as_echo "$as_me: WARNING: ******************************************************************" >&2;}
@@ -18910,14 +19612,6 @@ $as_echo "$as_me: WARNING: Touching files in directory tests/." >&2;}
 #====================================================================================
 # Settings for the HTML documentation.
 
-htmldocdir=$prefix/share/doc/libsndfile1-dev/html
-
-if test $prefix = "NONE" ; then
-       htmldocdir=/usr/local/share/doc/libsndfile1-dev/html
-else
-       htmldocdir=$prefix/share/doc/libsndfile1-dev/html
-       fi
-
 if test x$enable_bow_docs = "xyes" ; then
        HTML_BGCOLOUR="white"
        HTML_FGCOLOUR="black"
@@ -18932,11 +19626,139 @@ else
 win32_target_dll=0
 COMPILER_IS_GCC=0
 
-if test x$ac_cv_c_compiler_gnu = xyes ; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -std=gnu99" >&5
-$as_echo_n "checking if $CC accepts -std=gnu99... " >&6; }
+if test x$ac_cv_c_compiler_gnu = xyes ; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -std=gnu99" >&5
+$as_echo_n "checking if $CC accepts -std=gnu99... " >&6; }
+       ac_add_cflags__old_cflags="$CFLAGS"
+       CFLAGS="-std=gnu99"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags -std=gnu99"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+
+if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version of $CC" >&5
+$as_echo_n "checking for version of $CC... " >&6; }
+       GCC_VERSION=`$CC -dumpversion`
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCC_VERSION" >&5
+$as_echo "$GCC_VERSION" >&6; }
+
+               GCC_MAJOR_VERSION=`echo $GCC_VERSION | sed "s/\..*//"`
+       GCC_MINOR_VERSION=`echo $GCC_VERSION | sed "s/$GCC_MAJOR_VERSION\.//" | sed "s/\..*//"`
+               fi
+
+
+
+
+
+
+
+       if test "x$GCC_MAJOR_VERSION$GCC_MINOR_VERSION" = "x42" ; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ****************************************************************" >&5
+$as_echo "$as_me: WARNING: ****************************************************************" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** GCC version 4.2 warns about the inline keyword for no good **" >&5
+$as_echo "$as_me: WARNING: ** GCC version 4.2 warns about the inline keyword for no good **" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** reason but the maintainers do not see it as a bug.         **" >&5
+$as_echo "$as_me: WARNING: ** reason but the maintainers do not see it as a bug.         **" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995      **" >&5
+$as_echo "$as_me: WARNING: ** See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995      **" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Using -fgnu-inline to avoid this stupidity.                **" >&5
+$as_echo "$as_me: WARNING: ** Using -fgnu-inline to avoid this stupidity.                **" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ****************************************************************" >&5
+$as_echo "$as_me: WARNING: ****************************************************************" >&2;}
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fgnu89-inline" >&5
+$as_echo_n "checking if $CC accepts -fgnu89-inline... " >&6; }
+       ac_add_cflags__old_cflags="$CFLAGS"
+       CFLAGS="-fgnu89-inline"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags -fgnu89-inline"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+               fi
+
+       CFLAGS="$CFLAGS -Wall"
+       CXXFLAGS="$CXXFLAGS -Wall"
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wextra" >&5
+$as_echo_n "checking if $CC accepts -Wextra... " >&6; }
+       ac_add_cflags__old_cflags="$CFLAGS"
+       CFLAGS="-Wextra"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags -Wextra"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wdeclaration-after-statement" >&5
+$as_echo_n "checking if $CC accepts -Wdeclaration-after-statement... " >&6; }
        ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-std=gnu99"
+       CFLAGS="-Wdeclaration-after-statement"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -18953,7 +19775,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -std=gnu99"
+                       CFLAGS="$ac_add_cflags__old_cflags -Wdeclaration-after-statement"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
-
-
-if test "x$ac_cv_c_compiler_gnu" = "xyes" ; then
-
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version of $CC" >&5
-$as_echo_n "checking for version of $CC... " >&6; }
-       GCC_VERSION=`$CC -dumpversion`
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCC_VERSION" >&5
-$as_echo "$GCC_VERSION" >&6; }
-
-               GCC_MINOR_VERSION=`echo $GCC_VERSION | sed "s/^[0-9]\+\.//" | sed "s/\..*//"`
-       GCC_MAJOR_VERSION=`echo $GCC_VERSION | sed "s/\..*//"`
-               fi
-
-
-
-
-
-
-
-       if test "x$GCC_MAJOR_VERSION$GCC_MINOR_VERSION" = "x42" ; then
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ****************************************************************" >&5
-$as_echo "$as_me: WARNING: ****************************************************************" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** GCC version 4.2 warns about the inline keyword for no good **" >&5
-$as_echo "$as_me: WARNING: ** GCC version 4.2 warns about the inline keyword for no good **" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** reason but the maintainers do not see it as a bug.         **" >&5
-$as_echo "$as_me: WARNING: ** reason but the maintainers do not see it as a bug.         **" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995      **" >&5
-$as_echo "$as_me: WARNING: ** See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995      **" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Using -fgnu-inline to avoid this stupidity.                **" >&5
-$as_echo "$as_me: WARNING: ** Using -fgnu-inline to avoid this stupidity.                **" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ****************************************************************" >&5
-$as_echo "$as_me: WARNING: ****************************************************************" >&2;}
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fgnu89-inline" >&5
-$as_echo_n "checking if $CC accepts -fgnu89-inline... " >&6; }
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wpointer-arith" >&5
+$as_echo_n "checking if $CC accepts -Wpointer-arith... " >&6; }
        ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-fgnu89-inline"
+       CFLAGS="-Wpointer-arith"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19016,7 +19805,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -fgnu89-inline"
+                       CFLAGS="$ac_add_cflags__old_cflags -Wpointer-arith"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
-               fi
-
-       CFLAGS="$CFLAGS -Wall"
-       CXXFLAGS="$CXXFLAGS -Wall"
-
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wextra" >&5
-$as_echo_n "checking if $CC accepts -Wextra... " >&6; }
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -funsigned-char" >&5
+$as_echo_n "checking if $CC accepts -funsigned-char... " >&6; }
        ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-Wextra"
+       CFLAGS="-funsigned-char"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19051,7 +19835,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -Wextra"
+                       CFLAGS="$ac_add_cflags__old_cflags -funsigned-char"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Wpointer-arith" >&5
+$as_echo_n "checking if $CXX accepts -Wpointer-arith... " >&6; }
+
+       ac_add_cxxflags__old_cxxflags="$CXXFLAGS"
+       CXXFLAGS="-Wpointer-arith"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <cstdio>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags -Wpointer-arith"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -funsigned-char" >&5
+$as_echo_n "checking if $CXX accepts -funsigned-char... " >&6; }
+
+       ac_add_cxxflags__old_cxxflags="$CXXFLAGS"
+       CXXFLAGS="-funsigned-char"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <cstdio>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags -funsigned-char"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
        ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -19106,10 +19952,11 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wdeclaration-after-statement" >&5
-$as_echo_n "checking if $CC accepts -Wdeclaration-after-statement... " >&6; }
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -D_FORTIFY_SOURCE=2" >&5
+$as_echo_n "checking if $CC accepts -D_FORTIFY_SOURCE=2... " >&6; }
        ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-Wdeclaration-after-statement"
+       CFLAGS="-D_FORTIFY_SOURCE=2"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19126,7 +19973,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -Wdeclaration-after-statement"
+                       CFLAGS="$ac_add_cflags__old_cflags -D_FORTIFY_SOURCE=2"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wpointer-arith" >&5
-$as_echo_n "checking if $CC accepts -Wpointer-arith... " >&6; }
-       ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-Wpointer-arith"
+
+       if test x$enable_stack_smash_protection = "xyes" ; then
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports stack smash protection" >&5
+$as_echo_n "checking if $CC supports stack smash protection... " >&6; }
+       xiph_stack_check_old_cflags="$CFLAGS"
+       SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4"
+       CFLAGS=$SSP_FLAGS
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19156,24 +20007,31 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -Wpointer-arith"
+                       CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags"
+                       CFLAGS="$xiph_stack_check_old_cflags"
 
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -funsigned-char" >&5
-$as_echo_n "checking if $CC accepts -funsigned-char... " >&6; }
-       ac_add_cflags__old_cflags="$CFLAGS"
-       CFLAGS="-funsigned-char"
+               ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX supports stack smash protection" >&5
+$as_echo_n "checking if $CXX supports stack smash protection... " >&6; }
+       xiph_stack_check_old_cflags="$CFLAGS"
+       SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4"
+       CFLAGS=$SSP_FLAGS
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-                       #include <stdio.h>
+                       #include <cstdio>
 
 int
 main ()
@@ -19183,23 +20041,25 @@ puts("Hello, World!"); return 0;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags -funsigned-char"
+                       CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS"
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-                       CFLAGS="$ac_add_cflags__old_cflags"
+                       CFLAGS="$xiph_stack_check_old_cflags"
 
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-       if test x$enable_gcc_werror = "xyes" ; then
-               CFLAGS="-Werror $CFLAGS"
-               CXXFLAGS="-Werror $CXXFLAGS"
                fi
 
        if test x$enable_test_coverage = "xyes" ; then
@@ -19236,9 +20096,9 @@ rm -f core conftest.err conftest.$ac_objext \
 
                fi
 
-       CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef "
-       # -Wundef -Wmissing-declarations -Winline -Wconversion"
-       CXXFLAGS="$CXXFLAGS -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef "
+       CFLAGS="$CFLAGS     -Wcast-align -Wcast-qual -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef -Wuninitialized -Winit-self -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Waggregate-return"
+       # -Winline -Wconversion  -Wunreachable-code"
+       CXXFLAGS="$CXXFLAGS -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef -Wuninitialized -Winit-self"
 
        if test "x$enable_gcc_opt" = "xno" ; then
                temp_CFLAGS=`echo $CFLAGS | $SED "s/O2/O0/"`
@@ -19260,9 +20120,7 @@ $as_echo "$as_me: WARNING: *** Compiler optimisations switched off. ***" >&2;}
                        SHLIB_VERSION_ARG="-Wl,--version-script=\$(srcdir)/Symbols.gnu-binutils"
                        ;;
                mingw*)
-                       # Linker flag '-Wl,--out-implib' does not work with mingw cross compiler
-                       # so we don't use it here.
-                       SHLIB_VERSION_ARG="-Wl,\$(srcdir)/libsndfile-1.def"
+                       SHLIB_VERSION_ARG="-Wc,-static-libgcc -Wl,\$(srcdir)/libsndfile-1.def"
                        win32_target_dll=1
                        if test x"$enable_shared" = xno ; then
                                win32_target_dll=0
@@ -19281,6 +20139,84 @@ $as_echo "$as_me: WARNING: *** Compiler optimisations switched off. ***" >&2;}
        COMPILER_IS_GCC=1
        fi
 
+if test x$enable_werror = "xyes" ; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror" >&5
+$as_echo_n "checking if $CC accepts -Werror... " >&6; }
+       ac_add_cflags__old_cflags="$CFLAGS"
+       CFLAGS="-Werror"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <stdio.h>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags -Werror"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CFLAGS="$ac_add_cflags__old_cflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+       ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX accepts -Werror" >&5
+$as_echo_n "checking if $CXX accepts -Werror... " >&6; }
+
+       ac_add_cxxflags__old_cxxflags="$CXXFLAGS"
+       CXXFLAGS="-Werror"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                       #include <cstdio>
+
+int
+main ()
+{
+puts("Hello, World!"); return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags -Werror"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       CXXFLAGS="$ac_add_cxxflags__old_cxxflags"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+       fi
+
+
 
 cat >>confdefs.h <<_ACEOF
 #define WIN32_TARGET_DLL ${win32_target_dll}
@@ -19301,12 +20237,27 @@ if test x"$CFLAGS" = x ; then
 
 HOST_TRIPLET="${host_cpu}-${host_vendor}-${host_os}"
 
+
+cat >>confdefs.h <<_ACEOF
+#define HOST_TRIPLET "${HOST_TRIPLET}"
+_ACEOF
+
+
 if test "$HOST_TRIPLET" = "x86_64-w64-mingw32" ; then
        OS_SPECIFIC_LINKS=" -static-libgcc $OS_SPECIFIC_LINKS"
        fi
 
 WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"`
 
+
+if test "$enable_static" = no ; then
+       SRC_BINDIR=src/.libs/
+       TEST_BINDIR=tests/.libs/
+else
+       SRC_BINDIR=src/
+       TEST_BINDIR=tests/
+       fi
+
 #-------------------------------------------------------------------------------
 
 
@@ -19330,7 +20281,9 @@ WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"`
 
 
 
-ac_config_files="$ac_config_files src/Makefile man/Makefile examples/Makefile tests/Makefile regtest/Makefile M4/Makefile doc/Makefile Win32/Makefile Octave/Makefile programs/Makefile Makefile src/version-metadata.rc tests/test_wrapper.sh tests/pedantic-header-test.sh doc/libsndfile.css build-test-tarball.mk libsndfile.spec sndfile.pc src/sndfile.h"
+
+
+ac_config_files="$ac_config_files src/Makefile man/Makefile examples/Makefile tests/Makefile regtest/Makefile M4/Makefile doc/Makefile Win32/Makefile Octave/Makefile programs/Makefile Makefile src/version-metadata.rc tests/test_wrapper.sh tests/pedantic-header-test.sh doc/libsndfile.css Scripts/build-test-tarball.mk libsndfile.spec sndfile.pc src/sndfile.h echo-install-dirs"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -19441,6 +20394,14 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -19783,16 +20744,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -19852,28 +20813,16 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -19894,8 +20843,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libsndfile $as_me 1.0.25, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+This file was extended by libsndfile $as_me 1.0.26, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -19961,11 +20910,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-libsndfile config.status 1.0.25
-configured by $0, generated by GNU Autoconf 2.68,
+libsndfile config.status 1.0.26
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -20056,7 +21005,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -20098,6 +21047,7 @@ pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
 host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
 host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
 host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
@@ -20180,7 +21130,6 @@ with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
 allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
 no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
 hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
 hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
@@ -20278,8 +21227,6 @@ no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quo
 no_undefined_flag_RC='`$ECHO "$no_undefined_flag_RC" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_flag_spec_RC='`$ECHO "$hardcode_libdir_flag_spec_RC" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld_RC='`$ECHO "$hardcode_libdir_flag_spec_ld_RC" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
 hardcode_libdir_separator_RC='`$ECHO "$hardcode_libdir_separator_RC" | $SED "$delay_single_quote_subst"`'
 hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
@@ -20340,6 +21287,7 @@ _LTECHO_EOF'
 # Quote evaled strings.
 for var in SHELL \
 ECHO \
+PATH_SEPARATOR \
 SED \
 GREP \
 EGREP \
@@ -20390,7 +21338,6 @@ with_gnu_ld \
 allow_undefined_flag \
 no_undefined_flag \
 hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
 hardcode_libdir_separator \
 exclude_expsyms \
 include_expsyms \
@@ -20439,8 +21386,6 @@ no_undefined_flag_CXX \
 no_undefined_flag_RC \
 hardcode_libdir_flag_spec_CXX \
 hardcode_libdir_flag_spec_RC \
-hardcode_libdir_flag_spec_ld_CXX \
-hardcode_libdir_flag_spec_ld_RC \
 hardcode_libdir_separator_CXX \
 hardcode_libdir_separator_RC \
 exclude_expsyms_CXX \
     "tests/test_wrapper.sh") CONFIG_FILES="$CONFIG_FILES tests/test_wrapper.sh" ;;
     "tests/pedantic-header-test.sh") CONFIG_FILES="$CONFIG_FILES tests/pedantic-header-test.sh" ;;
     "doc/libsndfile.css") CONFIG_FILES="$CONFIG_FILES doc/libsndfile.css" ;;
-    "build-test-tarball.mk") CONFIG_FILES="$CONFIG_FILES build-test-tarball.mk" ;;
+    "Scripts/build-test-tarball.mk") CONFIG_FILES="$CONFIG_FILES Scripts/build-test-tarball.mk" ;;
     "libsndfile.spec") CONFIG_FILES="$CONFIG_FILES libsndfile.spec" ;;
     "sndfile.pc") CONFIG_FILES="$CONFIG_FILES sndfile.pc" ;;
     "src/sndfile.h") CONFIG_FILES="$CONFIG_FILES src/sndfile.h" ;;
+    "echo-install-dirs") CONFIG_FILES="$CONFIG_FILES echo-install-dirs" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
@@ -21173,7 +22119,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
 
   case $ac_file$ac_mode in
     "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -21186,7 +22132,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -21220,21 +22166,19 @@ $as_echo X"$mf" |
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`$as_dirname -- "$file" ||
@@ -21288,8 +22232,8 @@ $as_echo X"$file" |
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 #
 #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 #   This file is part of GNU Libtool.
@@ -21343,6 +22287,9 @@ SHELL=$lt_SHELL
 # An echo program that protects backslashes.
 ECHO=$lt_ECHO
 
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
 # The host system.
 host_alias=$host_alias
 host=$host
@@ -21644,10 +22591,6 @@ no_undefined_flag=$lt_no_undefined_flag
 # This must work even if \$libdir does not exist
 hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
@@ -21990,10 +22933,6 @@ no_undefined_flag=$lt_no_undefined_flag_CXX
 # This must work even if \$libdir does not exist
 hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
-
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
@@ -22147,10 +23086,6 @@ no_undefined_flag=$lt_no_undefined_flag_RC
 # This must work even if \$libdir does not exist
 hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
 
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
-
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
 
@@ -22266,7 +23201,7 @@ fi
 
 
 # Make sure these are executable.
-chmod u+x tests/test_wrapper.sh build-test-tarball.mk
+chmod u+x tests/test_wrapper.sh Scripts/build-test-tarball.mk echo-install-dirs
 
 #====================================================================================
 
@@ -22310,10 +23245,12 @@ if test -z "$PKG_CONFIG" ; then
        echo
        fi
 
+echo "  Tools :"
+echo
+echo "    Compiler is Clang : ................... ${mn_cv_c_compiler_clang}"
+echo "    Compiler is GCC : ..................... ${ac_cv_c_compiler_gnu}"
+
 if test x$ac_cv_c_compiler_gnu = xyes ; then
-       echo "  Tools :"
-       echo
-       echo "    Compiler is GCC : ..................... ${ac_cv_c_compiler_gnu}"
        echo "    GCC version : ......................... ${GCC_VERSION}"
        if test $GCC_MAJOR_VERSION -lt 3 ; then
                echo "\n"
@@ -22322,38 +23259,13 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
                echo "    ** Compile with GCC version 3.X or above to avoid this problem."
                fi
        fi
+echo "    Sanitizer enabled : ................... ${enable_sanitizer:-no}"
+echo "    Stack smash protection : .............. ${enable_stack_smash_protection:-no}"
 
-if test $libdir = "\${exec_prefix}/lib" ; then
-       libdir="$prefix/lib"
-       fi
-
-if test $bindir = "\${exec_prefix}/bin" ; then
-       bindir="$prefix/bin"
-       fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
-  Installation directories :
-
-    Library directory : ................... $libdir
-    Program directory : ................... $bindir
-    Pkgconfig directory : ................. $libdir/pkgconfig
-    HTML docs directory : ................. $htmldocdir
-" >&5
-$as_echo "
-  Installation directories :
+./echo-install-dirs
 
-    Library directory : ................... $libdir
-    Program directory : ................... $bindir
-    Pkgconfig directory : ................. $libdir/pkgconfig
-    HTML docs directory : ................. $htmldocdir
-" >&6; }
-
-if test x$prefix != "x/usr" ; then
-       echo "Compiling some other packages against libsndfile may require"
-       echo "the addition of '$libdir/pkgconfig' to the"
-       echo "PKG_CONFIG_PATH environment variable."
-       echo
-       fi
+# Remove symlink created by Scripts/android-configure.sh.
+test -h gdbclient && rm -f gdbclient
 
 (cd src && make genfiles)
 (cd tests && make genfiles)
index 20ba55a..ef14780 100644 (file)
@@ -1,13 +1,14 @@
-# Copyright (C) 1999-2011 Erik de Castro Lopo (erikd AT mega-nerd DOT com).
+# Copyright (C) 1999-2015  Erik de Castro Lopo <erikd@mega-nerd.com>.
 
 dnl Require autoconf version
 AC_PREREQ(2.57)
 
-AC_INIT([libsndfile],[1.0.25],[sndfile@mega-nerd.com],
+AC_INIT([libsndfile],[1.0.26],[sndfile@mega-nerd.com],
                [libsndfile],[http://www.mega-nerd.com/libsndfile/])
 
 # Put config stuff in Cfg.
 AC_CONFIG_AUX_DIR(Cfg)
+AC_CONFIG_MACRO_DIR([M4])
 
 AC_CONFIG_SRCDIR([src/sndfile.c])
 AC_CANONICAL_TARGET([])
@@ -15,17 +16,19 @@ AC_CANONICAL_TARGET([])
 AC_CONFIG_MACRO_DIR([M4])
 AC_CONFIG_HEADERS([src/config.h])
 
-AM_INIT_AUTOMAKE($PACKAGE_NAME,$PACKAGE_VERSION)
-AM_SILENT_RULES([yes])
-
-dnl Add parameters for aclocal
-AC_SUBST(ACLOCAL_AMFLAGS, "-I M4")
+AM_INIT_AUTOMAKE
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 
 AC_LANG([C])
 
-AC_PROG_CC
+AC_PROG_CC_STDC
+AC_USE_SYSTEM_EXTENSIONS
 AM_PROG_CC_C_O
 AC_PROG_CXX
+
+MN_C_COMPILER_IS_CLANG
+MN_GCC_REALLY_IS_GCC
+
 AC_PROG_SED
 
 # Do not check for F77.
@@ -34,12 +37,13 @@ define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl
 AM_PROG_LIBTOOL
 LT_PROG_RC
 
-AC_CHECK_PROG(HAVE_AUTOGEN, autogen, yes, no)
-AC_CHECK_PROG(HAVE_WINE, wine, yes, no)
-
 AC_PROG_INSTALL
 AC_PROG_LN_S
 
+AC_CHECK_PROG(HAVE_AUTOGEN, autogen, yes, no)
+AC_CHECK_PROG(HAVE_WINE, wine, yes, no)
+AC_CHECK_PROG(HAVE_XCODE_SELECT, xcode-select, yes, no)
+
 #------------------------------------------------------------------------------------
 # Rules for library version information:
 #
@@ -83,19 +87,6 @@ AM_CONDITIONAL([LINUX_MINGW_CROSS_TEST],
        [test "$build_os:$target_os:$host_os:$HAVE_WINE" = "linux-gnu:mingw32msvc:mingw32msvc:yes"])
 
 #====================================================================================
-# Check for support of the struct hack.
-
-MN_C99_FLEXIBLE_ARRAY
-
-if test x$ac_cv_c99_flexible_array = xyes ; then
-       AC_DEFINE([HAVE_FLEXIBLE_ARRAY],1, [Set to 1 if the compile supports the struct hack.])
-else
-       AC_MSG_WARN([[*** This compiler does not support the 1999 ISO C Standard ***]])
-       AC_MSG_WARN([[*** feature known as the flexible array struct member.     ***]])
-       AC_DEFINE([HAVE_FLEXIBLE_ARRAY],0)
-       fi
-
-#====================================================================================
 # Couple of initializations here. Fill in real values later.
 
 SHLIB_VERSION_ARG=""
@@ -112,8 +103,11 @@ if test x$enable_experimental = xyes ; then
        fi
 AC_DEFINE_UNQUOTED([ENABLE_EXPERIMENTAL_CODE],${EXPERIMENTAL_CODE}, [Set to 1 to enable experimental code.])
 
-AC_ARG_ENABLE(gcc-werror,
-       AC_HELP_STRING([--enable-gcc-werror], [enable -Werror in all Makefiles]))
+AC_ARG_ENABLE(werror,
+       AC_HELP_STRING([--enable-werror], [enable -Werror in all Makefiles]))
+
+AC_ARG_ENABLE(stack-smash-protection,
+       AC_HELP_STRING([--enable-stack-smash-protection], [Enable GNU GCC stack smash protection]))
 
 AC_ARG_ENABLE(gcc-pipe,
        AC_HELP_STRING([--disable-gcc-pipe], [disable gcc -pipe option]))
@@ -163,44 +157,48 @@ AC_CHECK_SIZEOF(long long,8)
 # Unfortunately there is more than one way of ensuring this so need to do some
 # pretty rigourous testing here.
 
-unset ac_cv_sizeof_off_t
+# Check for common 64 bit file offset types.
+AC_CHECK_SIZEOF(off_t,1)
+AC_CHECK_SIZEOF(loff_t,1)
+AC_CHECK_SIZEOF(off64_t,1)
+
+if test "$enable_largefile:$ac_cv_sizeof_off_t" = "no:8" ; then
+       echo
+       echo "Error : Cannot disable large file support because sizeof (off_t) == 8."
+       echo
+       exit 1
+       fi
 
-AC_CHECK_SIZEOF(off_t,1)       # Fake default value.
 
 case "$host_os" in
-       mingw32msvc | mingw32)
+       mingw32*)
                TYPEOF_SF_COUNT_T="__int64"
                SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
                SIZEOF_SF_COUNT_T=8
                AC_DEFINE([__USE_MINGW_ANSI_STDIO],1,[Set to 1 to use C99 printf/snprintf in MinGW.])
                ;;
        *)
+               SIZEOF_SF_COUNT_T=0
                if test "x$ac_cv_sizeof_off_t" = "x8" ; then
                        # If sizeof (off_t) is 8, no further checking is needed.
                        TYPEOF_SF_COUNT_T="int64_t"
                        SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
                        SIZEOF_SF_COUNT_T=8
+               elif test "x$ac_cv_sizeof_loff_t" = "x8" ; then
+                       TYPEOF_SF_COUNT_T="int64_t"
+                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+                       SIZEOF_SF_COUNT_T=8
+               elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then
+                       TYPEOF_SF_COUNT_T="int64_t"
+                       SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
+                       SIZEOF_SF_COUNT_T=8
                else
-                       # Check for common 64 bit file offset types.
-                       AC_CHECK_SIZEOF(loff_t,1)       # Fake default value.
-                       AC_CHECK_SIZEOF(off64_t,1)      # Fake default value.
-
-                       TYPEOF_SF_COUNT_T="unknown"
-                       if test "x$ac_cv_sizeof_loff_t" = "x8" ; then
-                               TYPEOF_SF_COUNT_T="int64_t"
-                               SIZEOF_SF_COUNT_T=8
-                       elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then
-                               TYPEOF_SF_COUNT_T="int64_t"
-                               SIZEOF_SF_COUNT_T=8
-                               fi
-
                        # Save the old sizeof (off_t) value  and then unset it to see if it
                        # changes when Large File Support is enabled.
-
                        pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t
                        unset ac_cv_sizeof_off_t
 
-                       AC_SYS_EXTRA_LARGEFILE
+                       AC_SYS_LARGEFILE
 
                        if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then
                                ac_cv_sys_largefile_CFLAGS=""
@@ -212,15 +210,11 @@ case "$host_os" in
                                ac_cv_sys_largefile_LIBS=""
                                fi
 
-                       AC_CHECK_SIZEOF(off_t,1)        # Fake default value.
+                       AC_CHECK_SIZEOF(off_t,1)
 
                        if test "x$ac_cv_sizeof_off_t" = "x8" ; then
                                TYPEOF_SF_COUNT_T="int64_t"
                                SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL"
-                       elif test "x$ac_cv_sizeof_off_t" = "x$pre_largefile_sizeof_off_t" ; then
-                               AC_MSG_WARN([[This machine does not seem to support 64 bit file offsets.]])
-                               TYPEOF_SF_COUNT_T="off_t"
-                               SIZEOF_SF_COUNT_T=$ac_cv_sizeof_off_t
                        elif test "x$TYPEOF_SF_COUNT_T" = "xunknown" ; then
                                echo
                                echo "*** The configure process has determined that this system is capable"
@@ -266,8 +260,8 @@ AC_DEFINE_UNQUOTED(WORDS_BIGENDIAN, ${ac_cv_c_big_endian},
 # Check for functions.
 
 AC_CHECK_FUNCS(malloc calloc realloc free)
-AC_CHECK_FUNCS(open read write lseek pread pwrite)
-AC_CHECK_FUNCS(fstat ftruncate fsync)
+AC_CHECK_FUNCS(open read write lseek lseek64)
+AC_CHECK_FUNCS(fstat fstat64 ftruncate fsync)
 AC_CHECK_FUNCS(snprintf vsnprintf)
 AC_CHECK_FUNCS(gmtime gmtime_r localtime localtime_r gettimeofday)
 AC_CHECK_FUNCS(mmap getpagesize)
@@ -275,7 +269,7 @@ AC_CHECK_FUNCS(setlocale)
 AC_CHECK_FUNCS(pipe waitpid)
 
 AC_CHECK_LIB([m],floor)
-AC_CHECK_FUNCS(floor ceil fmod)
+AC_CHECK_FUNCS(floor ceil fmod lround)
 
 MN_C99_FUNC_LRINT
 MN_C99_FUNC_LRINTF
@@ -303,15 +297,16 @@ EXTERNAL_LIBS=""
 
 # Check for pkg-config outside the if statement.
 PKG_PROG_PKG_CONFIG
+m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig))
 
 if test -n "$PKG_CONFIG" ; then
        if test x$enable_external_libs = xno ; then
                AC_MSG_WARN([[*** External libs (FLAC, Ogg, Vorbis) disabled. ***]])
        else
-               PKG_CHECK_MOD_VERSION(FLAC, flac >= 1.2.1, ac_cv_flac=yes, ac_cv_flac=no)
+               PKG_CHECK_MOD_VERSION(FLAC, flac >= 1.3.1, ac_cv_flac=yes, ac_cv_flac=no)
 
                # Make sure the FLAC_CFLAGS value is sane.
-               FLAC_CFLAGS=`echo $FLAC_CLFAGS | $SED "s/FLAC$//"`
+               FLAC_CFLAGS=`echo $FLAC_CFLAGS | $SED "s|include/FLAC|include|"`
 
                PKG_CHECK_MOD_VERSION(OGG, ogg >= 1.1.3, ac_cv_ogg=yes, ac_cv_ogg=no)
 
@@ -334,8 +329,8 @@ if test -n "$PKG_CONFIG" ; then
                HAVE_EXTERNAL_LIBS=1
                enable_external_libs=yes
 
-               EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
-               EXTERNAL_LIBS="$FLAC_LIBS $VORBISENC_LIBS $SPEEX_LIBS"
+               EXTERNAL_CFLAGS="$FLAC_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS"
+               EXTERNAL_LIBS="$FLAC_LIBS $OGG_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS "
        else
                echo
                AC_MSG_WARN([[*** One or more of the external libraries (ie libflac, libogg and]])
@@ -389,26 +384,35 @@ AC_DEFINE_UNQUOTED(CPU_CLIPS_NEGATIVE, ${ac_cv_c_clip_negative},
 OS_SPECIFIC_CFLAGS=""
 OS_SPECIFIC_LINKS=""
 os_is_win32=0
-os_is_macosx=0
+os_is_openbsd=0
 use_windows_api=0
+osx_darwin_version=0
 
 case "$host_os" in
        darwin* | rhapsody*)
-               os_is_macosx=1
-               OS_SPECIFIC_CFLAGS="-I/Developer/Headers/FlatCarbon"
-               OS_SPECIFIC_LINKS="-framework CoreAudio"
+               osx_darwin_version=$(echo "$host_os" | sed 's/\..*//;s/darwin//g')
+               if test x$HAVE_XCODE_SELECT = xyes ; then
+                       developer_path=`xcode-select --print-path`
+               else
+                       developer_path="/Developer"
+                       fi
+               OS_SPECIFIC_CFLAGS="-I${developer_path}/Headers/FlatCarbon"
+               OS_SPECIFIC_LINKS="-framework CoreAudio -framework AudioToolbox -framework CoreFoundation"
                ;;
        mingw*)
                os_is_win32=1
                use_windows_api=1
                OS_SPECIFIC_LINKS="-lwinmm"
                ;;
+       openbsd*)
+               os_is_openbsd=1
+               ;;
        esac
 
 AC_DEFINE_UNQUOTED(OS_IS_WIN32, ${os_is_win32}, [Set to 1 if compiling for Win32])
-AC_DEFINE_UNQUOTED(OS_IS_MACOSX, ${os_is_macosx}, [Set to 1 if compiling for MacOSX])
+AC_DEFINE_UNQUOTED(OS_IS_OPENBSD, ${os_is_openbsd}, [Set to 1 if compiling for OpenBSD])
 AC_DEFINE_UNQUOTED(USE_WINDOWS_API, ${use_windows_api}, [Set to 1 to use the native windows API])
-
+AC_DEFINE_UNQUOTED(OSX_DARWIN_VERSION, ${osx_darwin_version}, [The darwin version, no-zero is valid])
 AM_CONDITIONAL(USE_WIN_VERSION_FILE, test ${use_windows_api} -eq 1)
 
 #====================================================================================
@@ -428,22 +432,24 @@ if test x$enable_alsa != xno ; then
 # Check for OpenBSD's sndio.
 
 SNDIO_LIBS=""
-AC_CHECK_HEADERS(sndio.h)
-if test x$ac_cv_header_sndio_h = xyes ; then
-       SNDIO_LIBS="-lsndio"
-       fi
+HAVE_SNDIO_H=0
+case "$host_os" in
+       openbsd*)
+               AC_CHECK_HEADERS(sndio.h)
+               if test x$ac_cv_header_sndio_h = xyes ; then
+                       SNDIO_LIBS="-lsndio"
+                       HAVE_SNDIO_H=1
+                       fi
+               ;;
+       *)
+               ;;
+       esac
+
+AC_DEFINE_UNQUOTED([HAVE_SNDIO_H],${HAVE_SNDIO_H},[Set to 1 if <sndio.h> is available.])
 
 #====================================================================================
 # Test for sanity when cross-compiling.
 
-if test x$cross_compiling = xyes ; then
-       AC_MSG_WARN([[******************************************************************]])
-       AC_MSG_WARN([[*** We are cross-compiling, so have to assume sizeof (short) == 2 ]])
-       AC_MSG_WARN([[*** and sizeof (int) == 4. If this is not the case there is no    ]])
-       AC_MSG_WARN([[*** chance of this working. Please contact the mantainer.         ]])
-       AC_MSG_WARN([[******************************************************************]])
-       fi
-
 if test $ac_cv_sizeof_short != 2 ; then
        AC_MSG_WARN([[******************************************************************]])
        AC_MSG_WARN([[*** sizeof (short) != 2.                                          ]])
@@ -476,14 +482,6 @@ if test x"$ac_cv_prog_HAVE_AUTOGEN" = "xno" ; then
 #====================================================================================
 # Settings for the HTML documentation.
 
-htmldocdir=$prefix/share/doc/libsndfile1-dev/html
-
-if test $prefix = "NONE" ; then
-       htmldocdir=/usr/local/share/doc/libsndfile1-dev/html
-else
-       htmldocdir=$prefix/share/doc/libsndfile1-dev/html
-       fi
-
 if test x$enable_bow_docs = "xyes" ; then
        HTML_BGCOLOUR="white"
        HTML_FGCOLOUR="black"
@@ -517,18 +515,22 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
        CXXFLAGS="$CXXFLAGS -Wall"
 
        MN_ADD_CFLAGS([-Wextra])
+       MN_ADD_CFLAGS([-Wdeclaration-after-statement])
+       MN_ADD_CFLAGS([-Wpointer-arith])
+       MN_ADD_CFLAGS([-funsigned-char])
 
        AC_LANG_PUSH([C++])
        MN_ADD_CXXFLAGS([-Wextra])
+       MN_ADD_CXXFLAGS([-Wpointer-arith])
+       MN_ADD_CXXFLAGS([-funsigned-char])
        AC_LANG_POP([C++])
 
-       MN_ADD_CFLAGS([-Wdeclaration-after-statement])
-       MN_ADD_CFLAGS([-Wpointer-arith])
-       MN_ADD_CFLAGS([-funsigned-char])
 
-       if test x$enable_gcc_werror = "xyes" ; then
-               CFLAGS="-Werror $CFLAGS"
-               CXXFLAGS="-Werror $CXXFLAGS"
+       MN_ADD_CFLAGS([-D_FORTIFY_SOURCE=2])
+
+       if test x$enable_stack_smash_protection = "xyes" ; then
+               XIPH_GCC_STACK_PROTECTOR
+               XIPH_GXX_STACK_PROTECTOR
                fi
 
        if test x$enable_test_coverage = "xyes" ; then
@@ -536,9 +538,9 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
                MN_ADD_CFLAGS([-coverage])
                fi
 
-       CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef "
-       # -Wundef -Wmissing-declarations -Winline -Wconversion"
-       CXXFLAGS="$CXXFLAGS -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef "
+       CFLAGS="$CFLAGS     -Wcast-align -Wcast-qual -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef -Wuninitialized -Winit-self -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Waggregate-return"
+       # -Winline -Wconversion  -Wunreachable-code"
+       CXXFLAGS="$CXXFLAGS -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef -Wuninitialized -Winit-self"
 
        if test "x$enable_gcc_opt" = "xno" ; then
                temp_CFLAGS=`echo $CFLAGS | $SED "s/O2/O0/"`
@@ -559,9 +561,7 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
                        SHLIB_VERSION_ARG="-Wl,--version-script=\$(srcdir)/Symbols.gnu-binutils"
                        ;;
                mingw*)
-                       # Linker flag '-Wl,--out-implib' does not work with mingw cross compiler
-                       # so we don't use it here.
-                       SHLIB_VERSION_ARG="-Wl,\$(srcdir)/libsndfile-1.def"
+                       SHLIB_VERSION_ARG="-Wc,-static-libgcc -Wl,\$(srcdir)/libsndfile-1.def"
                        win32_target_dll=1
                        if test x"$enable_shared" = xno ; then
                                win32_target_dll=0
@@ -580,6 +580,15 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
        COMPILER_IS_GCC=1
        fi
 
+if test x$enable_werror = "xyes" ; then
+       MN_ADD_CFLAGS([-Werror])
+
+       AC_LANG_PUSH([C++])
+       MN_ADD_CXXFLAGS([-Werror])
+       AC_LANG_POP([C++])
+       fi
+
+
 AC_DEFINE_UNQUOTED([WIN32_TARGET_DLL], ${win32_target_dll}, [Set to 1 if windows DLL is being built.])
 AC_DEFINE_UNQUOTED([COMPILER_IS_GCC], ${COMPILER_IS_GCC}, [Set to 1 if the compile is GNU GCC.])
 
@@ -592,17 +601,27 @@ if test x"$CFLAGS" = x ; then
 
 HOST_TRIPLET="${host_cpu}-${host_vendor}-${host_os}"
 
+AC_DEFINE_UNQUOTED([HOST_TRIPLET], "${HOST_TRIPLET}", [The host triplet of the compiled binary.])
+
 if test "$HOST_TRIPLET" = "x86_64-w64-mingw32" ; then
        OS_SPECIFIC_LINKS=" -static-libgcc $OS_SPECIFIC_LINKS"
        fi
 
 WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"`
 
+
+if test "$enable_static" = no ; then
+       SRC_BINDIR=src/.libs/
+       TEST_BINDIR=tests/.libs/
+else
+       SRC_BINDIR=src/
+       TEST_BINDIR=tests/
+       fi
+
 #-------------------------------------------------------------------------------
 
 AC_SUBST(HOST_TRIPLET)
 
-AC_SUBST(htmldocdir)
 AC_SUBST(HTML_BGCOLOUR)
 AC_SUBST(HTML_FGCOLOUR)
 
@@ -611,6 +630,7 @@ AC_SUBST(SHARED_VERSION_INFO)
 AC_SUBST(CLEAN_VERSION)
 AC_SUBST(WIN_RC_VERSION)
 
+AC_SUBST(HAVE_EXTERNAL_LIBS)
 AC_SUBST(OS_SPECIFIC_CFLAGS)
 AC_SUBST(OS_SPECIFIC_LINKS)
 AC_SUBST(ALSA_LIBS)
@@ -618,6 +638,8 @@ AC_SUBST(SNDIO_LIBS)
 
 AC_SUBST(EXTERNAL_CFLAGS)
 AC_SUBST(EXTERNAL_LIBS)
+AC_SUBST(SRC_BINDIR)
+AC_SUBST(TEST_BINDIR)
 
 dnl The following line causes the libtool distributed with the source
 dnl to be replaced if the build system has a more recent version.
@@ -628,13 +650,14 @@ AC_CONFIG_FILES([ \
        M4/Makefile doc/Makefile Win32/Makefile Octave/Makefile programs/Makefile \
        Makefile \
        src/version-metadata.rc tests/test_wrapper.sh tests/pedantic-header-test.sh \
-       doc/libsndfile.css build-test-tarball.mk libsndfile.spec sndfile.pc \
+       doc/libsndfile.css Scripts/build-test-tarball.mk libsndfile.spec sndfile.pc \
        src/sndfile.h \
+       echo-install-dirs
        ])
 AC_OUTPUT
 
 # Make sure these are executable.
-chmod u+x tests/test_wrapper.sh build-test-tarball.mk
+chmod u+x tests/test_wrapper.sh Scripts/build-test-tarball.mk echo-install-dirs
 
 #====================================================================================
 
@@ -663,10 +686,12 @@ if test -z "$PKG_CONFIG" ; then
        echo
        fi
 
+echo "  Tools :"
+echo
+echo "    Compiler is Clang : ................... ${mn_cv_c_compiler_clang}"
+echo "    Compiler is GCC : ..................... ${ac_cv_c_compiler_gnu}"
+
 if test x$ac_cv_c_compiler_gnu = xyes ; then
-       echo "  Tools :"
-       echo
-       echo "    Compiler is GCC : ..................... ${ac_cv_c_compiler_gnu}"
        echo "    GCC version : ......................... ${GCC_VERSION}"
        if test $GCC_MAJOR_VERSION -lt 3 ; then
                echo "\n"
@@ -675,30 +700,13 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
                echo "    ** Compile with GCC version 3.X or above to avoid this problem."
                fi
        fi
+echo "    Sanitizer enabled : ................... ${enable_sanitizer:-no}"
+echo "    Stack smash protection : .............. ${enable_stack_smash_protection:-no}"
 
-if test $libdir = "\${exec_prefix}/lib" ; then
-       libdir="$prefix/lib"
-       fi
-
-if test $bindir = "\${exec_prefix}/bin" ; then
-       bindir="$prefix/bin"
-       fi
-
-AC_MSG_RESULT([[
-  Installation directories :
-
-    Library directory : ................... $libdir
-    Program directory : ................... $bindir
-    Pkgconfig directory : ................. $libdir/pkgconfig
-    HTML docs directory : ................. $htmldocdir
-]])
+./echo-install-dirs
 
-if test x$prefix != "x/usr" ; then
-       echo "Compiling some other packages against libsndfile may require"
-       echo "the addition of '$libdir/pkgconfig' to the"
-       echo "PKG_CONFIG_PATH environment variable."
-       echo
-       fi
+# Remove symlink created by Scripts/android-configure.sh.
+test -h gdbclient && rm -f gdbclient
 
 (cd src && make genfiles)
 (cd tests && make genfiles)
diff --git a/doc/AUTHORS b/doc/AUTHORS
deleted file mode 100644 (file)
index b7e2232..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-The main author of libsndfile is Erik de Castro Lopo <erikd@mega-nerd.com>
-apart from code in the following directories:
-
- - src/GSM610 : Written by Jutta Degener <jutta@cs.tu-berlin.de> and Carsten
-   Bormann <cabo@cs.tu-berlin.de>. They should not be contacted in relation to
-   libsndfile or the GSM 6.10 code that is part of libsndfile. Their original
-   code can be found at:
-
-       http://kbs.cs.tu-berlin.de/~jutta/toast.html
-
- - src/G72x : Released by Sun Microsystems, Inc. to the public domain. Minor
-   modifications were required to integrate these files into libsndfile. The
-   changes are listed in src/G72x/ChangeLog.
-
diff --git a/doc/ChangeLog b/doc/ChangeLog
deleted file mode 100644 (file)
index cb29658..0000000
+++ /dev/null
@@ -1,9044 +0,0 @@
-2011-07-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * NEWS README configure.ac doc/*.html
-    Updates for 1.0.25.
-
-2011-07-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfconfig.h
-    Add handling for HAVE_SYS_WAIT_H.
-
-    * Makefile.am src/Makefile.am tests/Makefile.am
-    Add 'checkprograms' target.
-
-2011-07-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/sndfile.c
-    Purge SF_ASSERT macro. Use standard C assert instead.
-
-    * src/paf.c src/common.h src/sndfile.c
-    Fix for Secunia Advisory SA45125, heap overflow (heap gets overwritten with
-    byte value of 0) due to integer overflow if PAF file handler.
-
-    * src/ima_adpcm.c src/ms_adpcm.c src/paf.c
-    Use calloc instead of malloc followed by memset.
-
-    * tests/utils.tpl
-    Clean up use of memset.
-
-2011-07-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    Fix log message.
-
-    * tests/format_check_test.c
-    Fix compiler warnings.
-
-2011-07-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix error message for erro code SFE_ZERO_MINOR_FORMAT.
-
-    * tests/format_check_test.c
-    Add a test to for SF_FINFO format field validation.
-
-    * src/ogg.c src/ogg_vorbis.c src/ogg.h src/ogg_pcm.c src/ogg_speex.c
-        src/common.h src/Makefile.am
-    Move vorbis specific code to ogg_vorbis.c, add new files for handling PCM
-    and Speex codecs in an Ogg container. The later two are only enabled with
-    ENABLE_EXPERIMENTAL_CODE config variable.
-
-2011-06-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/strings.c
-    Clean up and refactor storage of SF_STR_SOFTWARE.
-
-2011-06-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in doc/api.html
-    Fix definition of SF_STR_LAST and update SF_STR_* related docs. Thanks to
-    Tim van der Molen for the patch.
-
-2011-06-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-interleave.c
-    Fix handling of argc. Thanks to Marius Hennecke.
-
-    * src/wav_w64.c
-    Accept broken WAV files with blockalign == 0. Thanks to Olivier Tristan for
-    providing example files.
-
-    * src/wav.c
-    Jump over 'FLLR' chunks.
-
-2011-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Fix -Wundef warning due to ENABLE_SNDFILE_WINDOWS_PROTOTYPES.
-
-    * configure.ac
-    Add -Wundef to CFLAGS.
-
-    * src/ogg.c
-    Fix -Wunder warning.
-
-2011-05-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Use int64_t instead of off_t when they are the same size.
-
-    * src/Makefile.am tests/Makefile.am
-    Use check_PROGRAMS instead of noinst_PROGRAMS where appropriate.
-
-2011-05-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Don't allow unknown and/or un-editable chunks to prevent the file from being
-    opened in SFM_RDWR mode.
-
-2011-04-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/format_check_test.c
-    Fix segfault in test program.
-
-2011-04-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/format_check_test.c
-    New test program to check to make sure that sf_open() and sf_check_format()
-    agree as to what is a valid program.
-
-    * tests/Makefile.am tests/test_wrapper.sh.in
-    Hook into build and test runner.
-
-    * src/sndfile.c
-    Fix some sf_format_check() problems. Thanks to Charles Van Winkle for the
-    notification.
-
-2011-04-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/caf.c
-    Add validation to size of 'data' chunk and fix size of written 'data'
-    chunk. Thanks to Michael Pruett for reporting this.
-
-2011-03-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/* tests/* programs/*
-    Fix a bunch of compiler warnings with gcc-4.6.
-
-2011-03-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/util.tpl
-    Add NOT macro to util.h.
-
-    * src/strings.c
-    Fix handling of SF_STR_SOFTWARE that resulted in a segfault due to calling
-    strlen() on an unterminated string. Thanks to Francois Thibaud for reporting
-    this problem.
-
-    * tests/string_test.c
-    Add test for SF_STR_SOFTWARE segfault bug.
-
-    * configure.ac
-    Sanitize FLAC_CFLAGS value supplied by pkg-config which returns a value of
-    '-I${includedir}/FLAC'. However FLAC also provides an include file
-    <assert.h> which clashes with the Standard C header of the same name. The
-    solution is strip the 'FLAC' part off the end and include all FLAC headers
-    as <FLAC/header.h>.
-
-    * configure.ac src/Makefile.am
-    Use non-recursive make in src/ directory.
-
-2011-03-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * NEWS README docs/*.html
-    Updates for 1.0.24 release.
-
-2011-03-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fix up usage of sed (should not assume GNU sed).
-
-    * M4/add_(c|cxx)flags.m4
-    Test flags in isolation.
-
-    * tests/cpp_test.cc
-    Fix a broken test (test segfaults). Report by Dave Flogeras.
-
-2011-03-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/common.[ch]
-    Add function program_name() which returns the program name minus the path
-    from argv [0].
-
-    * programs/*.c programs/Makefile.am
-    Use program_name() where appropriate. Fix build.
-
-2011-03-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    For u-law and A-law files, write an 18 byte 'fmt ' chunk instead of a 16
-    byte one. Win98 accepts files with a 16 but not 18 byte 'fmt' chunk. Later
-    version accept 18 byte but not 16 byte.
-
-2011-03-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Add examples for question 12.
-
-    * doc/libsndfile.css.in
-    Add tweaks for h4 element.
-
-    * doc/api.html
-    Add documentation for virtual I/O functionality. Thanks to Uli Franke.
-
-    * tests/util.tpl
-    Add static inline functions sf_info_clear() and sf_info_setup().
-
-    * tests/(alaw|dwvw|ulaw)_test.c
-    Use functions sf_info_clear() and sf_info_setup().
-
-2011-03-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fail more gracefully if pkg-config is missing. Suggestion from Brian
-    Willoughby.
-
-2011-02-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Use size_t instead of int for size params with varargs.
-
-2011-02-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Update supported platforms with more Debian platforms and Android.
-
-2011-01-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add an LPCWSTR version of the SndfileHandle constructor to the SndfileHandle
-    class definition. Thanks to Eric Eizenman for pointing out this was missing.
-
-    * tests/cpp_test.cc
-    Add test for LPCWSTR version of the SndfileHandle constructor.
-
-2011-01-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-play.c
-    Remove cruft.
-
-2010-12-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add methods rawHandle() and takeOwnership(). Thanks to Tim Blechmann for
-    the patch.
-
-    * tests/cpp_test.cc
-    Add tests for above two methods. Also supplied by Tim Blechmann.
-
-2010-11-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Add mention of use of sf_strerror() when sf_open() fails.
-
-2010-11-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Make TYPEOF_SF_COUNT_T int64_t where possible. This may fix problems where
-    people are compiling on a 64 bit system with the GCC -m32 flag.
-
-    * src/sndfile.h.in
-    Fix comments on sf_count_t.
-
-2010-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Handle non-zero offset field in SSND chunk. Thanks to Michael Chinen.
-
-2010-10-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Sed fix for FreeBSD. Thanks Tony Theodore.
-
-2010-10-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * shave.in M4/shave.m4
-    Fix shave invocation of windres compiler. Thanks Damien Lespiau (upstream
-    shave author).
-
-    * configure.ac M4/shave.m4 shave-libtool.in shave.in
-    Switch from shave to automake-1.11's AM_SILENT_RULES.
-
-2010-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * shave-libtool.in shave.in
-    Sync to upstream version.
-
-    * src/rf64.c
-    More work to make the parser more robust and accepting of mal-formed files.
-
-2010-10-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add functions psf_strlcpy() and psf_strlcat().
-
-    * src/broadcast.c src/sndfile.c src/strings.c src/test_main.c
-        src/test_main.h src/test_strncpy_crlf.c
-    Use functions psf_strlcpy() and psf_strlcat() as appropriate.
-
-    * tests/string_test.c
-    Add tests for SF_STR_GENRE and SF_STR_TRACKNUMBER.
-
-    * src/rf64.c
-    Fix size of 'ds64' chunk when writing RF64.
-
-2010-10-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/*.c
-    Add the libsndfile version to the usage message of all programs.
-
-2010-10-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/version-metadata.rc.in src/Makefile.am
-    Add version string resources to the windows DLL.
-
-    * doc/api.html
-    Update to add missing SF_FORMAT_* values. Closed Debian bug #545257.
-
-    * NEWS README configure.ac doc/*.html
-    Updates for 1.0.23 release.
-
-2010-10-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pedantic-header-test.sh.in
-    Handle unusual values of CC environment variable.
-
-    * src/rf64.c
-    Minor tweaks and additional sanity checking.
-
-    * src/Makefile.am src/binheader_writef_check.py
-    Use python 2.6.
-
-2010-10-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add a missing 'inline' before a constructor defintion.
-
-2010-10-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add macro NOT.
-
-    * src/rf64.c
-    Minor tweaks.
-
-    * Makefile.am */Makefile.am
-    Add *~ to CLEANFILES.
-
-2010-10-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix a typo in the error string for SFE_OPEN_PIPE_RDWR. Thanks to Charles
-    Van Winkle for the report.
-
-2010-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c src/ogg.c src/sndfile.h.in src/strings.c src/wav.c
-    Add ability to read/write tracknumber and genre to flac/ogg/wav files.
-    Thanks to Matti Nykyri for the patch.
-
-    * src/common.h src/broadcast.c src/strings.c
-    Add function psf_safe_strncpy() and use where appropriate.
-
-2010-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * NEWS README configure.ac doc/*.html
-    Updates for 1.0.22 release.
-
-2010-10-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/broadcast.c src/rf64.c src/sndfile.c src/wav.c
-    Rewrite of SF_BROADCAST_INFO handling.
-
-    * src/test_broadcast_var.c tests/command_test.c
-    Tweak SF_BROADCAST_INFO tests.
-
-    * src/test_broadcast_var.c
-    Fix OSX stack check error.
-
-2010-09-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sds.c
-    Set sustain_loop_end to 0 as suggested by Brian Lewis.
-
-2010-09-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sds.c
-    Make sure the correct frame count gets written into the header.
-
-    * tests/write_read_test.tpl
-    Don't allow SDS files to have a long frame count.
-
-2010-09-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sds.c
-    Apply a pair of patches from Brian Lewis to fix the packet number location
-    and the checksum.
-
-2010-09-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    *  src/aiff.c src/file_io.c src/ogg.c src/rf64.c src/sndfile.c
-        src/strings.c src/test_audio_detect.c src/test_strncpy_crlf.c
-        src/wav.c tests/pcm_test.tpl
-   Fix a bunch of minor issues found using static analysis.
-
-2010-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_broadcast_var.c
-    New file containing tests for broadcast_set_var().
-
-    * src/Makefile.am src/test_main.[ch]
-    Hook test_broadcast_var.c into tests.
-
-2010-08-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c src/common.(c|h)
-    Move function strncpy_crlf() to src/common.c so the function can be tested
-    in isolation.
-
-    * src/test_strncpy_crlf.c
-    New file.
-
-    * src/Makefile.am src/test_main.[ch]
-    Hook test_strncpy_crlf.c into tests.
-
-2010-08-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Move code around to make comments make sense.
-
-    * src/broadcast.c
-    Add debugging code that is disabled by default.
-
-2010-08-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    When the file meta data says the file has zero frames set psf->sf.frames
-    to SF_COUNT_MAX. Fixes Debian bug #590752.
-
-    * programs/sndfile-info.c
-    Print 'unknown' if frame count == SF_COUNT_MAX.
-
-2010-06-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Only support writing mono SVX files. Multichannel SVX files are not
-    interleaved and there is no support infrastructure to cache and write
-       multiple channels to create a non-interleaved file.
-
-    * src/file_io.c
-    Don't call close() on a file descriptor of -1. Thanks to Jeremy Friesner
-    for the bug report.
-
-2010-06-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add macro SF_ASSERT.
-
-    * src/sndfile.c
-    Use SF_ASSERT to ensure sizeof (sf_count_t) == 8.
-
-    * src/svx.c
-    Add support for reading and writing stereo SVX files.
-
-2010-05-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    When compiling with x86_64-w64-mingw32-gcc link with -static-libgcc flags.
-
-    * programs/common.c programs/sndfile-metadata-set.c
-    Update metadata after the audio data is copied. Other minor fixes. Patch
-    from Marius Hennecke.
-
-2010-05-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Fix a regression reported by Hugh Secker-Walker.
-
-    * src/api.html
-    Add comment about sf_open_fd() not working on Windows if the application
-    and the libsndfile DLL are linked to different versions of the Microsoft
-    C runtime DLL.
-
-2010-04-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pedantic-header-test.sh.in
-    Fix 'make distcheck'.
-
-2010-04-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pedantic-header-test.sh.in
-    New file to test whether sndfile.h can be compiled with gcc's -pedantic
-    flag.
-
-    * configure.ac tests/test_wrapper.sh.in
-    Hook pedantic-header-test into test suite.
-
-    * src/sndfile.h.in
-    Fix -pedantic warning.
-
-2010-04-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-salvage.c programs/Makefile.am
-    New program to salvage the audio data from WAV/WAVEX/AIFF files which are
-    greater than 4Gig in size.
-
-2010-04-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-convert.c
-    Fix valgrind warning.
-
-2010-04-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-cmp.c
-    When files differ in the PCM data, also print the difference offset.
-    Minor cleanup.
-
-2010-03-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Don't use the 'twos' marker for 24 and 32 bit PCM, use 'in24' and 'in32'
-    instead. Thanks to Paul Davis (Ardour) for this suggestion.
-
-2010-02-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Clean up configure report.
-
-    * tests/utils.tpl
-    Add functions test_read_raw_or_die and test_write_raw_or_die.
-
-    * tests/rdwr_test.(def|tpl) tests/Makefile.am
-    Add new test program and hook into build.
-
-    * src/sndfile.c
-    Fix minor issues with sf_read/write_raw(). Bug reported by Milan Křápek.
-
-    * tests/test_wrapper.sh.in
-    Add rdwr_test to the test wrapper script.
-
-2010-02-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Remove -fpascal-strings from OSX's OS_SPECIFIC_CFLAGS.
-
-    * programs/common.[ch] programs/sndfile-metadata-set.c
-    Apply a patch from Robin Gareus allowing the setting of the time reference
-    field of the BEXT chunk.
-
-2010-02-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ima_adpcm.c
-    Add a fix from Jonatan Liljedahl to handle predictor overflow when decoding
-    IMA4.
-
-2010-01-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add a constructor which takes an existing file descriptor and then calls
-    sf_open_fd(). Patch from Sakari Bergen.
-
-2010-01-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-deinterleave.c programs/sndfile-interleave.c
-    Improve usage messages.
-
-2010-01-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/id3.c src/Makefile.am
-    Add new file src/id3.c and hook into build.
-
-    * src/sndfile.c src/common.h
-    Detect and skip and ID3 header at the start of the file.
-
-2010-01-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/common.c
-    Fix update_strings() copyright, comment, album and license are correctly
-    written. Thanks to Todd Allen for reporting this.
-
-    * man/Makefile.am
-    Change GNU makeism to something more widely supported. Thanks to Christian
-    Weisgerber for reporting this.
-
-    * configure.ac programs/Makefile.am programs/sndfile-play.c
-    Apply patch from Christian Weisgerber and Jacob Meuserto add support for
-    OpenBSD's sndio.
-
-2010-01-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Discourage the use of sf_read/write_raw().
-
-2009-12-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Test for Unix pipe() and waitpid() functions.
-
-    * src/sfconfig.h tests/pipe_test.tpl
-    Disable pipe_test if pipe() and waitpid() aren't available.
-
-2009-12-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/Makefile.am src/create_symbols_file.py
-        src/make-static-lib-hidden-privates.sh
-    Change name of generated file src/Symbols.linux to Symbols.gnu-binutils and
-    and use the same symbols file for other systems which use GNU binutils like
-    Debian's kfreebsd.
-
-    * M4/shave.m4 shave.in
-    Update shave files from upstream.
-
-2009-12-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * man/sndfile-metadata-get.1
-    Fix typo.
-
-    * man/sndfile-interleave.1 man/Makefile.am
-    New man page.
-
-2009-12-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    When decoding to short or int, clip the decoded signal to [-1.0, 1.0] if
-    its too hot. Thanks to Dmitry Baikov for suggesting this.
-
-    * NEWS README doc/*.html
-    Updates for 1.0.21.
-
-2009-12-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-jackplay.c man/sndfile-jackplay.1
-    Remove these which will now be in found in the sndfile-tools package.
-
-    * programs/Makefile.am man/Makefile.am
-    Remove build rules for sndfile-jackplay.
-
-    * configure.ac
-    Remove detection of JACK Audio Connect Kit.
-
-    * programs/sndfile-concat.c man/sndfile-concat.1
-    Add new program with man page.
-
-    * man/Makefile.am programs/Makefile.am
-    Hook sndfile-concat into build system.
-
-2009-12-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/error_test.c
-    Don't terminate when sf_close() returns zero in error_close_test().
-    It seems that Windows 7 behaves differently from earlier versions of
-    Windows.
-
-2009-12-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac M4/*.m4
-    Rename all custom macros from AC_* to MN_*.
-
-    * programs/sndfile-interleave.c
-    Make it actually work.
-
-2009-12-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/*.html configure.ac
-    Corrections and clarifications courtesy of Robin Forder.
-
-    * programs/sndfile-convert.c programs/common.[ch]
-    Move some code from convert to common for reuse.
-
-    * programs/sndfile-interleave.c programs/sndfile-interleave.c
-    Add new programs sndfile-interleave and sndfile-deinterleave.
-
-    * programs/Makefile.am
-    Hook new programs into build.
-
-2009-12-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/create_symbols_file.py tests/stdio_test.c tests/win32_test.c
-    Minor OS/2 tweaks as suggested by David Yeo.
-
-    * tests/multi_file_test.c
-    Fix file creation flags on windows. Thanks to Bruce Sharpe.
-
-    * src/sf_unistd.h
-    Set all group and other file create permssions to zero.
-
-    * tests/win32_test.c
-    Add a new test.
-
-2009-11-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/print.css doc/*.html
-    Add a print stylesheet and update all HTML documents to reference it.
-    Thanks to Aditya Bhargava for suggesting this.
-
-    * doc/index.html
-    Minor corrections.
-
-2009-11-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * sndfile.pc.in
-    Add a Libs.private entry to assist with static linking.
-
-2009-11-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/make-static-lib-hidden-privates.sh src/Makefile.am
-    Add a script to hide all non-public symbols in the libsndfile.a static
-    library.
-
-2009-11-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/locale_test.c
-    Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES.
-
-2009-11-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/windows.c
-    Correct usage of ENABLE_SNDFILE_WINDOWS_PROTOTYPES.
-
-2009-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-convert.c
-    Allow the program to read from stdin by specifying '-' on the command line
-    as the input file.
-
-    * src/sndfile.h.in
-    Hash define ENABLE_SNDFILE_WINDOWS_PROTOTYPES to 1 for greater safety.
-
-    * tests/virtual_io_test.c
-    Add a PAF/PCM_24 test and verify the file length is not negative
-    immediately after openning the file for write.
-
-2009-10-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    When writing loop lengths, adjust the end position by one to make up for
-    Microsoft's screwed up spec. Thanks to Olivier Tristan for the patch.
-
-2009-10-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Apply patch from Uli Franke allowing FLAC files to be encoded at any sample
-    rate.
-
-2009-10-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Fix parsing of odd ulaw encoded file provided by Jan Silovsky.
-
-    * configure.ac
-    Insist on libvorbis >= 1.2.3. Earlier verions have bugs that cause the
-    libsndfile test suite to fail on MIPS, PowerPC and others.
-    See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549899
-
-2009-10-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * man/sndfile-convert.1
-    Fix warning from Debian's lintian checks.
-
-    * man/sndfile-cmp.1 man/sndfile-jackplay.1 man/sndfile-metadata-get.1
-        man/Makefile.am
-    Add three new minimal manpages and hook into build.
-
-2009-10-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/test_wrapper.sh.in
-    Don't run cpp_test on x86_64-w64-mingw32.
-
-2009-09-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl
-    On windows, make sure the open() function doesn't get called with a third
-    parameter of 0 which fails for no good reason. Also make sure this third
-    parameter doesn't get called with S_IRGRP when compiling for windows because
-    Wine complains.
-
-    * src/sndfile.hh
-    Add a SndfileHandle constructor for windows that takes a 'const wchar_t *'
-    string.
-
-    * doc/FAQ.html
-    Add Q/A : I'm cross compiling libsndfile for another platform. How can I
-    run the test suite?
-
-    * src/create_symbols_file.py src/Makefile.am
-    Add Symbols.static target, a list of symbols, one per line.
-
-2009-09-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/test_wrapper.sh.in
-    Update to allow all tests to be gathered up into a testsuite tarball and
-    then be run using this script.
-
-    * build-test-tarball.mk.in
-    Add a Make script to build a tarball of all the test binaries and the test
-    wrapper script. This is useful for cross compiling; you can build the
-    binaries, build test test tarball and transfer the test tarball to the
-    target machine for testing.
-
-2009-09-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/*.c
-    Modify SF_FILE struct to allow it to carry either 8-bit or 16-bit strings
-    for the file path, directory and name. Fixes for this change throughout.
-
-    * src/windows.c src/Makefile.am
-    New file defining new windows only public function sf_wchar_open() which
-    takes a 'const wchar_t *' string (LPCWSTR) for the file name parameter.
-
-    * src/sndfile.h.in
-    Add SF_CHANNEL_MAP_ABISONIC_* entries.
-    Add windows only defintion for sf_wchar_open().
-
-    * src/create_symbols_file.py
-    Add sf_wchar_open() to the list of public symbols (windows only).
-
-    * tests/locale_test.c
-    Add a wchar_test() to test sf_wchar_open().
-
-2009-09-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/*.c
-    Split file stuff into PSF_FILE struct within the SF_PRIVATE struct.
-
-2009-09-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/voc.c
-    When a byte is needed, use unsigned char.
-
-    * src/ima_oki_adpcm.c src/broadcast.c src/test_ima_oki_adpcm.c
-    Include sfconfig.h to prevent compile errors with MinGW compilers.
-
-    * configure.ac
-    Remove AM_CONFIG_HEADER due to warnings from autoconf 2.64.
-
-    * tests/locale_test.c
-    Update to work with xx_XX.UTF-8 style locales. Refactoring.
-
-2009-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Set __USE_MINGW_ANSI_STDIO to 1 when compiling using MinGW compilers.
-    Remove unneeded AC_SUBST.
-    Report Host CPU/OS/vendor.
-
-2009-09-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix error message string.
-
-    * src/flac.c
-    Add 88200 to the list of supported sample rates.
-
-    * src/ogg.c
-    Fix compiler warning when using gcc-4.5.0.
-
-    * programs/sndfile-info.c tests/utils.tpl
-    Remove WIN32 snprintf #define.
-
-    * src/ima_adpcm.c
-    Fix minor bug in aiff_ima_encode_block. Thanks to Denis Fileev for finding
-    this.
-
-2009-09-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/caf.c
-    Use the correct C99 format specifier for int64_t.
-
-    * M4/endian.m4
-    Fix detection of CPU endian-ness when cross compiling. Thanks to Pierre
-    Ossman for the bug report.
-
-    * src/caf.c src/sndfile.c
-    Fix reading and writing of PEAK chunks in CAF files.
-
-    * tests/peak_chunk_test.c tests/test_wrapper.sh.in
-    Run peak_chunk_test on CAF files.
-
-2009-09-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/wav.c
-    Use the correct C99 format specifier for int64_t.
-
-2009-08-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/rf64.c src/sndfile.c src/wav.c src/wav_w64.h
-    Apply a patch (massaged slightly) from Uli Franke adding handling of the
-    BEXT chunk in RF64 files.
-
-    * tests/command_test.c
-    Update channel_map_test() function so WAV test passes.
-
-    * src/rf64.c
-    Add channel mapping and ambisonic support.
-
-    * src/sndfile.h
-    Add comments showing correspondance between libsndfile channel map
-    defintiions and those used by Apple and MS.
-
-    Add handling of reading/writing channel map info.
-
-    * tests/command_test.c tests/test_wrapper.sh.in
-    Update channel map tests.
-
-2009-07-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add function psf_isprint() a replacement for the standard C isprint()
-    function which ignores any locale settings and treats all input as ASCII.
-
-    * src/(aiff|common|rf64|sd2|strings|svx|wav).c
-    Use psf_isprint() instead of isprint().
-
-2009-07-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c
-    Add string descriptions for SF_FORMAT_RF64 and SF_FORMAT_MPC2K.
-
-2009-06-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-play.c
-    Allow use of Open Sound System audio output under FreeBSD.
-
-2009-06-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add patch from Conrad Parker to add --disable-jack.
-
-2009-05-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/alaw.c src/float32.c src/htk.c src/pcm.c src/sds.c src/ulaw.c
-    Fix bugs where invalid files can cause a divide by zero error (SIGFPE).
-    Thanks to Sami Liedes for reporting this a Debian bug #530831.
-
-2009-05-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/chanmap.[ch]
-    New files for channel map decoding/encoding.
-
-2009-05-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/sndfile.h.in
-    Fix MSVC definition of sf_count_t.
-
-2009-05-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_w64.[ch]
-    Add wavex_channelmask to WAV_PRIVATE struct and add a function to convert
-    an array of SF_CHANNEL_MASK_* values into a bit mask for use in WAV files.
-
-    * src/wav.c
-    Add ability to write the channel mask.
-
-2009-05-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-info.c
-    Add -c command line option to dump the channel map information.
-
-    * src/wav_w64.c
-    Don't bail from parser if channel map bitmask is faulty.
-
-    * src/common.h src/sndfile.c
-    Remove error code SFE_W64_BAD_CHANNEL_MAP which is not needed any more.
-
-    * src/sndfile.c
-    On SFC_SET_CHANNEL_MAP_INFO pass the channel map command down to container's
-    command handler.
-
-2009-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/common.h src/sndfile.c src/wav_w64.c
-    Apply a patch from Lennart Poettering (PulseAudio) to allow reading of
-    channel data in WAV and W64 files.
-    Add a test for the above.
-
-2009-05-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FAQ.html
-    Update the section about pre-compiled binaries for Win64.
-
-2009-05-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/test_conversions.c
-    Be more careful when including <stdint.h> so compiling on pre-C99 platforms
-    (hello Slowlaris) might actually work.
-
-    * NEWS README doc/*.html
-    Updates for 1.0.20.
-
-2009-04-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Fix a bug whereby opening a specially crafted VOC file could result in a
-    heap overflow. Thanks to Tobias Klein (http://www.trapkit.de) for reporting
-    this issue.
-
-    * src/aiff.c
-    Fix potential (heap) buffer overflow when parsing 'MARK' chunk.
-
-2009-04-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/stdin_test.c
-    Check psf->error after opening file.
-
-    * src/file_io.c
-    Fix obscure seeking bug reported by Hugh Secker-Walker.
-
-    * tests/utils.tpl
-    Add check of sf_error to test_open_file_or_die().
-
-    * src/sndfile.c
-    Clear error if opening resource fork fails.
-
-2009-04-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/alaw_test.c tests/locale_test.c tests/ulaw_test.c
-    Cleanup output.
-
-2009-03-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c
-    Fix f2s_clip_array.
-
-2009-03-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c
-    In host_read_f2s call convert instead of f2s_array.
-
-    * src/ima_adpcm.c
-    Remove dead code.
-
-    * src/test_ima_oki_adpcm.c examples/generate.c tests/dither_test.c
-        tests/dwvw_test.c tests/fix_this.c tests/generate.c
-        tests/multi_file_test.c
-    Minor fixes.
-
-2009-03-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * M4/shave.m4 shave.in
-    Pulled update from upstream.
-
-2009-03-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Add pointers to example programs in source code tarball.
-
-2009-03-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Define SF_PLATFORM_S64 for non-gcc compilers with 'long long' type.
-
-    * configure.ac
-    Add documentation for --disable-external-libs and improve error handling
-    for that option.
-
-    * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py
-    Add public function sf_version_string.
-
-    * tests/sfversion.c
-    Test function sf_version_string.
-
-    * M4/shave.m4 shave-libtool.in shave.in
-    Add new files from 'git clone git://git.lespiau.name/shave'.
-
-    * configure.ac
-    Enable shave.
-
-    * src/Makefile.am src/binheader_writef_check.py Octave/*
-    Shave related tweaks.
-
-2009-03-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/caf.c src/sndfile.c
-    Add SF_MAX_CHANNELS (set to 256) and use it.
-
-    * src/sndfile.h.in
-    Check for either _MSCVER or _MSC_VER being defined.
-
-2009-03-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/vorbis_test.c
-    Relax test slighly to allow test to pass on more CPUs etc.
-
-2009-03-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Detect vorbis_version_string() correctly.
-
-2009-03-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Add a 'See Also' section with a link to sndfile-tools.
-
-    * NEWS README doc/*.html
-    Updates for 1.0.19 release.
-
-    * configure.ac
-    Fix --enable-external-libs logic.
-
-2009-03-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix resource leak and potential read beyond end of buffer.
-
-    * src/nist.c
-    Fix reading of header value sample_n_bytes.
-
-    * src/sd2.c src/wav.c
-    Fix potential read beyond end of buffer.
-
-    * src/sndfile.c src/svx.c
-    Check return values of file_io functions.
-
-    * tests/win32_test.c
-    Fix resource leak.
-
-    * configure.ac
-    Detect the presence/absence of vorbis_version_string() in libvorbis.
-
-    * src/ogg.c
-    Only call vorbis_version_string() from libvorbis if present.
-
-2009-02-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/win32_test.c
-    Don't use sprintf, even on windows.
-
-    * src/aiff.c src/rf64.c src/wav.c
-    Eliminate dead code, more validation of data read from file.
-
-2009-02-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ima_adpcm.c
-    Clamp values to a valid range before indexing ima_step_size array.
-
-    * src/GSM610/*.c tests/*c programs/*.c src/audio_detect.c
-    Don't include un-needed headers.
-
-    * programs/sndfile-info.c
-    Remove dead code.
-
-    * tests/test_wrapper.sh.in
-    Add 'set -e' so the script exits on error.
-
-    * src/test_ima_oki_adpcm.c
-    Fix read beyond end of array.
-
-    * tests/win32_test.c
-    Add missing close on file descriptor.
-
-    * src/nist.c programs/sndfile-metadata-set.c
-    Fix 'unused variable' warnings.
-
-    * src/aiff.c
-    Fix potential memory leak in handling of 'MARK' chunk.
-    Remove un-needed test (unsigned > 0).
-
-    * src/sd2.c
-    Improve handling of heap allocated buffer.
-
-    * src/sndfile.c
-    Remove un-needed test (always true).
-
-    * src/wav.c src/rf64.c
-    Ifdef out dead code that will be resurected some time in the future.
-
-    * src/wav.c src/w64.c src/xi.c
-    Handle error return values from psf_ftell.
-
-    * src/wav_w64.c
-    Fix handling and error checking of MSADPCM coefficient arrays.
-
-    * regtest/*.c
-    Bunch of fixes.
-
-    * src/test_file_io.c
-    Use snprintf instead of strncpy in test program.
-
-2009-02-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Validate data before using.
-
-    * src/caf.c
-    Validate channels per frame value before using, fixing a possible integer
-    overflow bug, leading to a possible heap overflow. Found by Alin Rad Pop of
-    Secunia Research (CVE-2009-0186).
-
-2009-02-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Octave/octave_test.sh
-    Unset TERM environment variable and export LD_LIBRARY_PATH.
-
-2009-02-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    In windows code, cast LPVOID to 'char*' in printf.
-
-2009-02-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * M4/octave.m4
-    Clear the TERM environment before evaluating anything in Octave. This works
-    around problems that might occur if a users TERM settings are incorrect.
-    Thanks to Rob Til Freedmen for helping to debug this.
-
-    * src/wav.c
-    Handle four zero bytes as a marker within a LIST or INFO chunk.
-    Thanks to Rogério Brito for supplying an example file.
-
-2009-02-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/*.c
-    Use C99 snprintf everywhere.
-
-2009-02-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/test_wrapper.sh.in
-    New file to act as the template for the test wrapper script.
-
-    * configure.ac
-    Generate tests/test_wrapper.sh from the template.
-
-    * tests/Makefile.am
-    Replace all tests with a single invocation of the test wrapper script.
-
-2009-02-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    Record vorbis library version string.
-
-    * configure.ac
-    Require libvorbis >= 1.2.2.
-
-    * M4/endian.m4
-    Fix bracketing of function for autoconf 2.63. Thanks to Richard Ash.
-
-    * M4/octave.m4 M4/mkoctfile_version.m4
-    Clean up AC_WITH_ARG usage using AC_HELP_STRING.
-
-2009-02-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Octave/Makefile.am
-    Use $(top_buildir) instead of $(builddir) which may not be defined.
-
-    * M4/octave.m4
-    Improve logic and status reporting.
-
-2009-02-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac  AUTHORS NEWS README doc/*.html
-    Final tweaks for 1.0.18 release.
-
-2009-02-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-convert.c
-    Add 'htk' to the list of convert formats.
-
-    * programs/sndfile-info.c
-    Simplify get_signal_max using SFC_CALC_SIGNAL_MAX command.
-    Increase size of files for which signal max will be calculated.
-
-2009-01-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Fix links for SoX and WavPlay. Thanks to Daniel Griscom.
-
-2009-01-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-metadata-get.c
-    Make valgrind clean.
-    Clean up temp string array usage.
-    Error out if trying to update coding history in RDWR mode.
-
-2009-01-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Fix links to versions of the LGPL.
-
-2008-12-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/string_test.c
-    Add test for RDWR mode where the file ends up shorter than when it was
-    opened.
-
-    * src/wav.c
-    Truncate the file on close for RDWR mode where the file ends up shorter
-    than when it was opened.
-
-2008-11-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * M4/add_cflags.m4
-    Fix problem with quoting of '#include'.
-
-    * M4/add_cxxflags.m4 configure.ac
-    Add new file M4/add_cxxflags.m4 and use it in configure.ac.
-
-2008-11-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-info.c
-    Apply patch from Conrad Parker to calculate and display total duration when
-    more than one file is dumped.
-
-2008-11-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/Makefile.am
-    Tweaks to generation of Symbols files.
-
-    * tests/win32_ordinal_test.c
-    Update tests for above changes.
-
-2008-11-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/common.c
-    When merging broadcast info, make sure to clear the destination field
-    before copying in the new data.
-
-    * programs/test-sndfile-metadata-set.py
-    Add test for the above.
-
-    * src/broadcast.c
-    Fix checking of required coding_history_size.
-
-2008-10-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    Add test to detect if coding history is truncated.
-
-    * src/broadcast.c
-    Fix truncation of coding history.
-
-2008-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    Add broadcast_coding_history_size test.
-
-    * programs/*.[ch]
-    Use SF_BROADCAST_INFO_VAR to manipulate larger 'bext' chunks.
-
-    * src/rf64.c
-    Add code to prevent infinite loop on malformed file.
-
-    * src/common.h src/sndfile.c src/w64.c src/wav_w64.c
-    Rationalize and improve error handling when parsing 'fmt ' chunk.
-
-    * M4/octave.m4
-    Simplify and remove cruft.
-    Check for correct Octave version.
-
-    * Octave/*
-    Reduce 3 C++ files to one, fix build for octave 3.0, fix build.
-
-    * Octave/sndfile.cc Octave/PKG_ADD
-    Add Octave function sfversion which returns the libsndfile version that the
-    module is linked against.
-
-    * Octave/Makefile.am
-    Bunch of build and 'make distcheck' fixes.
-
-2008-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/common.c
-    Return 1 if SFC_SET_BROADCAST_INFO fails.
-
-    * programs/test-sndfile-metadata-set.py
-    Update for new programs directory, exit on any error.
-
-    * tests/error_test.c
-    Fix failure behaviour in error_number_test.
-
-    * src/common.h src/sndfile.c
-    Add error number SFE_BAD_BROADCAST_INFO_SIZE.
-
-    * src/*
-    Reimplement handling of broadcast extentioon chunk in WAV/WAVEX files.
-
-    * src/broadcast.c
-    Fix generation of added coding history.
-
-2008-10-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * programs/sndfile-metadata-get.c programs/sndfile-info.c
-    Exit with non-zero on errors.
-
-2008-10-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-to-text.c examples/Makefile.am
-    Add a new example program and hook it into the build.
-
-    * examples/ programs/
-    Add a new directory programs and move sndfile-info, sndfile-play and other
-    real programs to the new directory, leaving example programs where they
-    were.
-
-2008-10-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/Makefile.am
-    Automake 1.10 MinGW cross compiling fixes.
-
-2008-10-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Remove call to deprecated function snd_pcm_sw_params_get_xfer_align.
-    Fix gcc-4.3 compiler warnings.
-
-    * tests/command_test.c
-    Fix a valgrind warning.
-
-    * tests/error_test.c tests/multi_file_test.c tests/peak_chunk_test.c
-        tests/pipe_test.tpl tests/stdio_test.c tests/win32_test.c
-    Fix gcc-4.3 compiler warnings.
-
-2008-10-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c
-    Fix termination of desitination string in strncpy_crlf.
-    When copying BROADCAST_INFO chunk, make sure destination gets correct line
-    endings.
-
-    * examples/common.c
-    Fix copying of BROADCAST_INFO coding_history field.
-
-2008-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    Add test function instrument_rw_test, but don't hook it into the testing
-    yet.
-
-    * src/common.h src/command.c src/sndfile.c src/flac.c
-    Error code rationalization.
-
-    * src/common.h src/sndfile.c
-    Set psf->error to SFE_CMD_HAS_DATA when adding metadata via sf_command()
-    fails due to psf->have_written being true.
-
-    * doc/command.html
-    Document the SFC_GET/SET_BROADCAST_INFO comamnds.
-
-2008-10-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    Improve error reporting when '\0' is found in coding history.
-    Fix false failure.
-
-2008-10-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c
-    Convert all coding history line endings to \r\n.
-
-    * tests/command_test.c
-    Add test to make sure all line endings are converted to \r\n.
-
-2008-10-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c
-    Changed the order of coding history fields.
-
-    * tests/command_test.c
-    Update bextch test to cope with previous change.
-
-    * examples/common.c
-    Add extra length check when copying broadcast info data.
-
-2008-10-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl tests/pcm_test.tpl
-    Update check_file_hash_or_die to use 64 bit hash.
-
-    * tests/checksum_test.c tests/Makefile.am
-    Add new checksum_test specifically for lossy compression of headerless
-    files.
-
-2008-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/gsm610.c
-    Seek to psf->dataoffset before decoding first block.
-
-    * src/sndfile.c
-    Fix detection of mpc2k files on big endian systems.
-
-2008-10-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c
-    Use '\r\n' newlines in Coding History as required by spec.
-
-2008-10-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_conversions.c
-    Use int64_t instead of 'long long'.
-
-2008-10-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-metadata-set.c
-    Remove --bext-coding-history-append command line option because it didn't
-    really make sense.
-
-    * examples/sndfile-metadata-(get|set).c
-    Add usage messages.
-
-    * examples/test-sndfile-metadata-set.py
-    Start work on test coding history.
-
-2008-09-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * README doc/win32.html
-    Bring these up to date.
-
-    * src/aiff.c
-    Fix parsing of REX files.
-
-2008-09-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Use intptr_t instead of long for return value of _get_osfhandle.
-
-    * src/test_conversions.c src/test_endswap.tpl
-    Fix printing of int64_t values.
-
-    * examples/sndfile-play.c
-    Fix win64 issues.
-
-    * tests/win32_ordinal_test.c
-    Fix calling of GetProcAddress with ordinal under win64.
-
-    * tests/utils.tpl
-    Fix win64 issues.
-
-2008-09-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/*
-    Rename copy_data.[ch] to common.[ch]. Fix build.
-    Move code from sndfile-metadata-set.c to common.c.
-
-    * examples/Makefile.am tests/Makefile.am regtest/Makefile.am
-    Clean paths.
-
-2008-09-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/tutorial.html doc/Makefile.am
-    Add file doc/tutorial.html and hook into build/dist system.
-
-2008-09-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-metadata-set.c
-    Clean up handling of bext command line params.
-
-2008-09-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Add handling/skipping of a couple of new chunk types.
-
-2008-09-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add -funsigned-char to CFLAGS if the compiler supports it.
-
-    * examples/sndfile-metadata-(get|set).c
-    Add handling for more metadata types.
-
-2008-09-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add macros SF_CONTAINER, SF_CODEC and SF_ENDIAN useful for splitting format
-    field of SF_INFO into component parts.
-
-    * src/*.c
-    Use new macros everywhere it is appropriate.
-
-2008-09-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-bwf-set.c
-    Massive reworking.
-
-2008-08-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-bwf-set.c
-    Add --info-auto-create-date command line option.
-
-    * examples/sndfile-metadata-set.c examples/sndfile-metadata-get.c
-        examples/Makefile.am examples/test-sndfile-bwf-set.py
-    Rename sndfile-bwf-(set|get).c to sndfile-metadata-(set|get).c.
-    Change command line args.
-
-2008-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Allow 'PAD ' chunk to be modified in RDWR mode.
-
-    * src/sndfile.h.in src/sndfile.c
-    Add handling (incomplete) for SFC_SET_ADD_HEADER_PAD_CHUNK.
-
-    * tests/Makefile.am tests/write_read_test.tpl tests/header_test.tpl
-        tests/misc_test.c
-    Add tests for RF64.
-
-    * src/rf64.c
-    Fixes to make sure all tests pass.
-
-    * tests/Makefile.am tests/string_test.c
-    Add string tests (not yet passing).
-
-2008-08-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/rf64.c
-    First pass at writing RF64 now working.
-
-2008-08-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Add SF_FORMAT_RF64 to format_map.
-
-    * src/common.h src/sndfile.c
-    More RF64 support code.
-
-    * examples/sndfile-bwf-set.c
-    Fix the month number in autogenerated date string and use hypen in date
-    instead of slash.
-
-    * examples/test-sndfile-bwf-set.py
-    Update tests.
-
-    * examples/sndfile-info.c
-    When called with -i or -b option, operate on all files on command line, not
-    just the first.
-
-2008-08-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/rf64.c
-    New file to handle RF64 (WAV like format supportting > 4Gig files).
-
-    * src/sndfile.h.in src/common.h src/sndfile.c src/Makefile.am
-    Hook the above into build so hacking can begin.
-
-    * src/pcm.c
-    Improve log message when pcm_init fails.
-
-    * src/sndfile-info.c
-    Only calculate and print 'Signal Max' if file is less than 10 megabytes in
-    length.
-
-2008-08-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/string_test.c
-    Polish string_multi_set_test.
-
-    * src/wav.c
-    In RDWR mode, pad the header if necessary (ie LIST chunk has moved or
-    length has changed).
-    Minor fixes in wav_write_strings.
-    Write PAD chunk with default endian-ness, not a specific endian-ness.
-
-    * examples/test-sndfile-bwf-set.py
-    Add Python script to test sndfile-bwf-set/get.
-
-    * examples/sndfile-bwf-set.c
-    Clean up and fixes.
-
-    * src/wav.c
-    Merge function wavex_write_header into wav_write_header, deleting about 70
-    lines of code.
-
-    * src/common.h
-    Double value of SF_MAX_STRINGS.
-
-    * tests/string_test.c
-    Add string tests for WAVEX and RIFX files.
-
-    * tests/command_test.c
-    Add broadcast test for WAVEX files.
-
-2008-08-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/string_test.c
-    Add a new string_rdwr_test (currently failing for WAV).
-    Add a new string_multi_set_test (currently failing).
-
-    * tests/command_test.c
-    Add new broadcast_rdwr_test (currently failing).
-
-    * src/wav.c
-    Fix to WAV parser to allow 'bext' chunk to be updated in place.
-    In wav_write_tailer, seek to psf->dataend if its greater than zero.
-
-    * src/sndfile.c
-    Make sure psf->have_written gets set correctly in mode SFM_RDWR.
-
-    * configure.ac
-    Test for <sys/time.h> and gettimeofday.
-
-    * src/common.c
-    Use gettimeofday() to initialize psf_rand_int32.
-
-    * src/common.h src/sndfile.c
-    Add unique_id field to SF_PRIVATE struct.
-
-    * src/common.h src/sndfile.c src/wav.c src/wav_w64.[ch]
-    Move wavex_ambisonic field from SF_PRIVATE struct to WAV_PRIVATE struct.
-
-    * src/common.h src/strings.c
-    Add function psf_location_string_count.
-
-2008-08-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Test for localtime and localtime_r.
-
-    * examples/sndfile-convert.c
-    In function copy_metadata(), copy broadcast info if present.
-
-    * examples/copy_data.[ch] examples/Makefile.am
-    Break some functionality out of sndfile-convert.c so it can be used in
-    examples/sndfile-bwf-set.c.
-
-    * tests/utils.tpl
-    Add new function create_short_sndfile().
-
-    * examples/sndfile-bwf-set.c examples/sndfile-bwf-get.c
-        examples/Makefile.am
-    Add new files and hook into build.
-
-2008-08-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Fix comments. Patch from Mark Glines.
-
-2008-07-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Use zero_data_test on Ogg/Vorbis files.
-
-    * src/ogg.c
-    Fix segfault when closing an Ogg/Vorbis file that has been opened for write
-    but had no actual data written to it. Bug reported by Chinoy Gupta.
-
-    * tests/Makefile.am
-    Make sure to run mist_test on Ogg/Vorbis files.
-
-2008-07-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * regtest/Makefile.am
-    Use SQLITE3_CFLAGS to locate sqlite headers.
-
-2008-07-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html doc/FAQ.html
-    Add notes about which versions of windows libsndfile works on.
-
-2008-07-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Add a test for correct handling of Ambisonic files. Thanks to Fons
-    Adriaensen for the test.
-
-    * src/wav.c src/wav_w64.c
-    Fix handling of Ambisonic files. Thanks to Fons Adriaensen for the patch.
-
-2008-06-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fix detection/enabling of external libs.
-
-    * M4/extra_pkg.m4 M4/Makefile.am
-    Add m4 macro PKG_CHECK_MOD_VERSION which is a hacked version
-    PKG_CHECK_MODULES. The new macro prints the version number of the package
-    it is searching for.
-
-2008-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Apply a fix from Axel Röbel where if the second loop in the instrument
-    chunk is none, the loop mode is written into the first loop.
-
-2008-05-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_float.c src/test_main.(c|h) src/Makefile.am
-    Add new file to test functions float32_(le|be)_(read|write) and
-    double64_(le|be)_(read|write). Hook into build and testsuite.
-
-    * src/double64.c src/float32.c
-    Fix bugs in functions found by test added above. Thanks to Nicolas Castagne
-    for reporting this bug.
-
-    * src/sndfile.h.in
-    Change time_reference_(low|high) entries of SF_BROADCAST_INFO struct to
-    unsigned.
-
-    * examples/sndfile-info.c
-    Print out the BEXT time reference in a sensible format.
-
-2008-05-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Fuzz fixes.
-
-    * src/ogg.c
-    Add call to ogg_stream_clear to fix valgrind warning.
-
-    * src/aiff.c
-    Fix x86_64 compile issue.
-
-    * configure.ac src/Makefile.am src/flac.c src/ogg.c
-    Link to external versions of FLAC, Ogg and Vorbis.
-
-    * tests/lossy_comp_test.c tests/ogg_test.c tests/string_test.c
-        tests/vorbis_test.c tests/write_read_test.tpl
-    Fix tests when configured with --disable-external-libs.
-
-    * tests/external_libs_test.c tests/Makefile.am
-    Add new test and hook into build and test suite.
-
-    * src/command.c
-    Use HAVE_EXTERNAL_LIBS to ensure that the SFC_GET_FORMAT_* commands return
-    the right data when external libs are disabled.
-
-2008-05-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Add a test for extending a file during write by seeking past the current
-    end of file.
-
-    * src/sndfile.c
-    Allow seeking past end of file during write.
-
-2008-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html doc/command.html
-    Move all information about the sf_command function to command.html and add
-    a link from documentation of the sf_read/write_raw function to the
-    SFC_RAW_NEEDS_ENDSWAP command.
-
-    * doc/index.html doc/FAQ.html doc/libsndfile.css
-    Minor documentation tweaks.
-
-2008-05-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add AM_PROG_CC_C_O.
-
-2008-04-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/error_test.c
-    Add a test to make sure if file opened with sf_open_fd, and then the file
-    descriptor is closed, then sf_close will return an error code. Thanks to
-    Dave Flogeras for the bug report.
-
-    * src/sndfile.c
-    Make sf_close return an error is the file descriptor is already closed.
-
-2008-04-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Set object format to aout for OS/2. Thanks to David Yeo.
-
-    * src/mpc2k.c src/sndfile.c src/sndfile.h.in src/common.h src/Makefile.am
-    Add ability to read MPC 2000 file.
-
-    * tests/write_read_test.tpl tests/misc_test.c tests/header_test.tpl
-        tests/Makefile.am
-    Add tests for MPC 2000 file format.
-
-    * examples/sndfile-convert.c
-    Allow conversion to MPC 2000 file format.
-
-2008-04-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/VORBIS/lib/codebook.c
-    Sync from upstream SVN.
-
-    * autogen.sh configure.ac
-    Minor tweaks.
-
-2008-04-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    Add a patch that fixes finding the length in samples of an Ogg/Vorbis file.
-    The patch as supplied segfaulted and required many hours of debugging.
-
-    * src/OGG/bitwise.c
-    Sync from upstream SVN.
-
-2008-04-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix up handling of 'APPL' chunk. Thanks to Axel Röbel for bringing up
-    this issue.
-
-2008-04-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/*.c
-    Add calls to sf_close() where needed.
-
-    * tests/utils.tpl tests/multi_file_test.c
-    Always pass 0 as the third argument to open when OS_IS_WIN32.
-
-2008-04-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_*
-    Add files test_main.[ch].
-    Collapse all tests into a single executable.
-
-2008-03-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC
-    Sync to upstream CVS.
-
-2008-03-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Make SF_MIN and SF_MAX macros MinGW friendly.
-
-    * examples/sndfile-(info|play).c
-    Use Sleep function from <windows.h> instead of _sleep.
-
-    * tests/locale_test.c
-    Disable some tests when OS_IS_WIN32.
-
-    * src/FLAC/src/share/replaygain_anal/replaygain_analysis.c
-        src/FLAC/src/share/utf8/utf8.c
-    MinGW fixes.
-
-2008-03-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Tweaks to pcm16 <-> float conversion answer.
-
-2008-02-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/OGG
-    Sync to SVN upstream.
-
-    * Makefile.am
-    Add 'DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror'.
-
-2008-02-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-jackplay.c
-    Minor tweaks to warning message printed when compiled without libjack.
-
-2008-01-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/peak_chunk_test.c
-    Improve read_write_peak_test to find more errors. Inspired by example
-    provided by Nicolas Castagne.
-
-    * src/aiff.c
-    Another SFM_RDWR fix shown up by above test.
-
-2008-01-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix reading of COMM encoding string.
-
-    * src/chunk.c src/common.h src/Makefile.am
-    New file for storing and retrieving info about header chunks. Hook into
-    build.
-
-    * src/aiff.c
-    Use new chunk logging to fix problem with AIFF in RDWR mode.
-
-2008-01-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c
-    Add WVE to the list of major formats.
-
-    * tests/aiff_rw_test.c
-    Fix error reporting.
-
-2008-01-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.[ch]
-    Add internal functions str_of_major_format, str_of_minor_format,
-    str_of_open_mode and str_of_endianness.
-
-    * tests/write_read_test.tpl
-    Fix reporting of errors in new_rdwr_XXXX_test.
-
-2008-01-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Apply patch from Yair K. to fix compiles with OSS v4.
-
-    * src/common.h src/float32.c src/double64.c
-    Rename psf->float_enswap to psf->data_endswap.
-
-    * src/sndfile.h.in src/sndfile.c src/pcm.c
-    Add command SFC_RAW_NEEDS_ENDSWAP.
-
-    * tests/command.c
-    Add test for SFC_RAW_NEEDS_ENDSWAP.
-
-    * doc/command.html
-    Document SFC_RAW_NEEDS_ENDSWAP.
-
-    * tests/peak_chunk_test.c
-    Add test function read_write_peak_test. Thanks to Nicolas Castagne for the
-    bug report.
-
-2008-01-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-cmp.c
-    Add new example program contributed by Conrad Parker.
-
-    * examples/Makefile.am
-    Hook into build.
-
-    * doc/development.html
-    Change use or reconfigure.mk to autogen.sh.
-
-2008-01-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/win32_test.c
-    Add another win32 test.
-
-    * tests/util.tpl
-    Add function file_length_fd which wraps fstat.
-
-    * tests/Makefile.am
-    Run the multi_file_test on AU files.
-
-    * tests/multi_file_test.c
-    Use function file_length_fd() instead of file_length() to overcome stupid
-    win32 bug. Fscking hell Microsoft sucks so much.
-
-2008-01-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Fix a rsrc parsing bug. Example file supplied by Uli Franke.
-
-2007-12-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Allow use of either LGPL v2.1 or LGPL v3.
-
-    * tests/header_test.tpl
-    Add header_shrink_test from Axel Röbel.
-
-    * src/wav.c
-    Add fix from Axel Röbel for writing files with float data but no peak
-    chunk (ie peak chunk gets removed after the file is opened).
-
-    * src/aiff.c tests/header_test.tpl
-    Apply similar fix to above for AIFF files.
-
-    * src/wav.c tests/header_test.tpl
-    Apply similar fix to above for WAVEX files.
-
-    * src/command.c
-    Add Ogg/Vorbis to 'get format' commands.
-
-2007-12-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    Fix seeking on multichannel Ogg Vorbis files. Reported by Bodo.
-    Set the default encoding quality to 0.4 instead of 4.0 (Bodo again).
-
-    * tests/ogg_test.c
-    Add stereo seek tests.
-
-2007-12-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/ogg_test.c
-    Add a test (currently failing) for stereo seeking on Ogg Vorbis files. Test
-    case supplied by Bodo.
-
-    * tests/utils.(def|tpl)
-    Add compare_XXX_or_die functions.
-
-2007-12-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix a bug where ignoring ssnd_fmt.offset and ssnd_fmt.blocksize caused
-    misaligned reading of 24 bit data. Thanks to Uli Franke for reporting this.
-
-2007-12-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/vox_adpcm.c src/ima_oki_adpcm.[ch] src/Makefile.am
-    Merge in code from the vox-patch branch. Thanks to Robs for the patch
-    which fixes a long standing bug in the VOX codec.
-
-2007-12-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Fix handling of -override-sample-rate=X option.
-
-2007-11-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c src/VORBIS
-    Merge in Ogg Vorbis support from John ffitch of the Csound project.
-
-2007-11-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Recognise files with 'vox6' extension as 6kHz OKI VOX ADPCM files. Also
-    recognise 'vox8' as and 'vox' as 8kHz files.
-
-    * configure.ac
-    Detect libjack (JACK Audio Connect Kit).
-
-    * examples/sndfile-jackplay.c examples/Makefile.am
-    Add new example program to play sound files using the JACK audio server.
-    Thanks to Jonatan Liljedahl for allowing this to be included.
-
-2007-11-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Update support table with SD2 and FLAC.
-
-2007-11-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix calculation of internal value psf->read_current when attempting to read
-    past end of audio data.
-    Remove redundant code.
-
-    * tests/lossy_comp_test.c
-    Add read_raw_test to check that raw reads do not go past the end of the
-    audio data section.
-    Clean up error output messages.
-
-    * src/sndfile.c
-    Add code to prevent sf_read_raw from reading past the end of the audio data.
-
-    * tests/Makefile.am
-    Add the wav_pcm lossy_comp_test.
-
-2007-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/Makefile.am src/create_symbols_file.py
-    More OS/2 fixes from David Yeo.
-
-2007-11-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c tests/utils.tpl tests/benchmark.tpl
-    Improve handling of requirements for O_BINARY as suggested by Ed Schouten.
-
-2007-11-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Fix symbol class when SF_MIN is nested inside SF_MAX or vice versa.
-
-    * src/create_symbols_file.py
-    Add support for OS/2 contributed by David Yeo.
-
-2007-11-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * M4/gcc_version.m4
-    Add macro AC_GCC_VERSION to detect GCC_MAJOR_VERSION and GCC_MINOR_VERSION.
-
-    * configure.ac
-    Use AC_GCC_VERSION to work around gcc-4.2 inline warning stupidity.
-    See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33995
-    Use -fgnu-inline to prevent stupid warnings.
-
-2007-11-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/util.tpl
-    Increase the printing width for print_test_name().
-
-    * tests/command_test.c tests/Makefile.am
-    Add tests for correct updating of broadcast WAV coding history.
-
-    * examples/sndfilehandle.cc examples/Makefile.am
-    Add example program using the C++ SndfileHandle class.
-
-2007-10-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/sndfile.c
-    Add error codes SFE_ZERO_MAJOR_FORMAT and SFE_ZERO_MINOR_FORMAT.
-
-2007-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Identify sample-rate/sample-size/channels by resource id.
-
-2007-10-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/broadcast.c src/common.h src/sndfile.c
-    Improvements to handling of broadcast info in WAV files. Thanks to Frederic
-    Cornu and other for their input.
-
-2007-10-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC/include/share/alloc.h
-    Mingw fix for SIZE_T_MAX from Uli Franke.
-
-2007-10-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/open_fail_test.c tests/error_test.c tests/Makefile.am
-    Move tests from open_fail_test.c to error_test.c and remove the former.
-
-2007-10-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/scale_clip_test.(def|tpl)
-    Add tests for SFC_SET_INT_FLOAT_WRITE command.
-
-    * doc/command.html
-    Add docs for SFC_SET_INT_FLOAT_WRITE command.
-
-    * examples/sndfile-play.c tests/dft_cmp.c
-    Fix gcc-4.2 warning messages.
-
-2007-10-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c
-    Add command SFC_GET_CURRENT_SF_INFO.
-
-    * src/sndfile.h.in src/sndfile.c src/create_symbols_file.py
-    Remove function sf_get_info (only ever in pre-release code).
-
-    * tests/command_test.c
-    Add test for SFC_GET_CURRENT_SF_INFO.
-
-2007-10-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Add parsing of 'exif' chunks. Originally coded by Trent Apted.
-
-    * configure.ac
-    Put config stuff in Cfg directory.
-    Remove check for inttypes.h.
-
-2007-10-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Fix writing of 'riff' chunk length and check for correct value in parser.
-
-2007-09-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Link to MP3 FAQ entry.
-
-2007-09-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Move the blocksize check to an earlier stage of flac_buffer_copy.
-
-2007-09-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC
-    Huge merge from FLAC upstream.
-
-2007-09-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/*.c
-    Change license to all example programs to BSD.
-
-2007-09-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC/include/FLAC/metadata.h
-    Include <sys/types.h> to prevent compile error on OSX.
-
-    * Octave/octave_test.sh
-    Disable test on OSX. Can't get it to work.
-
-    * src/flac.c
-    Check the blocksize returned from the FLAC decoder to prevent buffer
-    overruns. Reported by Jeremy Friesner. Thanks.
-
-2007-09-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Makefile.am M4/octave.m4
-    Fix build when Octave headers are not present.
-
-2007-08-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/development.html
-    Add note about bzr repository directory looking empty.
-
-2007-08-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac Octave/* M4/octave_*
-    Bunch of changes to add ability to build GNU Octave modules to read/write
-    sound files using libsndfile from Octave.
-
-2007-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * acinclude.m4 configure.ac ...
-    Get rid of acinclude.m4 and replace it with an M4 directory.
-
-2007-08-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Remove crufty Metrowerks compiler support. Allow header file to be compiled
-    on windows with both GCC and microsoft compiler.
-
-2007-08-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/dft_cmp.[ch] tests/floating_point_test.tpl
-    Clean up floating point tests.
-
-2007-08-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix segfault when COMM chunk length is byte swapped.
-
-2007-08-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/mat4.c src/mat5.c src/sndfile.c
-    Add a generic SFE_CHANNEL_COUNT_ZERO error, remove format specific errors.
-
-    * src/au.c
-    Fix crash on AU files with zero channel count. Reported by Ben Alison.
-
-2007-08-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Fix bug in handling file supplied by Matt Olenik.
-
-2007-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/OGG
-    Merge from OGG upstream sources.
-
-2007-07-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC
-    Merge from FLAC upstream sources.
-
-2007-07-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Fix memory leak; set copy parameter to FALSE in call to
-    FLAC__metadata_object_vorbiscomment_append_comment.
-
-    * src/common.[ch]
-    Add function psf_rand_int32().
-
-2007-07-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC
-    Merge from FLAC upstream sources.
-
-    * src/strings.c tests/string_test.c tests/Makefile.am
-    Make sure string tests for SF_STR_LICENSE actually works.
-
-2007-07-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/string_test.c
-    Add ability to test strings stored in metadata secion of FLAC files.
-
-    * src/string.c
-    Fix logic for testing if audio data has been written and string is added.
-    Make sure SF_STR_ALBUM actually works.
-
-    * src/flac.c
-    Finalize reading/writing string metadata. Tests pass.
-
-    * src/sndfile.h.in tests/string_test.c src/flac.c
-    Add string type SF_STR_LICENSE, update test and use for FLAC files.
-
-    * src/sndfile.h.in
-    Add definition for SFC_SET_SCALE_FLOAT_INT_WRITE command.
-
-    * src/common.h src/double64.c src/float32.c src/sndfile.c
-    Add support for SFC_SET_SCALE_FLOAT_INT_WRITE (still needs testing).
-
-2007-07-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Apply patch from Ed Schouten to read artist and title metadata from FLAC
-    files.
-    Improve reporting of FLAC metadata.
-
-    * src/sndfile.h.in tests/string_test.c src/flac.c
-    Add string type SF_STR_ALBUM, update test and use for FLAC files.
-
-2007-06-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC/*
-    Merge from upstream CVS.
-
-2007-06-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC/*
-    Update from upstream CVS.
-
-2007-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/cpp_test.cc
-    Add extra tests for when the SndfileHandle constructor fails.
-
-    * src/sndfile.hh
-    Make sure failure to open the file in the constructor does not allow later
-    calls to other methods to fail.
-
-2007-06-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/util.tpl
-    Add function write_mono_file.
-
-    * tests/generate.[ch] tests/Makefile.am
-    Add files generate.[ch] and hook into build.
-
-    * tests/write_read_test.tpl
-    Add multi_seek_test.
-
-    * src/flac.c
-    Fix buffer overflow bug. Test provided by Jeremy Friesner and fix provided
-    by David Viens.
-
-2007-06-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Minor update.
-
-    * configure.ac src/FLAC/src/libFLAC/ia32/Makefile.am src/Makefile.am
-    Apply patch from Trent Apted make it compile on Intel MacOSX. Thanks Trent.
-
-2007-05-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fix writing of MSGUID subtypes. Thanks to Bruce Sharpe.
-
-2007-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fix array indexing bug raised by Bruce Sharpe.
-
-2007-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC/src/share/getopt/getopt.c
-    Fix Mac OSX / PowerPC compile warnings.
-
-    * configure.ac
-    Make sure WORDS_BIGENDIAN gets correctly defined for FLAC code.
-
-2007-05-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Add Q/A about MP3 support.
-
-2007-05-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/new_file_type.HOWTO
-    Minor updates.
-
-2007-05-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wve.c
-    Fix a couple bad parameters with psf_log_printf.
-
-    * src/pcm.c
-    Improve error reporting.
-
-    * src/common.h src/common.c
-    Constify psf_hexdump.
-
-2007-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC
-    Ditch and re-import required FLAC code.
-
-    * configure.ac
-    Force FLAC__HAS_OGG variable to 1.
-
-    * src/FLAC/src/libFLAC/stream_encoder.c
-    Fix compiler warnings.
-
-2007-04-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac tests/win32_ordinal_test.c
-    Detect if win32 DLL is beging generated and only run win32_ordinal_test if
-    true.
-
-    * src/G72x/Makefile.am src/Makefile.am
-    Use $(EXEEXT) where possible.
-
-2007-04-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wve.c src/common.h src/sndfile.c
-    Complete definition of SfE_WVE_NO_WVE error message.
-
-    * src/wve.c
-    Fix error in files generated on big endian systems. Robustify parsing.
-
-2007-04-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/double64.c
-    Fix clipping of double to short conversions on 64 bit systems.
-
-    * src/flac.c regtest/database.c tests/cpp_test.cc
-    Fix compile warnings for 64 bit systems.
-
-2007-04-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/wav_w64.c
-    Use audio detect function when 'fmt ' chunk data is suspicious.
-
-    * configure.ac
-    Add ugly hack to remove -Werror from some Makefiles.
-
-2007-04-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/GSM610/long_term.c src/macbinary3.c tests/cpp_test.cc
-    Add patch from André Pang to clean up compiles on OSX.
-
-    * src/wve.c src/common.h src/sndfile.c src/sndfile.h.in
-        examples/sndfile-convert.c
-    Merge changes from Reuben Thomas to improve WVE support.
-
-    * tests/lossy_comp_test.c tests/Makefile.am
-    Add tests for WVE files.
-
-2007-04-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add a static SndfileHandle::formatCheck method as suggested by Jorge
-    Jiménez.
-
-2007-04-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a bug in sf_error() where the function itself was being compared
-    against zero. Add a check for a NULL return from peak_info_calloc. Fix a
-    possible NULL dereference.
-
-2007-04-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Turn off seekable flag when writing, return SFE_BAD_RDWR_FORMAT when
-    opening file for RDWR.
-
-    * src/sndfile.c
-    Improve error message for SFE_BAD_RDWR_FORMAT.
-
-    * src/mat4.c
-    Fix array indexing issue. Thanks to Ben Allison (Nullsoft) for alerting me.
-
-2007-03-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Add Q/A 19 on project files.
-
-2007-03-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Guard agains MacOSX universal binary compiles.
-
-    * doc/FAQ.html
-    Add Q/A 18 and clean up Q3.
-
-2007-02-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Add support for 'in24' files.
-
-2007-02-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/wav_w64.c src/wav_w64.h
-    Start work towards detecting ausio codec type from the actual audio data.
-
-    * src/audio_detect.c src/test_audio_detect.c
-    Add new file and its unit test.
-
-2007-02-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/cooledit-fixer.c examples/Makefile.am
-    Remove old broken example program.
-
-2007-02-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/sndfile.h.in src/create_symbols_file.py
-    Add function sf_get_info.
-
-2007-01-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    For ALSA, use the 'default' device instead of 'plughw:0'.
-
-2007-01-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Allow writing of WAV/WAVEX 'BEXT' chunks in SFM_RDWR mode.
-
-2007-01-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/development.html doc/embedded_files.html man/sndfile-play.1
-    Minor documentation fixes. Thanks Reuben Thomas.
-
-2006-12-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Add -override-sample-rate command line option.
-
-2006-11-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Force errno to zero at start of some tests.
-
-    * src/sndfile.c
-    Minor clean up of error handling.
-
-    * configure.ac
-    Remove an assembler test which was failing on OSX.
-
-2006-11-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Fix the definition of SF_PLATFORM_S64 for MinGW.
-
-    * src/FLAC/Makefile.am src/FLAC/share/grabbag/Makefile.am
-    Fix path problems for MinGW.
-
-2006-11-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfendian.h
-    Add include guard.
-
-    * src/Makefile.am src/flac.c
-    Clean up include paths.
-
-    * src/test_conversions.c
-    New file to test psf_binheader_readf/writef functions.
-
-    * src/Makefile.am src/test_file_io.c src/test_log_printf.c src/common.c
-    Clean up unit testing.
-
-    * src/common.c
-    Fix a bug reading/writing 64 bit header fields. Thanks to Jonathan Woithe
-    for reporting this.
-
-    * src/test_conversions.c
-    Complete unit test for above fix.
-
-2006-11-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    More refactoring to clean up psf_open_file() and vairous sf_open()
-    functions.
-
-2006-11-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Apply a patch from Jonathan Woithe to allow opening of (malformed) WAV
-    files of over 4 gigabytes.
-
-2006-11-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Refactor function psf_open_file() to provide a single return point.
-
-    * tests/misc_test.c
-    Fix permission_test to ensure that read only file can be created.
-
-2006-11-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add SF_PLATFORM_S64 macro as a platform independant way of doing signed 64
-    bit integers.
-
-    * src/aiff.c src/svx.c src/wav.c
-    Add warning in log if files are larger than 4 gigabytes in size.
-
-2006-11-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/FLAC src/OGG confgure.ac src/Makefile.am
-    Pull in all required FLAC and OGG code so external libraries are not
-    needed. This makes compiling on stupid fscking Windoze easier.
-
-2006-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Add workaround for switched sample rate and sample size.
-
-    * src/wav.c
-    Add workaround for excessively long coding history in the 'bext' chunk.
-
-2006-10-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c src/wav.c doc/command.html
-    Use SF_AMBISONIC_* instead of SF_TRUE/SF_FALSE.
-
-2006-10-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/wav.c src/wav_w64.c src/common.h doc/command.html
-    Apply a patch from Fons Adriaensen to allow writing on WAVEX Ambisonic
-    files. Still needs a little tweaking before its ready for release.
-
-    * src/*.c
-    Use the UNUSED macro to prevent compiler warnings.
-
-2006-10-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix a bug in parsing AIFF files with a slightly unusual 'basc' chunk. Thanks
-    to David Viens for providing two example files.
-
-    * src/common.(c|h) src/aiff.c
-    Add a function psf_sanitize_string and use it in aiff.c.
-
-2006-10-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_w64.c
-    Apply a patch from Fons Adriaensen which fixes a minor WAVEX GUID issue.
-
-2006-10-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/Makefile.am
-    Fix problem related to recent test coverage changes.
-
-2006-10-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac tests/Makefile.am
-    Add --enable-test-coverage configure option.
-
-2006-10-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add an std::string SndfileHandle constructor.
-
-    * tests/scale_clip_test.tpl
-    Fix the 'make distcheck' target.
-
-2006-10-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/double64.c src/float32.c
-    Add optional clipping on float file data to int read data conversions.
-
-    * tests/tests/scale_clip_test.(def|tpl)
-    Add test for above new code.
-
-2006-09-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/aiff_rw_test.c
-    Add 'MARK' chunks to make sure they are parsed correctly.
-
-2006-09-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix parsing of MARK chunks. Many thanks to Sciss for generating files to
-    help debug the problem.
-
-2006-09-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Make the SF_MIN and SF_MAX macros at least partially type safe.
-
-    * tests/lossy_comp_test.c
-    Fix overflow problems when ensuring that signalis not zero.
-
-2006-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac docs/*.html
-    Changes for release 1.0.17.
-
-2006-08-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Remove inline from functions called by pointer. Thanks to Sampo Savolainen
-    for notifying me of this.
-
-2006-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Add writeSync method.
-    Add copy constructor and assignment operator (thanks Daniel Schmitt).
-    Add methods readRaw and writeRaw.
-    Make read/write/readf/writef simple overlaods instead of templates (thanks
-    to Trent Apted for suggesting this).
-
-    * tests/cpp_test.cc
-    Cleanup. Add tests.
-
-2006-07-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Templatize the read/write/readf/writef methods as suggested by Lars Luthman.
-    Prevent the potential leak of SNDFILE* pointers in the openRead/openWrite/
-    openReadWrite methods.
-    Add const to SF_INFO pointer in Sndfile constructor.
-    Make the destrictor call the close() method.
-
-    * tests/cpp_test.cc
-    Add more tests.
-
-2006-07-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/cpp_test.cc
-    Remove the generated file so "make distcheck" passes.
-
-    * src/Makefile.am
-    Add sndfile.hh to distributed header files.
-
-    * src/sndfile.hh
-    Change the license for the C++ wrapper to modified BSD.
-
-2006-07-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.hh
-    Complete it.
-
-    * tests/cpp_test.cc
-    Add more tests.
-
-2006-07-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl
-    Add extern C to generated header file.
-
-    * src/sndfile.hh
-    Work towards completing this.
-
-    * tests/cpp_test.cc tests/Makefile.am
-    Add a C++ test and hook into build.
-
-    * configure.ac
-    Add appropriate CXXFLAGS.
-
-2006-07-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Test if compiler supports -Wpointer-arith.
-
-    * src/common.c
-    Fix a warning resulting from -Wpointer-arith.
-
-2006-07-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Explicitly set endian-ness as well as setting 16 bit output.
-
-    * examples/sndfile-info.c
-    Make sure to parse info if file fails to open.
-
-    * src/sndfile.c
-    Handle parse error a little better.
-
-    * src/wav_w64.[ch]
-    Minor clean up, add detection of IPP ITU G723.1.
-
-2006-06-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Make sure psf->dataoffset gets reset to zero when openning headersless
-    files based on the file name extension.
-
-2006-06-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/(command|lossy_comp|pcm|scale_clip)_test.c tests/fix_this.c
-        tests/write_read_test.(tpl|def)
-    Fix gcc-4.1 compiler warnings about "dereferencing type-punned pointer will
-    break strict-aliasing rules".
-
-    * examples/cooledit-fixer.c
-    More fixes like above.
-
-2006-06-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fix a windows bug where the syserr string of SF_PRIVATE was not being set
-    correctly.
-
-    * src/sndfile.c
-    Fixed a logic bug in sf_seek(). Thanks to Paul Davis for finding this.
-
-2006-06-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fixed detection of S_IRGRP.
-
-2006-05-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * sndfile-convert.c
-    Add conversion SF_INSTRUMENT data when present.
-
-2006-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/development.html
-    Removed references to tla on windows.
-
-    * src/common.h src/sndfile.c
-    Add separate void pointers for file containter and file codec data to
-    SF_PRIVATE struct. Still need to move all existing fdata pointers.
-
-    * tests/write_read_test.tpl
-    Change the order of some tests.
-
-    * src/aiff.c
-    When writing 'AIFC' files, make sure get an 'FVER' gets added.
-
-    * src/common.h src/(dwvw|flac|g72x|gsm610|ima_adpcm|ms_adpcm|paf|sds).c
-        src/(sndfile|voc|vox_adpcm|xi).c
-    Remove fdata field from SF_PRIVATE struct and replace it with codec_data.
-
-2006-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/testprog.c Win32/Makefile.am
-    Add a minimal win32 test program.
-
-    * Win32/README-precompiled-dll.txt Mingw-make-dist.sh
-    Update readme and Mingw build script.
-
-2006-05-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac acinclude.m4
-    Minor fixes for Solaris.
-
-2006-05-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_endswap.(def|tpl)
-    Fix printf formatting for int64_t on 64 bit machines.
-
-2006-05-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/binhead_check.py
-    New file to check for bad parameters passed to psf_binheader_writef().
-
-    * src/Makefile.am
-    Hook into test suite.
-
-    * src/voc.c src/caf.c src/wav.c src/mat5.c src/mat4.c
-    Fix bugs found by new test program.
-
-    * src/double64.c
-    Clean up double64_get_capability().
-
-2006-05-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_w64.c
-    Fix a bug on x86_64 where an int was being passed via stdargs and being
-    read using size_t which is 64 bits. Thenks to John ffitch for giving me a
-    login on his box.
-
-2006-05-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/caf.c src/double64.c examples/sndfile-info.c tests/virtual_io_test.c
-            tests/utils.tpl
-    Fix a couple of signed/unsigned problems.
-
-2006-05-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    Add channel map tests.
-
-    * src/common.h src/sndfile.c
-    Add a pointer the the SF_PRIVATE struct and make sure it gets freed in
-    sf_close().
-
-2006-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac doc/(command|index|api).html NEWS README
-    Updates for 1.0.16 release.
-
-    * src/sndfile.h.in
-    Define enums for channel mapping.
-
-    * examples/sndfile-info.c
-    Clean up usage of SF_INFO struct.
-
-2006-04-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/util.tpl
-    Add function testing function exit_if_true().
-
-    * tests/floating_point_test.tpl
-    Fix a problem where the test program was not exiting when the test failed.
-
-2006-04-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c src/common.h src/command.c
-    Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS.
-
-    * doc/commands.html
-    Document new commands. Other minor updates.
-
-    * tests/peak_chunk_test.c
-    Update tests for new commands.
-
-2006-04-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/peak_chunk_test.c
-    Add test for RIFX and WAVEX files.
-    Try and confuse the PEAK chunk writing by enabling and disabling it.
-
-    * src/sndfile.c
-    Fix a bug where enabling and disabling PEAK chunk was screwing up.
-
-2006-03-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Add the block of 190 reserved bytes into this struct to allow for
-    future expansion.
-
-    * src/wav.c src/sndfile.c src/broadcast.c
-    Significant cleanup of broadcast wave stuff.
-
-    * examples/sndfile-info.c
-    Fix print message.
-
-    * tests/command_test.c tests/Makefile.am
-    Complete bext tests, hook test in test suite.
-
-2006-03-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Make coding_history field of SF_BROADCAST_INFO struct a char array instead
-    of a char pointer.
-
-    * src/sndfile.c src/common.h src/wav.c
-    Clean up knock on effects of above chnage.
-
-    * examples/sndfile-info.c
-    Add -b command line option to usage message.
-    Clean up output of broadcast wave info.
-
-    * src/wav.c
-    Ignore and skip the 'levl' chunk.
-
-2006-03-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fix handling of --enable and --disable configure args. Thanks to Diego
-    'Flameeyes' Pettenò who sent the patch.
-
-2006-03-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/win32.html
-    Make it really clear that although the MSVC++ cannot compile libsndfile,
-    the precompiled DLL can be used in C++ programs compiled with MSVC++.
-
-2006-03-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix bug in writing of INST chunk in AIFF files.
-    Fix potential bug in writing MARK chunks.
-
-    * src/sndfile.c
-    Make sure the instrument chunk can only be written at the start of the file.
-
-    * tests/command_test.c
-    Add check of log buffer.
-
-    * tests/utils.tpl
-    Add usage of space character to psf_binheader_writef.
-
-2006-03-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/Makefile.am tests/Makefile.am
-    Remove --source-time argument from autogen command lines.
-
-    * src/broadcast.c
-    New file for EBU Broadcast chunk in WAV files.
-
-    * src/sndfile.c src/sndfile.h.in src/wav.c src/common.h
-    Add patch from Paul Davis implementing read/write of the BEXT chunk.
-
-2006-03-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/README-precompiled-dll.txt
-    New file descibing how to use the precompiled DLL.
-
-    * Win32/Makefile.am
-    Add Win32/README-precompiled-dll.txt to EXTRA_DIST files.
-
-    * configure.ac
-    Bump version to 1.0.15.
-
-2006-03-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    On read, only add the endian flag if the file is big endian.
-
-    * src/ms_adpcm.c
-    Fixed writing of APDCM coeffs in RIFX files.
-
-    * tests/write_read_test.tpl tests/lossy_comp_test.c
-    Add tests for RIFX files.
-
-2006-03-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Mingw-make-dist.sh
-    Bunch of improvements.
-
-    * doc/win32.html
-    Update MinGW program versions.
-
-2006-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/create_symbols_file.py
-    Fix the library name in created win32 DEF file. Add correct DLL name for
-    Cygwin DLL.
-
-    * Win32/Makefile.am tests/Makefile.am
-    Remove redundant files, add win32_ordinal_test to test suite.
-
-    * tests/win32_ordinal_test.c
-    Update to do test in cygsndfile-1.dll as well.
-
-    * doc/win32.html
-    Fix typo, mention that -mno-cygwin with the Cygwin compiler does not work.
-
-    * src/wav.c src/wav_w64.c src/sndfile.c src/sndfile.h.in
-    Apply large patch from Jesse Chappell which adds support for RIFX files.
-
-2006-03-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Makefile.am
-    Add Mingw-make-dist.sh to the extra dist files.
-
-    * configure.ac
-    Fix setting SHLIB_VERSION_ARG for MinGW.
-
-    * tests/win32_ordinal_test.c
-    New test program to test that the win32 DLL ordinals agree with the DEF
-    file.
-
-2006-03-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add a static inline function to convert an int to a size_t. This will be
-    a compile to nothing on 32 bit CPUs and a sign extension on 64 bit CPUs.
-
-    * src/aiff.c src/avr.c src/common.c src/xi.c src/gsm610.c
-    Fix an ia64 problem where a varargs function was being passed an int in
-    some places and a size_t in other places.
-
-    * src/sd2.c
-    Add a workaround for situations where OSX seems to add an extra 0x52 bytes
-    to the start of the resource fork.
-
-2006-02-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Mingw-make-dist.sh
-    Add a shell script to build the windows binary/source ZIP file.
-
-    * doc/index.html
-    Add download link for windows binary/source ZIP file. Add links for GPG
-    signatures.
-
-    * doc/win32.html
-    Remove info about building using microsoft compiler.
-
-    * configure.ac
-    Bump version to 1.0.14.
-
-2006-02-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Improve logging of errors in resource fork parser.
-
-2006-01-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.msvc
-    Replace au_g72x.* with g72x.*. Thanks to ussell Borogove.
-
-2006-01-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Make sure return values are initialised header buffer is full.
-
-    * src/wav.c
-    Add workarounds for messed up WAV files.
-
-2006-01-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/config.h
-    Undef HAVE_INTTYPES_H for win32.
-
-    * tests/command_test.c
-    Don't exit on error in instrument test for XI files.
-
-    * configure.ac
-    Bump version to 1.0.13.
-
-    * doc/*.html NEWS README
-    Update version numbers.
-
-2006-01-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/xi.c
-    Start work on add read/write of instrument chunks.
-
-    * src/command_test.c
-    Add tests for XI instrument chunk.
-
-    * tests/largefile_test.c tests/Makefile.am
-    Add new test and hook it into the build system. This test will not be run
-    automatically because it requires 3 Gig of disk space and takes 3 minutes
-    to run.
-
-2006-01-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Fix calculation of samples remaining in win32 code. Thanks Axel Röbel.
-
-    * src/common.h
-    Make sure length of header buffer can hold header plus strings. Thanks Axel
-    Röbel.
-
-2006-01-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/aiff.c src/wav.c
-    Apply a patch from John ffitch (Csound project).
-    Add detune field to SF_INSTRUMENT struct.
-    Add reading/writing instrument chunks to WAV files.
-
-    * tests/command_test.c
-    Update SF_INSTRUMENT tests.
-
-    * tests/Makefile.am
-    Hook instrument tests into test suite.
-
-2006-01-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Check for <inttypes.h> because some broken systems (like Solaris) don't have
-    <stdint.h> which is the 1999 ISO C standard file containing int64_t.
-
-    * src/sfendian.h src/common.h
-    Use <inttypes.h> if <stdint.h> is not available.
-
-2005-12-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/peak_chunk_test.c
-    Extend and clean up tests.
-
-    * src/sndfile.c
-    Fix a bug that prevented the turning off of PEAK chunks.
-
-2005-12-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/error_test.c
-    Make the test distclean correct.
-
-    * src/file_io.c
-    Fix an SD2 MacOSX bug (reported by vince schwarzinger).
-
-2005-12-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c tests/command_test.c
-    Apply a big patch from John ffitch (Csound project) to add reading and
-    writing of instrument chunks to AIFF files. Also update the test.
-
-2005-12-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/aiff_rw_test.c tests/virtual_io_test.c tests/utils.tpl
-    Move test function dump_data_to_file() to utils.tpl.
-
-    * tests/error_test.c tests/Makefile.am
-    Updates, including a new test to test that sf_error() returns a valid error
-    number.
-
-2005-12-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/list_formats.c
-    Make sure the SF_INFO struct is memset to all zero before being used.
-    Thanks to Stephen F. Booth.
-
-    * src/sndfile.c
-    Make the return value of sf_error() match the API documentation.
-
-2005-11-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Allow conversion to raw gsm610.
-
-    * src/common.h src/sndfile.c src/au.c
-    Remove au_nh_open() and all references to it (wasn't working anyway).
-
-    * tests/headerless_test.c
-    Add new test for file extension based detection.
-
-    * src/sndfile.c
-    Rejig file extension based file type detection.
-
-2005-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Add "gsm" as a recognised file extension when no magic number can be found.
-
-    * tests/lossy_comp_test.c tests/Makefile.am
-    Test headerless GSM610.
-
-2005-11-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Fix a minor typo and a minor error. Thanks Christoph Kobe and John Pavel.
-
-2005-10-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_w64.c
-    Add more reporting of 'fmt ' chunk for G721 encoded files.
-
-    * src/wav.c
-    Gernerate a more correct 20 byte 'fmt ' chunk rather than a 16 byte one.
-
-2005-10-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/G72x/g72x.[ch]
-    Minor cleanup of interface.
-
-2005-10-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ogg.c
-    Removed the horribly broken and non-functional OGG implementation when
-    --enable-experimental was enabled. When OGG does finally work it will be
-    merged.
-
-    * src/caf.c
-    Fix a memory leak.
-
-2005-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/g72x.c src/G72x/*.(c|h) src/common.h src/sndfile.c src/wav.c src/au.c
-    Add support for G721 encoded WAV files.
-
-    * doc/index.html
-    Update support matrix.
-
-    * tests/lossy_comp_test.c
-    For file formats that support it, add string data after the audio data and
-    make sure it isn't treated as audio data on read.
-
-    * src/gsm610.c
-    Add code to ensure that the container close function (ie for WAV files) gets
-    called after the codec's close function. This allows GSM610 encoded WAV files
-    to have string data following the audio data.
-    Add an AIFF specific check on psf->datalength.
-
-    * src/wav.c
-    Simplify wav_close function.
-
-    * src/aiff.c
-    Make sure the tailer data gets written at an even file offset. Pad if
-    necessary.
-
-    * src/common.h
-    Replace the close function pointer in SF_PRIVATE with separate functions
-    codec_close and container_close. The former is always called first.
-
-    *  src/*.c
-    Fix knock on effects of above.
-
-2005-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-info.c
-    Complete dumping SF_INSTRUMENT data.
-
-    * src/dwvw.c src/ima_adpcm.c src/gsm610.c src/ms_adpcm.c
-    Add extra checks in *_init function.
-
-    * tests/lossy_comp_test.c
-    Add a string comment to the end of the files to make sure that the decoder
-    doesn't decode beyond the end of the audio data section.
-
-2005-10-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-info.c
-    Minor code cleanup.
-    Start work on dumping SF_INSTRUMENT data.
-
-2005-10-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/common.h src/common.c
-    Update definition of SF_INSTRUMENT struct and create a function to allocate
-    and initialize the struct (input from David Viens).
-    Clean up definition of SF_INSTRUMENT struct.
-
-    * src/wav.c src/wav_w64.c
-    Add support for Ambisoncs B WAVEX files (David Viens).
-
-    * src/aiff.c src/wav.c src/wav_w64.c
-    Start work on reading/writing the SF_INSTRUMENT data.
-
-    * src/sndfile.c
-    Add code to get and set SF_INSTRUMENT data.
-
-    * tests/command_test.* tests/Makefile.am
-    Add test for set and getof SF_INSTRUMENT data.
-    The file command_test.c is no longer autogen generated.
-
-2005-10-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/gsm610.c
-    Minor cleanup.
-
-2005-10-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Minor cleanup.
-
-2005-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Ensure sfconfig.h is included before any other header file.
-
-    * src/file_io.c
-    Add comments documenting the three sections of the file.
-
-    * src/gsm610.c
-    Make sure SF_FORMAT_WAVEX are handled correctly.
-
-2005-10-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add options to allow disabling of FLAC and ALSA. Suggested by Ben Greear.
-
-2005-09-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/locale_test.c
-    Modify the way the unicode strings were encoded so that older compilers
-    do not complain. Thanks Axel Röbel.
-
-    * configure.ac
-    Bump the version to 1.0.12 for release.
-
-    * NEWS README Win32/config.h doc/(FAQ|index.html|command|api).html
-    Update version numbers.
-
-2005-09-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Fix valgrind error and minor cleanup.
-
-2005-09-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/(au|paf|aiff|w64|wav|svx).c
-    Make sure structs are initialised.
-
-2005-09-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Make -Wdeclaration-after-statement work with --enable-gcc-werror configure
-    option.
-    Add -std=gnu99 (C99 plus posix style stuff like gmtime_r) to CFLAGS if the
-    compiler supports it.
-
-2005-09-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac acinclude.m4
-    Add -Wdeclaration-after-statement to CFLAGS if the compilers supports it.
-
-2005-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/util.(tpl|def)
-    Make the test_write_*_or_die() functions const safe.
-
-2005-09-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Make sure the data offset is read from the file header. Thanks to
-    David A. van Leeuwen for a patch.
-
-2005-09-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/sfconfig.h
-    Check for <locale.h> and the function setlocale().
-    Set config variables to zero if not found.
-
-    * tests/locale_test.c tests/Makefile.am
-    Add new test program and hook into build/test system.
-
-2005-09-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/file_io.c
-    On windows, use windows specific types for file handles.
-    Add functions psf_init_files() and psf_use_rsrc().
-
-    * src/sd2.c
-    Make resource fork handling independant of file desciptor/handles.
-
-    * src/sndfile.c src/test_file_io.c
-    Fix knock on effects.
-
-2005-09-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float_cast.h
-    The lrint and lrintf implementations in Cygwin are both buggy and slow.
-    Add replacements which were pulled from the Public Domain MinGW math.h
-    header file.
-
-2005-09-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/(lossy_comp_test|virtual_io_test).c
-    More Valgrind fixups.
-
-    * configure.ac
-    Simplify and correct configuring for Cygwin.
-
-    * Win32/config.h Win32/sndfile.h Win32/Makefile.msvc
-    Update build for MSVC.
-
-2005-09-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Make sure to close SNDFILE when exiting test when file format is not seekable.
-
-    * tests/(aiff_rw_test|virtual_io_test).c
-    Do a few valgrind fix ups.
-
-2005-09-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c src/double64.c
-    Replace floating point equality comparisons with greater/less comparisons.
-    Found by John Pavel using the Intel compiler.
-
-    * src/sfconfig.h
-    New file to clean up issues surrounding autoconf generated preprocessor
-    symbols.
-
-    * src/*.(c|h) tests/*.(c|tpl) examples/*.c
-    Fixed a bunch of other stuff found by John Pavel using the Intel compiler.
-
-    * src/file_io.c
-    Remove Mac OS9 Metrowerks compiler specific hacks.
-
-2005-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Cast integer literal to sf_count_t in call to psf_binheader_writef() to
-    prevent Valgrind error.
-
-2005-08-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Improve documentation of SF_GET_FORMAT_SUBTYPE.
-
-2005-08-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Allow files to be converted to SD2 format.
-
-    * src/sd2.c
-    Fix a bug in reading and writing of SD2 files on little endian CPUs.
-    Thanks to Matthew Willis for finding this.
-
-2005-08-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Update Note2 to point to SFC_SET_SCALE_FLOAT_INT_READ.
-
-2005-08-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Use $host_os instead of $target_os (thanks to Mo De Jong).
-
-2005-08-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/Makefile.am
-    Apply a patch from Mo DeJong to allow building outside of the source dir.
-
-    * src/file_io.c
-    Fix psf_fsync() for win32.
-
-    * src/wav.c src/wav_w64.(c|h)
-    Move some code from wav.c to wav_w64.c to improve the log output of files of
-    type WAVE_FORMAT_EXTENSIBLE.
-
-2005-08-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/create_symbols_file.py
-    Make sure sf_write_fsync is an exported symbol.
-
-    * examples/sndfile-convert.c
-    Add support for writing VOX adpcm files.
-
-2005-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Document the new function sf_write_sync().
-
-    * doc/FAQ.html
-    Do you plan to support XYZ codec.
-
-2005-07-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c
-    Add function sf_write_sync() to the API.
-
-    * src/common.h src/file_io.c
-    Low level implementation (win32 not done yet).
-
-    * tests/write_read_test.tpl
-    Use the new function in the tests.
-
-2005-07-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/double64.c src/float32.c src/sndfile.c
-    Change the way PEAK chunk info is stored. Peaks now stored as an sf_count_t
-    for position and a double as the value.
-
-    * src/aiff.c src/caf.c src/wav.c
-    Fix knock on effects of above changes.
-
-    * src/caf.c
-    Implement 'peak' chunk for file wuth data in SF_FORMAT_FLOAT or
-    SF_FORMAT_DOUBLE format.
-
-2005-07-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Fix a bug where a variable was being used without being initialized.
-
-    * src/flac.c
-    Add extra debug in sf_flac_meta_callback.
-    Make a bunch of private functions static.
-
-    * src/aiff.c src/wav.c
-    Fix allocation for PEAK_CHUNK (bug found using valgrind).
-
-2005-07-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Move the peak_loc field of SF_PRIVATE to the PEAK_CHUNK struct.
-    Remove had_peak field of SF_PRIVATE, use pchunk != NULL instead.
-    Rename PEAK_CHUNK and PEAK_POS to PEAK_CHUNK_32 and PEAK_POS_32.
-
-    * src/aiff.c src/caf.c src/wav.c src/float32.c src/double64.c
-    Fix knock on effects from above.
-
-2005-07-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Prevent files with unknown chunks from being opened read/write.
-
-2005-07-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/flac.c
-    Do not use psf->end_of_file because it never gets set to anything.
-
-    * src/common.h
-    Remove unused SF_PRIVATE field end_of_file.
-
-2005-07-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Change the 'S' format specifier of psf_binheader_writef() to write AIFF
-    style strings (no terminating character).
-
-    * src/aiff.c
-    Move to new (correct) AIFF string style. Thanks to Axel Röbel for being
-    so persistent on this issue.
-
-2005-07-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open().
-
-    * doc/api.html doc/command.html
-    Documentation updates (thanks to Kyroz for promoting these updates).
-
-    * src/mat5.c
-    Modify the way the header is written.
-
-2005-07-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/caf.c
-    Add a 'free' chunk to the written file so that the audio data starts at
-    an offset of 0x1000.
-
-    * src/sndfile.c
-    Allow SFE_UNSUPPORTED_FORMAT as an error from sf_open().
-
-2005-07-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/caf.c src/sndfile.c
-    Add support for signed 8 bit integers.
-
-    * tests/write_read_test.tpl
-    Add test for signed 8 bit integers in CAF files.
-
-    * doc/index.html
-    Update matrix for signed 8 bit integers in CAF files.
-
-2005-07-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Update sf_check_format() to support CAF.
-
-    * examples/sndfile-convert.c
-    Add support for ".caf" file extension.
-
-    * doc/index.html
-    Add Apple CAF to the support matrix.
-
-    * src/caf.c
-    Add file write support.
-
-    * src/common.c
-    Fix printing of Frames.
-
-    * tests/Makefile.am tests/write_read_test.tpl tests/lossy_comp_test.c
-        tests/header_test.tpl misc_test.c
-    Add tests for CAF files.
-
-2005-07-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Fix Q/A about reading/writing memory buffers.
-
-    * src/caf.c
-    Bunch of work to support reading of CAF files.
-
-2005-07-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/(aiff|ima_adpcm|mat4|mat5|ms_adpcm).c examples/sndfile-play.c
-    Fix sign conversion errors reported by gcc-4.0.
-
-    * src/caf.c
-    New file for Apple's Core Audio File format.
-
-    * src/sndfile.c src/common.h src/sndfile.h.in src/Makefile.am
-    Hook new file into build system.
-
-2005-06-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src_wav_w64.c
-    Fix handling of stupidly large 'fmt ' chunks. Thanks to Vadim Berezniker
-    for supplying an example file.
-
-    * src/common.h src/sndfile.c
-    Remove redundant error code SFE_WAV_FMT_TOO_BIG.
-
-2005-06-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/common.h src/sndfile.c
-    Add public error value SF_ERR_MALFORMED_FILE.
-
-    * src/sndfile.c
-    When parsing a file header fails and we don't have a system error, then set
-    the error number to SF_ERR_MALFORMED_FILE (suggested by Kyroz).
-
-    * configure.ac
-    Allow sqlite support to be disabled in configure script.
-
-    * regtest/database.c regtest/sndfile-regtest.c
-    Fix compiling when sqlite is missing.
-
-2005-06-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fix psf_is_pipe() and return value of psf_fread() when using virtual i/o.
-
-    * src/sndfile.c
-    Fix VALIDATE_AND_ASSIGN_PSF macro for virtual i/o.
-
-    * tests/virtual_io_test.c
-    Fill in skeleton test program.
-
-    * tests/Makefile.am
-    Move virtual i/o tests to end of tests with stdio/pipe tests.
-
-    * src/(sndfile.h.in|file_io.c|common.h|sndfile.c) tests/virtual_io_test.c
-    Rename some of the virtual i/o functions and data types.
-
-2005-06-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix the return values of sf_commands : SFC_SET_NORM_DOUBLE,
-    SFC_SET_NORM_FLOAT, SFC_GET_LIB_VERSION and SFC_GET_LOG_INFO. Thanks to
-    Kyroz for pointing out these errors.
-
-    * doc/command.html
-    Correct documented return values for SFC_SET_NORM_DOUBLE and
-    SFC_SET_NORM_FLOAT. Thanks to Kyroz again.
-
-2005-05-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * regtest/*
-    Add new files for sndfile-regtest program.
-
-    * configure.ac Makefile.am
-    Hook regetest into build.
-
-    * src/wav.c src/common.c
-    Fix a regression where long ICMT chunks were causing the WAV parser
-    to exit.
-
-2005-05-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * libsndfile.spec.in
-    Add html docs to the files section as suggested by Karsten Jeppesen.
-
-    * src/aiff.c
-    Fix parsing of odd length ANNO chunks.
-
-2005-05-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Change the include guard to prevent clashes with other code.
-
-2005-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Improve error handling in code for playback under Linux/ALSA.
-
-2005-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ircam.c
-    Fix writing of IRCAM files on big endian systems (thanks to Axel Röbel).
-
-    * src/wav.c
-    Add workaround for files created by the Peak audio editor on Mac which can
-    produce files with very short LIST chunks (thanks to Jonathan Segel who
-    supplied the file).
-
-2005-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Apply a patch From David Viens to make the parsing of basc chunks more
-    robust.
-
-    * src/wav.c
-    Another patch from David Viens to write correct wavex channel masks for
-    the most common channel configurations.
-
-2005-04-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c
-    Only allow FLAC in the format arrays if FLAC is enabled. Thanks to
-    Leigh Smith.
-
-2005-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add a directory field for storing the file directory to the SF_PRIVATE
-    struct.
-
-    * src/sndfile.c
-    Grab the directory name when copying the file path.
-
-    * src/file_io.c
-    Cleanup psf_open_rsrc() and also check for resource fork in
-    .AppleDouble/filename.
-
-2005-03-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/svx.c
-    Fix a bug in the printing of the channel count. Bug reported by Michael
-    Schwendt. Thanks.
-
-2005-01-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    Fix a seek bug for 24 bit PAF files.
-
-    * tests/write_read_test.tpl
-    Update write_read_test to trigger the previously hidden PAF seek bug.
-
-2005-01-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/w64.c src/wav.c
-    Do not return a header parse error when the log buffer overflows.
-    Continuing parsing works even on files where the log buffer does overflow.
-    This avoids a bug on some weirdo WAV (and other) files.
-
-    * src/common.h src/sndfile.c
-    Remove SFE_LOG_OVERRIN error and its associated error message.
-
-    * src/file_io.c
-    Fix a rsrc fork problem on MacOSX.
-
-2004-12-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile-play.c
-    In the ALSA output code, added call to snd_pcm_drain() just before
-    snd_pcm_close() as suggested by Thomas Kaeding.
-    In the OSS output code, added two ioctls (SNDCTL_DSP_POST and
-    SNDCTL_DSP_SYNC) just before the close of the audio device.
-
-    * tests/virtual_io_test.c tests/Makefile.am
-    Add a new test program (currently empty) and add it to the build.
-
-2004-12-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.h src/common.h src/file_io.c
-      src/create_symbols_file.py
-    Apply patch from Steve Baker which is the beginnings of a virtual
-    I/O interface.
-
-2004-12-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c src/sndfile.h.in
-    Const-ify the write path throughout the library.
-
-2004-12-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/development.html
-    Minor improvements.
-
-2004-11-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/bugs.html
-    Minor improvements.
-
-2004-11-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Add workaround for Logic Platinum AIFF files with broken COMT chunks.
-
-2004-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Remove some ambiguities in the SD2 FAQ answer.
-
-2004-11-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/sndfile.h Win32/config.h MacOS9/sndfile.h MacOS9/config.h
-    Updates from autoconfig versions.
-
-2004-11-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fix parsing of COMT chunks. Store SF_STR_COMMENT data in ANNO chunks
-    instead of COMT chunk.
-
-2004-11-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c src/common.h
-    Change the ptr argument to psf_write() from "void*" to a "const void*".
-    Thanks to Tobias Gehrig for suggesting this.
-
-2004-10-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c src/common.h
-    Add functions psf_close_rsrc() and read length of resourse fork into
-    rsrclength field of SF_PRIVATE.
-
-    * src/sd2.c
-    Make sure resource fork gets closed.
-
-    * tests/util.tpl
-    Add functions to check for file descriptor leakage.
-
-    * src/write_read_test.tpl
-    Use the file descriptor leak checks.
-
-    * src/sndfile.h.in
-    Add SFC_GET_LOOP_INFO and SF_LOOP_INFO struct.
-
-    * src/common.h
-    Add SF_LOOP_INFO pointer to SF_PRIVATE.
-
-    * src/wav.c src/aiff.c
-    Improve and add parsing of 'ACID' and 'basc' chunks, filling in
-    SF_LOOP_INFO data in SF_PRIVATE.
-
-2004-10-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sd2.c
-    Further cleanup: remove printfs, change snprintf to LSF_SNPRINTF.
-
-    * Win32/config.h Win32/sndfile.h
-    Updates.
-
-    * tests/util.tpl
-    Add win32 macro for snprintf.
-
-2004-10-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfendian.h
-    Add macros : H2BE_SHORT, H2BE_INT, H2LE_SHORT and H2LE_INT.
-
-    * src/sd2.c
-    Use macros to make sure writing SD2 files on little endian machines works
-    correctly.
-
-    * tests/util.tpl
-    Add a delete_file() function which also deletes the resource fork of SD2
-    files.
-
-    * tests/write_read_test.tpl
-    Use delete_file() so that "make distcheck" works.
-
-2004-10-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/file_io.c
-    Move resource filename construction and testing to psf_open_rsrc().
-
-    * src/common.h src/sndfile.c
-    Add error SFE_SD2_FD_DISALLOWED.
-
-    * tests/util.tpl tests/*.(c|tpl)
-    Add and allow_fd parameter to test_open_file_or_die() so that use of
-    sf_open_fd() can be avoided when opening SD2 files.
-
-2004-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Update ACID chunk parsing.
-
-    * src/sd2.c
-    More fixes for files with large resource forks.
-
-2004-10-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/sndfile.c
-    Add error numbers and messages for sd2 files.
-
-    * src/sd2.c
-    Reading of sd2 (resource fork version) now seems to be working.
-
-2004-10-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.h
-    Update file_io.c to include win32 psf_rsrc_open().
-
-    * tests/floating_point_test.tpl
-    Remove use of __func__ in test programs (MSVC++ doesn't grok this).
-
-    * Win32/(config|sndfile).h MacOS9/(config|sndfile).h
-    Updates.
-
-2004-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfendian.h
-    Fix endswap_int64_t_(array|copy).
-
-    * src/test_endswap.(tpl|def)
-    Add tests for above and inprove all tests.
-
-2004-10-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfendian.h
-    Improve type safety, add endswap_double_array().
-
-    * src/double64.c
-    Use endswap_double_array() instead of endswap_long_array().
-
-    * src/test_endswap.(tpl|def) src/Makefile.am
-    Add preliminary endswap tests and hook into build system.
-
-2004-10-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/configure.ac src/makefile.am
-    Finally fix the bulding of DLLs on Win32/MinGW.
-
-    * tests/makefile.am
-    Fix running of tests on Win32/MinGW.
-
-2004-10-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c tests/floating_point_test.tpl
-    Rename SFC_SET_FLOAT_INT_MULTIPLIER to SFC_SET_SCALE_FLOAT_INT_READ.
-
-    * doc/command.html
-    Document SFC_SET_SCALE_FLOAT_INT_READ.
-
-2004-09-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/floating_point_test.(tpl|def)
-    Derived from floating_point_test.c.
-    Add (float|double)_(short|int)_test functions.
-
-    * tests/util.(tpl|def)
-    Make separate float and double versions of gen_windowed_sine().
-
-    * tests/write_read_test.tpl
-    Fix after changes to gen_windowed_sine().
-
-    * src/(float32|double64).c
-    Implement SFC_SET_FLOAT_INT_MULTIPPLIER.
-
-2004-09-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * acinclude.m4
-    Fix warnings from automake 1.8 and later.
-
-    * examples/sndfile-info.c
-    Add a "fflush (stdout)" after printing Win32 message.
-
-2004-09-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.mingw.in
-    Add a "make install" target.
-
-2004-09-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/common.h src/sndfile.c src/command.c
-    Start work on adding command SFC_SET_FLOAT_INT_MULTIPLIER.
-
-2004-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Fix a bug converting stereo integer PCM files to float.
-
-2004-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Appy patch from Conrad Parker to make Mac OSX error messages more
-    consistent and informative.
-
-    * doc/api.html
-    Fix a HTML HREF which was wrong.
-
-    * doc/win32.html
-    Add information about when nmake fails.
-
-2004-09-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Another patch from Denis Cote to prevent race conditions.
-
-2004-09-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/ms_adpcm.c src/ima_adpcm.c
-    Fix alternative to ISO standard flexible struct array feature for broken
-    compilers.
-
-2004-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/string.c src/sndfile.c
-    Make sf_set_string() return an error if trying to set a string when in
-    read mode.
-
-2004-08-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Change the unnamed union into a named union so gcc-2.95 will compile it.
-
-    * src/*.c
-    Fixes to allow for the above change.
-
-2004-08-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Fixes for Win32. Thanks to Denis Cote.
-
-    * Win32/Win32/Makefile.(msvc|mingw.in)
-    Fix build system after removal of sfendian.h.
-    Build sndfile-convert.
-
-    * src/Makefile.am
-    Remove sfendian.c from dependancies.
-
-2004-08-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Fix typo in comments (thanks Tommi Sakari Uimonen).
-
-2004-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/(a|u)law_test.c
-    Minor cleanup.
-
-2004-07-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/(pcm|float|double64|ulaw|alaw|xi).c
-    Optimise read/write loops by removing a redundant variable.
-
-2004-07-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Remove call to fsync() in psf_close().
-
-2004-07-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    Inline x2y_array() functions where possible.
-
-    * configure.ac
-    Detect presence of type int64_t.
-
-    * src/sfendian.c src/sfendian.h
-    Move functions in the first file to the sfendian.h as static inline
-    functions.
-    Improve endswap_long_*() where possible.
-
-2004-07-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    When converting from unsigned char to float or double, subtract 128 before
-    converting to float/double rather than after to save a floating point
-    operation as suggested by Stefan Briesenick.
-
-    * src/(pcm|sfendian|alaw|ulaw|double64|float32).c
-    Optimize inner loops by changing the loop counting slightly as suggested
-    by Stefan Briesenick.
-
-    * configure.ac
-    Detect presence of <byteswap.h>.
-
-    * src/sfendian.h
-    Use <byteswap.h> if present as suggested by Stefan Briesenick.
-
-    * src/pcm.c
-    Update bytewapping.
-
-2004-07-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/*.c
-    Change the psf->buffer field of SF_PRIVATE into a more type safe union with
-    double, float, int etc elements.
-
-2004-06-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Merge slightly modifed patch from Stanko Juzbasic which allows playback of
-    mono files on MacOSX.
-
-2004-06-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Move copy_metadata() after the second sf_open().
-
-2004-06-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Fix a bug which caused the program to go into an infinite loop if the source
-    file has no meta-data. Thanks to Ron Parker for reporting this.
-
-    * src/sndfile.h.in
-    Add SF_STR_FIRST and SF_STR_LAST to allow enumeration of string types.
-
-    * Win32/sndfile.h MacOS9/sndfile.h
-    Update these as per the above file.
-
-2004-06-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/common.h src/ogg.c src/sndfile.c src/sndfile.h.in
-      src/Makefile.am
-    Apply large patch from Conrad Parker implementing Ogg Vorbis, Ogg Speex and
-    Annodex support via liboggz and libfishsound. Thanks Conrad.
-
-2004-06-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/avr.c src/ircam.c src/nist.c src/paf.c src/xi.c
-    Add cast to size_t for some parameters passed to psf_binheader_writef. This
-    is Debian bug number 253490. Thanks to Anand Kumria and Andreas Jochens.
-
-    * src/w64.c
-    Found and fixed a bug resulting from use of size_t when writing W64 'fmt '
-    chunk.
-
-2004-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Bump version to 1.0.10 ready for release.
-
-    * Makefile.am
-    Remove redundant files (check_libsndfile.py libsndfile_version_convert.py)
-    from distribution tarball.
-
-    * tests/header_test.tpl
-    Fix uninitialised variable.
-
-    * src/GSM610/short_term.c
-    Fix compiler warning on MSVC++.
-
-2004-05-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Improve record keeping of chunks seen and return an error if a file with
-    unusual chunks is opened in mode SFM_RDWR.
-
-    * src/mmreg.h
-    This file not needed so remove it.
-
-2004-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/header_test.tpl
-    Add extra_header_test().
-
-    * src/common.h src/sndfile.c
-    Add SFE_RDWR_BAD_HEADER error number and string.
-
-2004-05-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl tests/*.c tests/*.tpl
-    Add a line number argument to check_log_buffer_or_die() and update all
-    files that use that function.
-
-    * tests/header_test.tpl
-    Modify/update tests for files opened SFM_RDWR and SFC_UPDATE_HEADER_AUTO.
-
-    * src/aiff.c src/wav.c
-    Fix another bug in AIFF and WAV files opened in SFM_RDWR and using
-    SFC_UPDATE_HEADER_AUTO.
-
-    * src/test_file_io.c
-    Add a test for psf_ftruncate() function.
-
-2004-05-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix another  weird corner case bug found by Martin Rumori. Thanks.
-
-    * tests/header_test.(tpl|def)
-    Two new files to test for the absence of the above bug and include tests
-    moved from tests/misc_test.c.
-
-    * tests/Makefile.am
-    Hook new tests into build/test system.
-
-    * tests/misc_test.c
-    Remove update_header_test() which has been moved to the new files above.
-
-2004-05-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fixed a bug reported by Martin Rumori on the LAD list. If a file created
-    with a format of SF_FORMAT_FLOAT and then closed before any data is written
-    to it, the header can get screwed up (PEAK chunk gets overwritten).
-
-    * tests/write_read_test.tpl
-    Add a test (empty_file_test) for the above bug.
-
-2004-05-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.mingw.in
-    Added a Makefile for MinGW (needs to be processed by configure).
-
-    * src/mmsystem.h src/mmreg.h
-    Add files from the Wine project (under the LGPL) to allow build of
-    sndfile-play.exe under MinGW.
-
-2004-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/GSM610/gsm610_priv.h
-    Replace ugly macros with inline functions.
-
-    * src/GSM610/*.c
-    Remove temporary variables used by macros and other minor fixes required by
-    above change.
-
-2004-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pipe_test.tpl tests/stdio_test.c Win32/Makefile.msvc
-    Make sure these programs compile (even though they do nothing) on Win32
-    and add them to the "make check" target.
-
-    * src/sfendian.h
-    Fix warning on Sparc CPU and code cleanup.
-
-2004-05-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fix warning messages when compiling under MinGW.
-
-2004-05-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Set HAVE_FLEXIBLE_ARRAY in src/config.h depending on whether the compiler
-    accepts the flexible array struct member as per 1999 ISO C standard.
-
-    * src/common.h src/ima_adpcm.c src/paf.c src/ms_adpcm.c
-    Added ugly #if HAVE_FLEXIBLE_ARRAY and provided a non-standards compliant
-    hack for non 1999 ISO C compliant compilers.
-
-2004-04-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/strings.c
-    If adding an SF_STR_SOFTWARE string, only append libsndfile-X.Y.Z if the
-    string does not already have libsndfile in the string. Thanks to Conrad
-    Parker.
-
-    * tests/string_test.c
-    Add test to verify the above.
-
-    * examples/sndfile-convert.c
-    Add ability to transcode meta data as well (Conrad Parker).
-
-2004-04-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Fix minor error. Thanks to Simon Burton.
-
-    * doc/win32.html
-    Started adding instructions for compiling libsndfile under MinGW.
-
-    * configure.ac
-    Add --enable-bow-docs to enable black text on a white background HTML docs.
-
-    * doc/libsndfile.css.in
-    This is now a template file for configure which sets the foreground and
-    background colours.
-
-2004-04-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Do some MinGW fixes.
-
-    * configure.ac doc/Makefile.am
-    Install HTML docs when doing make install.
-
-2004-04-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-info.c
-    Print out the dB level with the signal max.
-
-2004-04-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Define S_ISSOCK in src/file_io.c if required.
-
-2004-04-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Improve printout configuration summary (as suggested by Axel Röbel).
-
-    * doc/index.html
-    Add link to pre-release location.
-
-    * src/sndfile.h.in
-    Remove comma after last element of enum.
-
-    * src/float32.c src/double64.c
-    Fix read/write of float/double encoded raw files to/from pipes.
-
-    * tests/pipe_test.c tests/pipe_test.tpl tests/pipe_test.def
-    Turn pipe_test.c into an autogenerated file and add tests for reading/
-    writing floats and doubles.
-
-    * tests/Makefile.am
-    Hook tests/pipe_test.* into build system.
-
-2004-04-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac acinclude.m4
-    Rename AC_C_STRUCT_HACK macro to AC_C99_FLEXIBLE_ARRAY.
-
-2004-03-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Perform update_header_test in RDWR mode as well.
-
-    * src/aiff.c
-    Fix problems when updating header in RDWR mode.
-
-2004-03-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/w64.c src/wav_w64.c
-    Integrate code supplied by David Viens for supporting microsoft's
-    WAVEFORMATEXTENSIBLE stuff. Thanks David for supplying this.
-
-    * configure.ac doc/*.html
-    Bump version to 1.0.9.
-
-2004-03-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c src/sndfile.c src/sndfile.h.in src/wav.c
-    Started work on supporting microsoft's WAVEFORMATEXTENSIBLE gunk.
-
-2004-03-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/avr.c
-    New file to handle Audio Visual Resaerch files.
-
-    * src/sndfile.h.in src/common.h src/sndfile.c src/command.c
-    Hook AVR into everything else.
-
-    * tests/Makefile.am tests/write_read_test.tpl tests/misc_test.c
-    Add testing for AVR files.
-
-2004-03-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fix psf_set_file() for win32. Thanks to Vincent Trussart (Plogue Art et
-    Technologie) for coming up with the solution.
-
-2004-03-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Fixed a bug that was causing valgrind to report a memory leak. The bug was
-    in the test code itself, not the library.
-
-2004-03-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/generate.cs
-    An example showing how to use libsndfile from C#. Thanks to James Robson
-    for providing this.
-
-2004-03-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fix problems with WAV files containing large chunks after the 'data'
-    chunk. Thanks to Koen Tanghe for providing a sample file.
-
-2004-03-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Detect presense of ALSA (Advanced Linux Sound Architecture).
-
-    * examples/sndfile-play.c
-    Add ALSA output support.
-
-    * examples/Makefile.am
-    Add ALSA_LIBS to link line of sndfile-play.c.
-
-2004-03-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * acinclude.m4
-    Add new macro (AC_C_STRUCT_HACK) to detect whether the C compiler allows
-    the use of the what is known as the struct hack introduced by the 1999 ISO
-    C Standard.
-
-    * configure.ac
-    The last release would not compile with gcc-2.95 due to the use of features
-    (ie struct hack) introduced by the 1999 ISO C Standard.
-    Add check to make sure compiler handles this and bomb out if it doesn't.
-
-2004-03-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Fix compiler warning on Win32.
-
-    * src/file_io.c
-    Fix use of an un-initialised variable in Win32 stuff.
-
-    * Win32/config.h examples/sndfile-play.c
-    Win32 fixes.
-
-2004-03-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fix bug which occurres when configuring for MinGW.
-    If compiler is gcc and cross compiling use -nostdinc.
-
-2004-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/aiff.c src/wav.c src/float32.c src/double64.c
-      src/sndfile.c
-    Fix a bug with PEAK chunk handling for files with more than 16 channels.
-    Thanks to Remy Bruno for finding this.
-
-2004-03-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fix a bug which was preventing WAV files being openned correctly if the
-    file had a very large header. Thanks to Eldad Zack for finding this.
-
-2004-03-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/file_io.c
-    Fix cross-compiling from Linux to Win32 using the MinGW tools.
-
-2004-03-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/create_symbols_file.sh
-    Christian Weisgerber pointed out that the shell script did not run on a
-    real Bourne shell although it did run under Bash in Bourne shell mode.
-
-    * src/create_symbols_file.py
-    Rewrite of above in Python. Also add support for writing Win32 .def files.
-    The Python script generates Symbols.linux, Symbols.darwin and
-    libsndfile.def (Win32 version). These files get shipped with the tarball
-    so there should not be necessary to run the Python script when building
-    the code from the tarball.
-
-    * configure.ac src/Makefile.am Win32/Makefile.am
-    Hook new Python script into the build system.
-
-2004-02-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/configure.ac
-    Add --enable-gcc-werror option and move GCC specific stuff down.
-
-2004-02-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * acinclude.m4 configure.ac
-    Fix clip mode detection (tested in one of HP's testdrive Itanium II boxes).
-
-    * src/file_io.c
-    Added check for sizeof (off_t) != sizeof (sf_count_t) to prevent recurrence
-    of missing large file support on Linux and Solaris.
-
-2004-02-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Fix a MacOSX specific bug which was caused by a space being inserted in
-    the middle of a file name.
-
-    * configure.ac src/Makefile.am examples/Makefile.am
-    Fix a couple of MacOSX build issues.
-
-2004-02-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Document SFC_SET_CLIPPING and SFC_GET_CLIPPING.
-
-2004-02-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/*.html
-    Applied patch from Frank Neumann (author of lakai) which fixes many minor
-    typos in documentation. Thanks Frank.
-
-2004-02-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * ChangeLog
-    Changed my email address throughout source and docs.
-
-2004-02-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Make sure config.h is included before stdio.h to make sure large file
-    support is enabled on Linux (and Solaris).
-
-    * tests/misc_test.c
-    Disable update_header test on Win32. This should work but doesn't and
-    I'm not sure why.
-
-    * Make.bat Win32/Makefile.msvc
-    Updates.
-
-2004-01-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Changed logindex, headindex and headend files of SF_PRIVATE from unsigned
-    int to int to prevent weird arithmetic bugs.
-
-    * src/common.c src/aiff.c src/wav.c src/w64.c
-    Fixed compiler warnings resulting from above change.
-
-2004-01-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fixed a bug in header reader for some files with data after the sample data.
-
-2003-12-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c tests/Makefile.am
-    Add tests for AIFF/IMA files.
-
-2003-12-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/macbinary3.c src/macos.c
-    Two new files required for handling SD2 files.
-
-    * src/common.h
-    Add prototypes for functions in above two files.
-
-    * src/Makefile.am
-    Hook new files into build system.
-
-2003-12-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add checks for mmap() and getpagesize() which might be used at some time
-    for faster file reads.
-    Add detection of MacOSX.
-
-2003-12-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Minor mods to pkg-config section.
-
-2003-12-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/create_symbols_file.sh
-    Andre Pang (also known as Ozone) pointed out that on MacOSX, all non
-    static symbols are exported causing troubles when trying to link
-    libsndfile with another library which has any of the same symbols.
-    He fixed this by supplying the MacOSX linker with a file containing
-    all the public symbols so that only they would be exported and then
-    supplied a patch for libsndfile.
-    This wasn't quite ideal, because I would have to maintain two (3 if
-    you include Win32) separate files containing the exported symbols.
-    A better solution was to create this script which can generate a
-    Symbols file for Linux, MacoSX and any other OS that supports
-    minimising the number of exported symbols.
-
-    * configure.ac src/Makefile.am
-    Hook the new script into the build process.
-
-2003-12-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Added comments about Steve Dekorte's SoundConverter scam.
-
-2003-12-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Axel Röbel pointed out that on Mac OSX a pipe is not considered a fifo
-    (S_ISFIFO (st.st_mode) is false) but a socket (S_ISSOCK (st.st_mode) is
-    true). The test has therefore been changed to is S_ISREG and anything
-    which which does not return true for S_ISREG is considered a pipe.
-
-2003-11-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Fix update_header_test to pass SDS.
-
-    * src/sds.c
-    More minor fixes.
-
-    * tests/floating_point_test.c
-    Add test for SDS files.
-
-    * src/command.c
-    Add SDS to major_formats array.
-
-2003-11-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl tests/misc_test.c
-    Add tests for SDS files.
-
-    * src/sds.c
-    Fix a bug in header update code.
-
-2003-11-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sds.c
-    Get file write working.
-
-    * src/paf.c
-    Fix a potential bug in paf24_seek().
-
-2003-11-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Add Q/A about u-law encoded WAV files.
-
-    * Win32/*.h
-    Updated so it compiles on Win32.
-
-2003-11-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Add -alaw and -ulaw command line arguments.
-
-    * configure.ac
-    Add library versioning comments.
-    Add arguments to AC_INIT.
-
-2003-10-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Ross Bencina has contributed code to replace all of the (mostly broken)
-    Win32 POSIX emulation calls with calls the native Win32 file I/O API.
-    This code still needs testing but is likely to be a huge improvemnt
-    of support for Win32. Thanks Ross.
-
-2003-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/dwvw.c
-    Removed filedes field from the DWVW_PRIVATE struct.
-
-    * src/file_io.c
-    Change psf_fopen() so it returns psf->error instead of the file descriptor.
-    Add new functions psf_set_stdio() and psf_set_file().
-
-    * src/sndfile.c
-    Change these to work with changed psf_fopen() return value.
-    Remove all uses of psf->filedes from sndfile, making it easier to slot native
-    Win32 API file handling functions.
-
-    * src/test_file_io.c
-    Minor changes to make it compile with new file_io.c stuff.
-
-2003-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/gsm610.h
-    Rename a variable from true to true_flag. As Ross Bencina points out,
-    true is defined in the C99 header <stdbool.h>.
-
-    * src/file_io.c
-    If fstat() fails, return SF_TRUE instead of -1 (Ross Bencina).
-
-2003-10-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Increase the size of SF_BUFFER_LEN and SF_HEADER_LEN.
-
-    * src/sndfile.c
-    Fix sf_read/write_raw which were dividing by psf->bytwidth and
-    psf->blockwidth which can both be zero.
-
-    * examples/sndfile-info.c
-    Increase size of BUFFER_LEN.
-
-2003-09-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add checks for <sys/wait.h> and ssize_t.
-    Other Win32/MinGW checks.
-
-    * src/aiff.c src/au_g72x.c src/file_io.c src/gsm610.c src/interleave.c
-      src/paf.c src/sds.c src/svx.c src/voc.c src/w64.c src/wav.c src/xi.c
-    Fix compiler warnings.
-
-2003-09-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/scale_clip_test.tpl
-    Add definition of M_PI if needed.
-
-2003-09-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Detect if S_IRGRP is declared in <unistd.h>.
-
-    * src/file_io.c tests/*.tpl tests/*.c
-    More fixes for Win32/MSVC++ and MinGW. MinGW does have <unistd.h> but that
-    file doesn't declare S_IRGRP.
-
-2003-10-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/config.h.in
-    Add comment stating that the sf_count_t typedef is determined when
-    libsndfile is being compiled.
-
-    * tests/utils.tpl
-    Modified so that utils.c gets one copy of the GPL and not two.
-
-
-2003-09-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/unistd.h src/sf_unistd.h
-    Move first file to the second. This will help for Win32/MSVC++ and MinGW.
-
-    * Win32/Makefile.am src/Makefile.am
-    Changed in line with above.
-
-    * Win32/Makefile.msvc
-    Removed "/I Win32" which is no longer required.
-
-    * src/file_io.c src/test_file_io.c tests/*.tpl tests/*.c
-    If HAVE_UNISTD_H include <unistd.h> else include <sf_unistd.h>. This should
-    work for Win32, MinGW and other fakes Unix-like OSes.
-
-    * src/*.c
-    Removed #include <unistd.h> from files which didn't need it.
-
-2003-09-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * libsndfile.spec.in
-    Apply fix from Andrew Schultz.
-
-2003-09-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/vox_adpcm.c
-    Only set psf->sf.samplerate if the existing value is invalid.
-
-2003-09-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Started adding support for ALSA output.
-
-2003-09-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Removed <stdlib.h> from sndfile.h.
-
-    * src/*.c examples/*.c tests/*.c tests/*.tpl
-    Added <stdlib.h> where needed.
-
-2003-09-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Added ARRAY_LEN, SF_MAX and SF_MIN macros.
-
-2003-08-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Remove statements about alternative licensing arrangements.
-
-2003-08-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * MacOS MacOS9 Makefile.am configure.ac
-    Change directory name from MacOS to MacOS9
-
-    * MacOS9/MacOS9-readme.txt
-    Change name to make it really obvious, add text to top of file to make it
-    still more obvious again.
-
-2003-08-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_log_printf.c
-    Add tests for %u conversions.
-
-    * src/common.c
-    Fix psf_log_printf() %u conversions.
-
-2003-08-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fixed a bug where opening a file with a non-trival header in SFM_RDWR mode
-    would over-write part of the header. Thanks to Axel Röbel for pointing
-    this out. Axel also provided a patch to fix this but I came up with a
-    neater and more general solution.
-    Return error when openning an AIFF file with data after the SSND chunk
-    (Thanks Axel Röbel).
-
-    * tests/aiff_rw_test.c
-    Improvements to test program which will later allow it to be generalised to
-    test WAV, SVX and others as required.
-
-2003-08-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pipe_test.c
-    Add useek_pipe_rw_test() submitted by Russell Francis.
-
-    * src/sndfile.c
-    In sf_open_fd(), check if input file descriptor is a pipe.
-
-    * src/sndfile.[ch]
-    Fix typo in variable name do_not_close_descriptor.
-
-2003-08-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_log_printf.c
-    Improve the tests for %d and %s conversions.
-
-    * src/common.c
-    Fixed a few problems in psf_log_printf() found using new tests.
-
-2003-08-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add -Wwrite-strings warning to CFLAGS if the compiler is GCC. Thanks to
-    Peter Miller (Aegis author) for suggesting this and supplying a patch.
-
-    * src/*.c examples/*.c tests/*.c
-    Fix all compiler warnings arising from the above.
-
-2003-08-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/aiff_rw_test.c tests/Makefile.am
-    New test program to check for errors re-writing the headers of AIFC files
-    opened in mode SFM_RDWR.
-
-2003-07-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Applied a patch from Tero Pelander to allow this program to run on systems
-    using devfs which used /dev/sound/dsp instead of /dev/dsp.
-
-2003-07-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/new_file_type.HOWTO
-    Updated document. Still incomplete.
-
-2003-06-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fix VALIDATE_SNDFILE_AND_ASSIGN_PSF which was returning an error rather
-    than saving it and returning zero.
-
-2003-06-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Two fixes for Mac OS9.
-    Fix all casts from sf_count_t to ssize_t (not size_t).
-
-2003-06-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fix for reading files with RIFF length of 8 and data length of 0.
-
-2003-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c tests/*.c tests/*.tpl
-    Added comments to mark code for removal when make Lite version of
-    libsndfile.
-
-2003-06-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Add extra error checking for unrecognised arguments.
-
-2003-06-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ima_adpcm.c
-    Started adding code to write IMA ADPCM encoded AIFF files.
-
-    * src/test_log_printf.c src/Makefile.am
-    New file to test psf_log_printf() function and add hooks into build system.
-
-    * src/common.c
-    Move psf_log_printf() function to top of the file and only compile the rest
-    of the file if if PSF_LOG_PRINTF_ONLY is not defined.
-
-2003-06-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/config.h Win32/sndfile.h
-    Updated with new config variables.
-
-    * Win32/unistd.h src/file_io.c
-    Added implementation of S_ISFIFO macro which Win32 seems to lack and is
-    used in src/file_io.c.
-
-    * tests/utils.tpl
-    Added #include <unitstd.h> to pull in Win32/unistd.h so it compiles for
-    Win32.
-
-    * src/Makefile.msvc
-    Added src\test_file_io.exe build target and run this as the very first
-    test.
-
-    * tests/win32_test.c
-    Add support for testing Cygwin32.
-
-    * configure.ac
-    Detect POSIX fsync() and fdatasync() functions.
-
-    * src/file_io.c
-    If compiling for Cygwin, call fsync() before calling fstat() to retrieve
-    file length.
-
-    * tests/pcm_test.tpl
-    Add a test for lrintf() function. This was required to detect a really
-    broken lrint() and lrintf() on Cygwin.
-
-    * tests/misc_test.c
-    Don't run permission test when compiling under Cygwin.
-
-    * src/float_cast.h
-    Fix fallback macro for lrint() and lrintf() to cast to long instead of int
-    to match official function prototypes.
-
-2003-06-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-convert.c
-    Modifications to improve accuracy of conversions; use double data for
-    floating point and int for everything else.
-
-    * src/ima_apdcm.c
-    Completed work on decoding IMA ADPCM encoded AIFF files. Still need to
-    get encoding working.
-
-2003-05-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/ima_adpcm.c
-    Start working on getting IMA ADPCM encoded AIFF files working.
-
-2003-05-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fixed the touch command for when the autogen program is not found (Matt
-    Flax).
-
-    * src/ulaw.c src/alaw.c
-    Made these pipe-able.
-
-2003-05-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c src/ircam.c
-    Fixed writing to pipe.
-
-    * src/wav.c src/aiff.c src/nist.c src/mat*.c src/svx.c src/w64.c
-    Return SFE_NO_PIPE_WRITE if an attempt is made to write to a pipe.
-
-2003-05-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-info.c
-    Modified to detect unknown file lengths.
-
-    * src/mat4.c
-    Fix reading from a pipe.
-
-2003-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pipe_test.c
-    Add more file types to tests.
-
-    * src/mat4.c
-    Removed explicit setting of psf->sf.seekable to SF_TRUE.
-
-    * tests/utils.tpl
-    Add macro for generating and check data in the stdio and pipe tests.
-
-    * tests/stdout_test.c tests/stdin_test.c
-    Use the above macro to generate known data on output and check data on
-    input.
-
-    * src/voc.c src/htk.c common.h sndfile.c
-    Disallow reading/writing VOC and HTK files from/to pipes be returning new
-    error values.
-
-    * src/w64.c
-    Fixes to allow reading from a pipe.
-
-2003-05-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac src/sndfile.h.in
-    When the configure script determines the sizeof (sf_count_t), also set the
-    value of SF_COUNT_MAX in sndfile.h.
-
-    * configure.ac
-    Remove -pedantic flag from default GCC compiler flags.
-
-    * tests/pipe_test.c
-    Add a pipe_read_test() before doing pipe_write_test().
-
-    * tests/scale_clip_test.c
-    Add test to make sure non-normalized values also clip in the right way.
-
-2003-05-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Add test to detect processor clipping capabilities.
-
-    * tests/stdin_test.c tests/stdout_test.c
-    Fix a pair of compiler warnings.
-
-    * src/common.h
-    Add new pipeoffset field to SF_PRIVATE. This will contain the current file
-    offset when operating on a pipe.
-
-    * src/common.c
-    Removed direct calls to psf_fread()/psf_fseek()/psf_fgets() etc from
-    psf_binheader_readf and redirect them to new buffered versions
-    header_read(), header_seek() and header_gets().
-    Add "G" format specifier to emulate fgets() functionality with buffering.
-    This will allow reading some file types from pipes.
-
-    * src/file_io.c
-    When the file descriptor is a pipe, manintain psf->pipeoffset.
-
-    * src/pvf.c
-    Change use of psf_fgets() to psf_binheader_readf() as required but changes to header re
-
-    * src/au.c
-    Fix reading from a pipe.
-
-2003-05-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    Add clipping versions of the f2XXX_array() functions to allow option of
-    clipping data that would otherwise overflow.
-
-    * tests/scale_clip_test.tpl tests/scale_clip_test.def
-    New files test that clipping option does actually work.
-
-2003-05-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Fixed a typo ("OS(" instead of "OS9").
-
-2003-05-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/open_fail_test.c
-    Include <string.h> to prevent warning message of missing declaration of
-    memset().
-
-2003-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Add new "add_clipping" field to SF_PRIVATE.
-
-    * src/sndfile.h.in src/sndfile.c
-    Add command SFC_SET_CLIPPING which sets/resets add_clipping field.
-
-2003-05-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Add docs for sf_set_string() and sf_get_string().
-
-    * src/common.h src/sndfile.c
-    Add new SFE_STR_BAD_STRING error.
-
-    * tests/stdin_test.c tests/stdout_test.c
-    Removed all non-error print statements.
-
-    * tests/stdio_test.c tests/pipe_test.c tests/Makefile.am
-    Add print statements removed from two files above.
-
-2003-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * libsndfile.spec.in
-    Fixed a coulpe of minor errors discovered by someone calling themselves
-    Agent Smith.
-
-    * src/common.c src/common.h src/file_io.h
-    Added is_pipe field to SF_PRIVATE and declaration of psf_is_pipe()
-    function. (Axel Röbel)
-
-    * src/sndfile.c
-    Fixed determination of whether the file is a pipe. (Axel Röbel)
-
-    * src/paf.c
-    Force paf24 to start with undefined mode. (Axel Röbel)
-
-    * tests/pipe_test.c
-    Mods to make this test work and actually do the test on RAW files. (Axel
-    Röbel).
-
-2003-05-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a potential bug where psf->sf.seekable was being set to FALSE when
-    operating on stdin or stdout but then the default initialiser was reseting
-    it to TRUE. Thanks to Axel Röbel.
-
-    * src/aiff.c
-    Fixed a bug in the header parser where it was not handling an odd length
-    COMM chunk correctly. Thanks to Axel Röbel.
-
-    * src/test_file_io.c
-    Add more tests.
-
-    * tests/win32_test.c
-    New file for showing the bugs in the Win32 implementation of the POSIX API.
-    It also runs on Linux for sanity checking.
-
-    * tests/Makefile.am Win32/Makefile.msvc
-    Hook the new test program into the build system.
-
-2003-05-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/test_file_io.c
-    New test program to test operation of functions defined in file_io.c. This
-    should make supporting win32 significantly easier.
-
-    * src/Makefile.am
-    Hook new test program into the build system.
-
-    * src/file_io.c
-    Add compile/run time check that sizeof statbuf.st_size and sf_count_t are
-    the same.
-
-    * src/common.h src/sndfile.c
-    Added new error code and error message for new check.
-
-    * tests/benchmark.tpl
-    Fix to use frames instead of samples in SF_INFO.
-
-2003-05-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    More stuffing about working around PLAIN OLD-FASHIONED **BUGS** in Win32.
-
-    * examples/sndfile-info.c
-    Applied patch from Conrad Parker to add "--help" and "-h" options as
-    well as an improved usage message.
-
-2003-05-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c
-    Added embedded file support.
-
-    * tests/multi_file_test.c
-    Added tests for embedded AU files.
-    Added verbose testing mode.
-
-    * src/common.h src/sndfile.c
-    Added an embedded AU specific error code and message.
-
-    * src/wav.c
-    Added patch from Conrad Parker which filled in a little more information
-    about ACIDized WAV files.
-
-2003-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fixed Win32 version of psf_fseek() which was calling psf_get_filelen()
-    which was in turn calling psf_fseek() which in the end blew the stack.
-    Now of course this would have been easy to find on Linux, but this blow
-    up was happening in kernel32.dll and the fscking MSVC++ debugger couldn't
-    figure out what call caused this (it couldn't even tell me the stack had
-    overflowed) and was absolutley useless for this debugging exercise.
-    On top of that, the reason I got into this mess was that windoze doesn't
-    have a working fstat() function which can return file lengths > 2 Gig. It
-    HAS a fscking _fstati64() but the file length value is only updated AFTER
-    the bloody file is closed. That makes it completely useless.
-    How the hell do people stand working on this crap excuse of an OS?
-
-2003-04-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/unistd.h src/file_io.c
-    Moved definitions of S_IGRP etc from file_io.c to unistd.h so that these
-    can be used in the test programs.
-
-    * Win32/libsndfile.def
-    Added sf_open_fd.
-
-    * Win32/sndfile.h
-    Updated to match src/sndfile.h.in.
-
-    * Win32/Makefile.msvc
-    Added dither.c and htk.c to libsndfile.dll target.
-
-2003-04-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    First attempt at getting the Win32 versions of the these functions working.
-    They still need to be tested.
-
-2003-04-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/strings.c
-    Found and fixed a bug which was causing psf_store_string() to fail on
-    Motorola 68k processors. Many thanks fo Joshua Haberman (Debian maintainer
-    of libsndfile) for compiling and running debug code to help me debug the
-    problem.
-
-2003-04-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/file_io.c src/wav.c src/aiff.c
-    Much hacking to get reading and writing of embedded files working (ie sound
-    files at a non-zero files offset).
-
-    * doc/embedded_files.html
-    First pass atempt at documenting reading/writing embedded files.
-
-2003-04-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Updated answer to "Why doesn't libsndfile do interleaving/de-interleaving?"
-
-2003-04-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/aiff.c
-    Fix retrieving and storing of string data from files. Need to be careful
-    about using psf->buffer for strings.
-
-2003-04-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Fix psf_fseek() for seeks withing embedded files.
-
-2003-04-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Changed the definition of SNDFILE slightly to produce warnings when it isn't
-    used correctly. This should have zero affect in code which uses the SNDFILE
-    type correctly.
-
-    * src/sndfile.c
-    Fixed a few compiler warnings cause by the changes to the SNDFILE type.
-
-2003-04-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Added question and answer to the question "How about adding the ability
-    to write/read sound files to/from memory buffers?".
-
-2003-04-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Removed un-needed enums declaring TRUE and FALSE and replaced usage of
-    these with SF_TRUE and SF_FALSE.
-
-    * tests/multi_file_test.c
-    New test program to test sf_open_fd() on files containing data other than
-    a single sound file.
-
-2003-04-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    When creating files, set the readable by others flag. This still allows
-    further restrictions to be enforced by use of the user's umask. Fix
-    suggested by Eric Lyon.
-
-2003-04-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c
-    Changed sf_open_fd(). Dropped offset parameter and added a close_desc
-    parameter. If close desc is TRUE, the file descritpor passed into the
-    library will be closed when sf_close() is called.
-
-    * tests/utils.tpl
-    Modified call to sf_open_fd() to set close_desc parameter to SF_TRUE.
-
-2003-04-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Add a string (using sf_set_string() function) before and after data section
-    of all files. This will make sure that if string data can be added, it
-    doesn't overwrite real audio data.
-
-2003-04-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Started work on supporting a non-zero offset parameter for sf_open_fd ().
-
-    * src/<file header parsers>.c
-    Removed many uses of psf_fseek (SEEK_END) which to allow for future use of
-    sf_open_fd() with non-zero offset.
-    Associated refactoring.
-
-    * src/aiff.c
-    Implemented functionality required to get sf_get_string() and
-    sf_set_string() working for AIFF files.
-
-2003-04-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl
-    Modified test_open_file_or_die() to alternately use sf_open() and
-    sf_open_fd().
-
-    * src/svx.c
-    Fixed a bug which occurred when openning an existing file for read/write
-    using sf_open_fd(). In this case, the existing NAME chunk needs to be
-    read into psf->filename.
-    Fixed printing of sf_count_t types to logbuffer.
-
-2003-03-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Added prototype for new function sf_open_fd().
-
-    * src/sndfile.c
-    Moved most of the code in sf_open() to a new function psf_open_file().
-    Created new function sf_open_fd() which also uses psf_open_file() but
-    does not currently support the offset parameter.
-
-    * doc/api.html
-    Document sf_open_fd().
-
-2003-03-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a memory leak reported by Evgeny Karpov. Memory leak only occurred
-    when an attempt was made to read and the open() call fails.
-
-2003-03-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/open_fail_test.c
-    New test program to check for memory leaks when sf_open fails on a valid
-    file. Currently this must be run manually under valgrid.
-
-    * tests/Makefile.am
-    Hook new test program into build.
-
-2003-03-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Octave/sndfile_save.m Octave/sndfile_play.m
-    Added a -mat-binary option to the octave save command to force the output
-    to binary mode even if the user has set ascii data as the default. Found
-    by Christopher Moore.
-
-2003-02-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/dither.html
-    New file which will document the interface which allows the addition of
-    audio dither when sample word sizes are being reduced.
-
-    * src/dither.c
-    More work.
-
-2003-02-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    In update_header_test(), make HTK files a special case.
-
-    * doc/index.html
-    Added HTK to the feature matrix.
-
-2003-02-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/htk.c
-    New file for reading/writing HMM Tool Kit files.
-
-    * src/sndfile.h.in src/sndfile.c src/command.c src/Makefile.am
-    Hook in htk.c
-
-    * tests/write_read_test.tpl tests/misc_test.c tests/Makefile.am
-    Add tests for HTK files.
-
-2003-02-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed a bug where the LIST chunk length was being written incorrectly.
-
-    * tests/string_test.c
-    Added call to check_log_buffer().
-    Minor cleanups.
-
-2003-02-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_w64.h
-    Applied patch from Antoine Mathys to add extra WAV format definitions and
-    a G72x_ADPCM_WAV_FMT struct definition.
-
-    * src/wav_w64.c
-    Applied patch from Antoine Mathys which converts wav_w64_format_str() from
-    one huge inefficient switch statement to a binary search.
-
-    * tests/string_test.c
-    Dump log buffer if tests fail.
-
-2003-02-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/string_test.c
-    David Viens supplied some modifications to this file which showed up a bug
-    when using sf_set_string() and the sf_writef_float() functions.
-
-    * src/sndfile.c
-    Fixed the above bug.
-
-2003-02-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Added Q and A on how to detect libsndfile in configure.in (at the suggestion
-    of Davy Durham).
-
-2003-02-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Add enums and typedefs for dither.
-    Deprecate SFC_SET_ADD_DITHER_ON_WRITE and SFC_SET_ADD_DITHER_ON_READ, to be
-    replaced with SFC_SET_DITHER_ON_WRITE and SFC_SET_DITHER_ON_READ which will
-    allow different dither algorithms to be enabled.
-    Added SFC_GET_DITHER_INFO_COUNT and SFC_GET_DITHER_INFO.
-
-    * src/sndfile.h.in src/Version_script.in Win32/libsndfile.def.
-    Added public sf_dither_*() functions.
-
-    * src/sndfile.c
-    Implement commands above.
-
-    * src/dither.c
-    More work. Framework and external hooks into dither algorithms complete.
-
-2003-02-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/version-1.html libsndfile_version_convert.py
-    Remove redundant files.
-
-    * doc/index.html doc/api.html
-    Remove links to version-1.html.
-
-    * src/dither.c
-    New file to allow the addition of audio dither on input and output.
-
-    * src/common.h
-    Add prototype for dither_init() function.
-
-    * Makefile.am doc/Makefile.am
-    Changes for added and removed files.
-
-2003-02-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.msvc
-    Changes to force example binaries to be placed in the top level directory
-    instead of the examples/ directory.
-    Add src/strings.c and src/xi.c to the build.
-    Add string_test to build and to tests on WAV files.
-
-    * doc/index.html
-    Added XI to support matrix.
-
-2003-01-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Added prototypes for sf_get_string() and sf_set_string() and SF_STR_*
-    enum values.
-
-    * src/sndfile.c
-    Added public interface to sf_get_string() and sf_set_string().
-
-    * src/wav.c
-    Added code for setting and getting strings in WAV files.
-
-    * tests/string_test.c
-    New test program for sf_get_string() and sf_set_string() functionality.
-
-    * tests/Makefile.am
-    Hook new test program into build and test framework.
-
-2003-01-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Added fields to SF_PRIVATE for string data needed to implement
-    sf_get_string() and sf_set_string().
-
-    * src/strings.c
-    New file for storing and retrieving strings to/from files.
-
-    * src/Makefile.am
-    Added strings.c to build.
-
-2003-01-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/xi.c
-    Read seems to be working so looking at write.
-
-    * src/sndfile.h.in
-    Added SF_FORMAT_XI, SF_FORMAT_DPCM_8 and SF_FORMAT_DPCM_16 enum values.
-
-    * tests/floating_point_test.c tests/lossy_comp_test.c tests/Makefile.am
-    Added test for 8 and 16 bit XI format files.
-
-2003-01-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Added a non-lawyer readable summary of the licensing provisions as
-    suggested by Steve Dekorte.
-
-2003-01-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed a compiler warning found by Alexander Lerch.
-
-2003-01-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Fixed the multiple linking of libm.
-
-2003-01-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.mcvs
-    Added comments on the correct way to set up the MSVCDir environment
-    variable.
-
-    * doc/win32.html
-    Add on how to set up the MSVCDir environment variable.
-
-2003-01-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c examples/sndfile-info.c
-    When run on Win32 without any command line parameters print a message and
-    then sleep for 5 seconds. This means the when somebody double clicks on
-    these programs in explorer the user will actually see the message.
-
-2003-01-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Bypass permission test if running as root because root is allowed to open
-    a readonly file for write.
-
-2003-01-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/Makefile.msvc
-    Added pvf.c and xi.c source files to project.
-
-    * src/sndfile.h
-    Updated for PVF files.
-
-2003-01-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Modified validate_sfinfo() to force samplerate, channels and sections
-    to be >= 1.
-    In format_from_extension() replaced calls to does_extension_match()
-    with strcmp().
-
-    * src/xi.c
-    More work.
-
-2003-01-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/Makefile.am
-    Added octave.html which had been left out. Found by Jan Weil.
-
-2003-01-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pvf.c src/common.h src/sndfile.c
-    Fixed error handling for PVF files.
-
-    * src/xi.c
-    New file for handling Fasttracker 2 Extended Instrument files. Not working
-    yet and included when configured with --enable-experimental.
-
-    * src/sndfile.c src/common.h
-    Hooked in new file xi.c.
-
-2002-12-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/rx2.c
-    Added a patch from Marek Peteraj which sheds a little more light on the
-    slices within an RX2 file. Still need to find out data encoding.
-
-2002-12-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Started work on decoding 'acid' and 'strc' chunks.
-
-2002-12-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/peak_check_test.c
-    Minor cleanup.
-
-2002-12-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl
-    Added check to make sure no error was generated when an attempt was made to
-    read past the end of the file.
-
-2002-12-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/lists.html
-    Added "mailto" links for all three lists.
-
-    * src/pvf.c
-    New file for Portable Voice Format files.
-
-    * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am
-    Added hooks for SF_FORMAT_PVF format files.
-
-    * tests/write_read_test.tpl tests/std*.c
-    Add tests for SF_FORMAT_PVF.
-
-    * doc/index.html
-    Add PVF to the compatibility matrix.
-
-    * src/pcm.c src/alaw.c src/ulaw.c src/float32.c src/double64.c
-    Previously, attempts to read beyond the end of a file would set psf->error
-    to SFE_SHORT_ERROR. This behaviour diverged from the behaviour of the POSIX
-    read() call but has now been fixed.
-    Attempts to read beyond the end of the file will return a short read count
-    but will not longer set any error.
-
-2002-12-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Add more sanity checking when opening a RAW file for read. When format is
-    not RAW, zero out all members of the SF_INFO struct.
-
-    * tests/raw_test.c
-    Add bad_raw_test() to check for above problem.
-
-    * tests/stdin_test.c examples/sndfile-info.c
-    Set the format field of the SF_INFO struct to zero before calling
-    sf_open().
-
-    * doc/api.html
-    Add information about the need to set the format field of the SF_INFO struct
-    to zero when opening non-RAW files for read.
-
-    * configure.ac
-    Removed use of conversion script on Solaris. Not all Solaris versions
-    support it.
-
-    * doc/lists.html
-    New file containg details of the mailing lists.
-
-    * doc/index.html
-    Add a link to the above new file.
-
-2002-12-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/dft_cmp.c
-    Fixed a SIGFPE on Alpha caused by a log10 (0.0). Thanks to Joshua Haberman
-    for providing the gdb traceback.
-
-2002-11-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Added more capabilities to 'smpl' chunk parser.
-
-    * src/sndfile.c
-    Fixed some (not all) possible problems found with Flawfinder.
-
-2002-11-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a bug in sf_seek(). This bug could only occur when an attempt was
-    made to read beyond the end and then sf_seek() was called with a whence
-    parameter of SEEK_CUR.
-
-    * src/file_io.c
-    Win32's _fstati64() does not work, it returns BS. Re-implemented
-    psf_get_filelen() in terms of psf_fseek().
-
-    * tests/write_read_test.tpl
-    Add a test to detect above bug.
-
-    * src/float_cast.h
-    Modification to prevent compiler warnings on Mac OS X.
-
-    * src/file_io.c
-    Fixes for windows (what a f**ked OS).
-
-2002-11-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.ac
-    Disable use of native lrint()/lrintf() on Mac OSX. These functions exist on
-    Mac OSX 10.2 but not on 10.1. Forcing the use of the versions in
-    src/float_cast.h means that a library compiled on 10.2 will still work on
-    10.1.
-
-2002-11-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in configure.ac
-    Renamed configure.in to configure.ac as expected by later versions of
-    autoconf.
-    Slight hacking of configure.ac to work with version 2.54 of autoconf.
-    Changed to using -dumpversion instead of --version for determining GCC
-    version numer as suggested by Anand Kumria.
-
-    * src/G72x/Makefile.am
-    Slight hacking required for operation with automake 1.6.3.
-
-2002-11-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    In psf_binheader_readf() changed type parameter type "b" type from size_t
-    to int to prevent errors on IA64 CPU where sizeof (size_t) != sizeof (int).
-    Thanks to Enrique Robledo Arnuncio for debugging this.
-
-2002-11-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * test/command_test.tpl
-    Changed test value so test would pass on Solaris.
-
-    * src/Version_script.in
-    Modified version numbering so that later versions of 1.0.X can replace
-    earlier versions without recompilation.
-
-    * src/vox_adpcm.c
-    Fixed bug causing short reads.
-
-2002-11-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * test/floating_point_test.c
-    Code cleanup using functions from util.c.
-    Add test for IEEE replacement floats and doubles.
-
-2002-11-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed a possible divide by zero error when read the 'smpl' chunk. Thanks to
-    Serg Repalov for the example file.
-
-    * tests/pcm_test.tpl
-    Used sf_command (SFC_TEST_IEEE_FLOAT_REPLACE) to test IEEE replacement code.
-    Clean up pcm_double_test().
-
-    * src/float32.c src/double64.c
-    Force use of IEEE replacement code using psf->ieee_replace is TRUE,
-    Print message to log_buffer as well.
-    Rename all broken_read_* and broken_write* functions to replace_read_* and
-    replace_write_*.
-
-    * tests/util.tpl
-    Added string_in_log_buffer().
-
-    * tests/pcm_test.tpl
-    Use string_in_log_buffer() to ensure that IEEE replacement code has been
-    used.
-
-    * configure.in
-    Removed --enable-force-broken-float option. IEEE replacement code is now
-    always tested.
-
-2002-10-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/double64.c
-    Implement code for read/writing IEEE doubles on platforms where the native
-    double format is not IEEE.
-
-    * src/float32.c src/common.h
-    Remove float32_read() and float32_write(). Replace with float32_le_read(),
-    float32_be_read(), float32_le_write() and float32_be_write() to match stuff
-    in src/double64.c.
-
-    * src/common.c
-    Fix all usage of float32_write().
-
-    * src/sndfile.h.in
-    Added SFC_TEST_IEEE_FLOAT_REPLACE command (testing only).
-
-    * src/common.h
-    Added SF_PRIVATE field ieee_replace.
-
-    * src/sndfile.c
-    In sf_command() set/reset psf->ieee_replace.
-
-2002-10-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pcm_test.tpl
-    Fixed a problem when testing with --enable-force-broken-float. The test was
-    generating a value of negative zero and the broken float code is not able
-    to write negative zero. Removing the negative zero fixed the test.
-
-2002-10-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Added fix for Cygwin (suggested by Maros Michalik).
-
-2002-10-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Improved error detection and handling.
-
-    * src/file_io.c src/common.h
-    Removed functions psf_ferror() and psf_clearerr() which were redundant
-    after above improvements.
-
-    * src/aiff.c src/svx.c src/w64.c src/wav.c
-    Removed all use of psf_ferror() and psf_clearerr().
-
-    * src/sndfile.c
-    Removed #include of <stdio.h>, <unistd.h>, <fcntl.h> and <math.h> which
-    are no longer needed.
-
-    * tests/misc_test.c
-    Added test to make sure the correct error message is returned with an
-    existing read-only file is openned for write.
-
-2002-10-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html doc/api.html
-    Updated for OKI Dialogic ADPCM files.
-
-    * src/command.c
-    Added VOX ADPCM to sub_fomats.
-
-2002-10-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/vox_adpcm.c src/Makefile.am
-    New file for handling OKI Dialogic ADPCM files.
-
-    * src/sndfile.h
-    Add new subtype SF_FORMAT_VOX_ADPCM.
-
-    * src/sndfile.c
-    Renamed function is_au_snd_file () to format_from_extenstion () and expanded
-    its functionality to detect headerless VOX files.
-
-    * src/raw.c
-    Added hooks for SF_FORMAT_VOX_ADPCM.
-
-    * examples/sndfile-info.c
-    Print out file duration (suggested by Conrad Parker).
-
-    * libsndfile.spec.in
-    Force installation of sndfile.pc file (found by John Thompson).
-
-    * tests/Makefile.am tests/lossy_comp_test.c tests/floating_point_test.c
-    Add tests for SF_FORMAT_VOX_ADPCM.
-
-2002-10-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Add test which attempts to write to /dev/full (on Linux anyway) to check
-    for correct handling of writing to a full filesystem.
-
-    * src/sndfile.c
-    Return correct error message if the header cannot be written because the
-    filesystem is full.
-
-    * tests/util.tpl
-    Corrected printing of file mode in error reporting.
-
-    * src/mat5.c
-    Fixed a bug where a MAT5 file written by libsndfile could not be opened by
-    Octave 2.1.36.
-
-2002-10-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/file_io.c
-    All low level file I/O have been modified to be better able to report
-    system errors resulting from calling system level open/read/write etc.
-
-    * src/*.c
-    Updated for compatibility with above changes.
-
-    * examples/cooledit-fixer.c
-    New example program which fixes badly broken file created by Syntrillium's
-    Cooledit which are marked as containing PCM samples but actually contain
-    floating point data.
-
-    * examples/Makefile.am
-    Hooked cooledit-fixer into the build system.
-
-2002-10-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Document SFC_GET_FORMAT_INFO.
-
-2002-10-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/wav32_aiff24.c examples/sndfile2oct.c examples/sfhexdump.c
-        examples/sfdump.c
-    Removed these files because they weren't interesting.
-
-    * examples/sfconvert.c examples/sndfile-convert.c
-    Renamed the first to the latter.
-
-    * examples/Makefile.am
-    Added sndfile-convert to the bin_PROGRAMS, so it is installed when the lib
-    is installed.
-    Removed old programs wav32_aiff24 and sndfile2oct.
-
-    * man/sndfile-convert.1
-    New man page.
-
-    * examples/sndfile-convert.c
-    Added some gloss now that sndfile-convert.c is an installed program.
-
-    * src/sndfile.h.in src/sndfile.c src/common.h src/command.h
-    Added command SFC_GET_FORMAT_INFO.
-
-    * tests/command_test.c
-    Added tests form SFC_GET_FORMAT_INFO.
-
-2002-10-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    In sf_format_check() return error if samplerate < 0.
-
-2002-10-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fixed bug in handling of COMM chunks with a 4 byte encoding byte but no
-    encoding string.
-
-2002-10-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed repeated word in an error message.
-
-2002-10-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Improved advertising in Features section.
-
-2002-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Added decoding of 'labl' chunks within 'LIST' chunks.
-
-    * src/common.h
-    Added (experimental only) SF_FORMAT_OGG and SF_FORMAT_VORBIS and definition
-    of ogg_open(). This is nowhere near working yet.
-
-    * src/sndfile.c
-    Added detection of 'OggS' file marker and added call to ogg_open() to
-    switch statement.
-
-    * src/ogg.c
-    New file. Very early start of Ogg Vorbis support.
-
-    * src/wav.c
-    Added handling of brain-damaged and broken Cooledit "32 bit 24.0 float
-    type 1" files. These files are marked as being 24 bit WAVE_FORMAT_PCM with
-    a block alignment of 4 times the numbers of channels but are in fact 32 bit
-    floating point.
-
-2002-10-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Modified option --enable-experimental to set ENABLE_EXPERIMENTAL_CODE in
-    config.h to either 0 or 1.
-
-    * src/sndfile.c
-    Modify sf_command (SFC_GET_LIB_VERSION) to append "-exp" to the version
-    string if experimental code has been enabled.
-
-2002-10-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/Makefile.am
-    Added -lm to libsndfile_la_LIBADD. This means that -lm is not longer needed
-    in the link line when linking something to libsndfile.
-
-    * tests/Makefile.am examples/Makefile.am
-    Removed -lm from all link lines.
-
-    * sndfile.pc.in
-    Removed -lm from Libs line.
-
-2002-09-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Removed all perror() calls.
-
-    * src/nist.c
-    Removed calls to exit() function.
-    Added check to detect NIST files dammaged from Unix CR -> Win32 CRLF
-    conversion process.
-
-2002-09-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c
-    New function sf_strerror() which will eventually replace functions
-    sf_perror() and sf_error_str().
-    Function sf_error_number() has also been changed, but this was documented
-    as being for testing only.
-
-    * doc/api.html
-    Documented above changes.
-
-    * tests/*.c examples/*.c
-    Changed to new error functions.
-
-2002-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Detect GCC version, and print a warning message about writeable strings
-    it GCC major version number is less than 3.
-
-2002-09-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in doc/api.html
-    Documentation fixes.
-
-2002-09-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/Version_script.in src/Makefile.am configure.in
-    Use the version script to prevent the exporting of all non public symbols.
-    This currently only works with Linux. Will test on Solaris as well.
-
-    * src/float_cast.h
-    Added #ifndef to prevent the #warning directives killing the SGI MIPSpro
-    compiler.
-
-    * src/au_g72x.c src/double64.c src/float32.c src/gsm610.c src/ima_adpcm.c
-        src/ms_adpcm.c
-    Fix benign compiler warnings arising from previously added compiler
-    flags.
-
-2002-09-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a bug in sf_error_str() where errnum was used as the index instead
-    of k. Found by Tim Hockin.
-
-    * examples/sndfile-play.c
-    Fixed a compiler warning resulting from a variable shadowing a previously
-    defined local.
-
-2002-09-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in src/sndfile.c
-    Added command SFC_SET_RAW_START_OFFSET.
-
-    * doc/command.html
-    Document SFC_SET_RAW_START_OFFSET.
-
-    * tests/raw_test.c tests/Makefile.am
-    Add new file for for testing SF_FORMAT_RAW specific functionality.
-
-    * tests/dwvw_test.c
-    Updates.
-
-2002-09-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Modified reading of 'smpl' chunk to take account of the sampler data field.
-
-    * tests/utils.tpl tests/utils.h
-    Added function print_test_name().
-
-    * tests/misc_test.c tests/write_read_test.tpl tests/lossy_comp_test.c
-        tests/pcm_test.tpl tests/command_test.tpl tests/floating_point_test.c
-    Convert to use function print_test_name().
-
-2002-09-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/octave.html
-    Added a link to some other Octave scripts for reading and writing sound
-    files.
-
-    * src/paf.c
-    Change type of dummy data field to int. This should fix a benign compiler
-    warning on some CPUs.
-    Removed superfluous casts resulting from the above change.
-
-    * src/rx2.c
-    More hacking.
-
-2002-09-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/mat5.c src/common.c
-    Changed usage of snprintf() to LSF_SNPRINTF().
-
-    * Win32/Makefile.msvc
-    Updated to include new files and add new tests.
-
-    * Win32/config.h Win32/sndfile.h
-    Updated.
-
-    * doc/api.html
-    Added note about the possibility of "missing" features actually being
-    implemented as an sf_command().
-
-2002-09-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/misc_test.c
-    Added previously missing update_header_test and zero_data_tests for PAF,
-    MAT4 and MAT5 formats.
-
-    * src/paf.c src/mat4.c src/mat5.c
-    Fixed bugs uncovered by new tests above.
-
-    * src/mat5.c
-    Generalised parsing of name fields of MAT5 files.
-
-    * src/mat5.c src/sndfile.c
-    Added support for unsigned 8 bit PCM MAT5 files.
-
-    * tests/write_read_test.tpl
-    Added test for unsigned 8 bit PCM MAT5 files.
-
-    * doc/index.html
-    Added unsigned 8 bit PCM MAT5 to capabilities matrix.
-
-2002-09-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * test/update_header_test.c tests/misc_test.c
-    Renamed update_header_test.c to misc_test.c.
-    Added zero_data_test() to check for case where file is opened for write and
-    closed immediately. The resulting file can be left in a state where
-    libsndfile cannot open it. Problem reported by Werner Schweer, the author
-    of Muse.
-
-    * src/aiff.c
-    Removed superfluous cast.
-
-    * src/wav.c src/svx.c
-    Fixed case of file generated with no data.
-    Removed superfluous cast.
-
-    * src/sndfile.c
-    Fixed error on IA64 platform caused by incorrect termination of
-    SndfileErrors struct array. This problem was found in the Debian buildd
-    logs (http://buildd.debian.org/).
-
-    * configure.in
-    Added Octave directory.
-
-    * Octave/Makefile.ma
-    New Makfile.am for Octave directory.
-
-    * Octave/sndfile_load.m Octave/sndfile_save.m Octave/sndfile_play.m
-    New files for working with Octave.
-
-    * doc/octave.html
-    Document explaining the use of the above three Octave scripts.
-
-2002-09-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed bug in RDWR mode.
-
-2002-09-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fixed psf_get_date_str() for systems which don't have gmtime_r() or
-    gmtime().
-
-    * src/file_io.c
-    Added #include <io.h> for Win32. Reported by Koen Tanghe.
-
-2002-09-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Added 'S' format specifier for psf_binheader_writef() which writes a C
-    string, including single null terminator to the header.
-    Added 'j' format specifier to allow jumping forwards or backwards in the
-    header.
-    Added function psf_get_date_str().
-
-    * src/mat5.c
-    Complete read and write support.
-
-    * doc/index.html
-    Added entries for MAT4 and MAT5 in capabilities matrix.
-
-2002-09-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/mat4.c
-    Completed read and write support.
-
-    * src/common.h src/sndfile.c
-    Added MAT4 and MAT5 specific error messages.
-
-    * tests/write_read_test.tpl tests/Makefile.am
-    Added tests for MAT4 and MAT5 files.
-
-    * tests/stdio_test.c tests/stdout_test.c tests/stdin_test.c
-    Added tests for MAT4 and MAT5 files.
-
-2002-09-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c
-    Added elements for SF_FORMAT_MAT4 and SF_FORMAT_MAT5 to major_formats
-    array.
-
-    * examples/sfconvert.c
-    Added mat4 and mat5 output targets.
-
-2002-09-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Added check to prevent errors openning read only formats for read/write.
-
-    * src/interleave.c
-    New file for interleaving non-interleaved data. Non-interleaved data is
-    only supported on read.
-
-    * src/Makefile.am
-    Added src/interleave.c to build.
-
-2002-09-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/double64.c src/common.h
-    Added double64_be_read(), double64_le_read(), double64_be_write() and
-    double64_le_write() which replace double64_read() and double64_write().
-
-    * src/common.c
-    Cleanup of psf_binheader_readf() and add ability to read big and little
-    endian doubles (required by mat4.c and mat5.c).
-    Add ability for psf_binheader_writef() to write doubles to sound file
-    headers.
-
-2002-09-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/mat5.c
-    New file for reading Matlab (tm) version 5 data files. This is also the
-    native binary file format for version 2.1.X of GNU Octave which will be
-    used for testing.
-    Not complete yet.
-
-    * src/mat4.c
-    New file for reading Matlab (tm) version 4.2 data files. This is also the
-    native binary file format for version 2.0.X of GNU Octave which will be
-    used for testing.
-    Not complete yet.
-
-    * src/sndfile.h.in src/sndfile.c src/common.h src/command.c src/Makefile.am
-    Mods to add Matlab files.
-
-    * src/common.[ch]
-    Added readf_endian field to SF_PRIVATE struct allowing endianness to
-    remembered across calls to sf_binheader_readf().
-    Fixed bug in width_specifier behaviour for printing hex values.
-
-2002-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Check return value of close() call in psf_fclose().
-
-2002-08-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ms_adpcm.c
-    Commented out some code where 0x10000 was being subtracted from a short
-    and the result assigned to a short again. Andrew Zaja found this.
-
-2002-08-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Fixed typo found by Tommi Ilmonen.
-
-    * src/ima_adpcm.c
-    Changed type of diff from short to int to prevent errors which can occur
-    during very rare circumstances. Thanks to FUWAFUWA.
-
-2002-08-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/floating_point_test.c
-    Disable testing on machines without lrintf().
-
-    * Win32/Makefile.msvc
-    Added dwd.c and wve.c to build.
-
-    * configure.in
-    Bumped version to 1.0.0.
-
-2002-08-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Add a #include for Mac OS 9. Thanks to Stephane Letz.
-
-    * src/wav.c
-    Changed an snprintf to LSF_SNPRINTF.
-
-    * doc/Makefile.am
-    Added version-1.html.
-
-2002-08-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Bumped version to 1.0.rc6.
-
-    * src/*.c
-    Modified scaling of normalised floats and doubles to integers. Until now
-    this has been done by multiplying by 0x8000 for short output, 0x80000000
-    for 32 bit ints and so on. Unfortunately this can cause an overflow and
-    wrap around in the target value. All thes values have therefore been
-    reduced to 0x7FFF, 0x7FFFFFFF and so on. The conversion from ints to
-    normalised floats and doubles remains unchanged. This does mean that for
-    repeated conversions normalised float -> pcm16 -> normalised float would
-    result in a decrease in amplitude of 0x7FFF/0x8000 on every round trip.
-    This is undesirable but less undesireable than the wrap around I am trying
-    to avoid.
-
-    * tests/floating_point_test.c
-    Removed file hash checking because new float scaling procedure introduced
-    above prevented the ability to crate a has on both x86 and PowerPC systems.
-
-2002-08-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/txw.c
-    Completed reading of TXW files. Seek doesn't work yet.
-
-    * src/file_io.c
-    Added a MacOS 9 replacement for ftruncate().
-
-    * MacOS/sndfile.h
-    Added MacOS 9 header file. This should be copied into src/ to compile
-    libsndfile for MacOS9.
-
-2002-08-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed commands SF_SET_NORM_DOUBLE and SFC_SET_NORM_FLOAT to return their
-    values after being set. Reported by Jussi Laako.
-
-    * configure.in
-    If autogen is not found, touch all .c and .h files in tests/.
-
-    * src/common.c
-    Added format width specifier to psf_log_printf() for %u, %d, %D and %X.
-
-    * src/dwd.c
-    Completed implementation of read only access to these files.
-
-    * src/common.h src/*.c src/pcm.c
-    Removed redundant field chars from SF_PRIVATE struct and modified
-    pcm_init() to do without it.
-
-2002-08-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wve.c
-    New file implementing read of Psion Alaw files. This will be a read only
-    format. Implementation complete.
-
-    * src/dwd/c
-    Started implementation of DiamondWare Digitized files. Also read only, not
-    complete.
-
-    * src/wav.c
-    Add parsing of 'smpl' chunk.
-
-    * src/paf.c
-    Fixed reading on un-normalized doubles and floats from 24 bit PAF files.
-    This brings it into line with the reading of 8 bit files into
-    un-normalized doubles which returns values in the range [-128, 127].
-
-    * src/common.c
-    Modified psf_log_printf() to accept the %% conversion specifier to allow
-    printing of a single '%'.
-
-    * src/sds.c
-    Read only of 16 bit samples is working. Need to build a test harness for
-    this and other read only formats.
-
-2002-08-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Added --enable-experimental configure option.
-    Removed pkg-config message at the end of the configure process.
-
-    * src/sds.c src/txw.c src/rx2.c src/sd2.c
-    Moved all the code in these files inside #if ENABLE_EXPERIMENTAL_CODE
-    blocks and added new *_open() function for the case where experimental is
-    not enabled. These new functions just return SFE_UNIMPLMENTED.
-
-    * Win32/sndfile.h src/sndfile.h.in src/common.h
-    Removed un-necessary #pragma pack commands.
-
-    * src/file_io.c
-    Implemented psf_ftruncate() and much other hacking for Win32.
-
-    * Win32/Makefile.msvc
-    Updated.
-
-    * doc/win32.html
-    Updated to include the copying of the sndfile.h file from the Win32/
-    directory to the src/ directory.
-
-    * Make.bat
-    Batch file to make compiling on Wi32 a little easier. Implements "make" and
-    "make check".
-
-2002-08-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    Add place holder for ftruncate() on Win32 which doesn't have ftruncate().
-    This will need to be fixed later.
-
-    * src/sndfile.h.in
-    New file (copy of sndfile.h) with sets up @TYPEOF_SF_COUNT_T@ which will be
-    replaced by the correct type during configure.
-
-    * configure.in
-    Modified to find a good type for TYPEOF_SF_COUNT_T.
-
-    * src/aiff.c
-    Fixed a bug when reading malformed headers.
-
-    * src/common.c
-    Set read values to zero before performing read.
-
-2002-08-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Fixed some HTML tags which were not allowing jumps to links within the
-    page.
-
-    * src/sds.c
-    Massive hacking on this.
-
-    * src/wav.c
-    Added recognition of 'clm ' tag.
-
-2002-08-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Added beginning of a capabilities list beyond simple file formats which
-    can be read/written.
-
-    * src/aiff.c
-    Added parsing of INST and MARK chunks of AIFF files. At the moment this
-    data is simply recorded in the log buffer. Later it will be possible to
-    read this data from an application using sf_command().
-
-    * src/wav.c
-    Added parsing of 'cue ' chunk which contains loop information in WAV files.
-
-    * exampes/sndfile-info.c
-    Changed reporting of Samples to Frames.
-
-    * src/wav.c src/w64.c src/aiff.c src/wav_w64.h
-    Moved from a samples to a frames nomenclature to avoid confusion.
-
-    * doc/FAQ.html
-    What's the best format for storing temporary files?
-
-    * src/sds.c
-    New file for reading/writing Midi Sample Dump Standard files.
-
-    * src/Makefile.am src/sndfile.c src/common.[ch]
-    Added hooks for sds.c.
-
-    * examples/sndfile-info.c
-    Changed from using sf_perror() to using sf_error_str().
-
-2002-08-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Added explanation of mode parameter for sf_open().
-    Added explanation of usage of SFM_* values in sf_seek().
-
-    * src/sndfile.[ch] src/command.c src/file_io.c src/common.h
-    Implemented SFC_FILE_TRUNCATE to allow a file to be truncated. File
-    truncation was suggested by James McCartney.
-
-    * src/command.html
-    Documented SFC_FILE_TRUNCATE.
-
-    * tests/command_test.c
-    Add tests for SFC_FILE_TRUNCATE.
-
-    * src/sndfile.c
-    Added a thrid parameter to the VALIDATE_SNDFILE_AND_ASSIGN_PSF macro to
-    make resetting the error number optional. All uses of the macro other than
-    in error reporting functions were changed to reset the error number.
-
-    * src/pcm.c
-    Fixed a bug were sf_read_* was logging an SFE_SHORT_READ even when no error
-    occurred.
-
-    * tests/write_read_test.tpl
-    Added tests of internal error state.
-
-2002-08-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/GSM610/private.h src/GSM610/*.c src/GSM610/Makefile.am
-    Renamed private.h to gsm610_priv.h to prevent clash with other headers
-    named private.h in other directories. (Probably only a problem on MacOS 9).
-
-    * src/G72x/private.h src/G72x/*.c src/G72x/Makefile.am
-    Renamed private.h to g72x_priv.h to prevent clash with other headers
-    named private.h in other directories. (Probably only a problem on MacOS 9).
-
-    * MacOS/config.h
-    Changed values of HAVE_LRINT and HAVE_LRINTF to force use of code in
-    float_cash.h.
-
-    * src/sndfile.h
-    Changes the name of samples field of the SF_INFO to frames. The old name
-    had caused too much confusion and it simply had to be changed. There will
-    be at least one more pre-release.
-
-2002-08-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/index.html
-    Updated formats matrix to include RAW (header-less) GSM 6.10.
-    Fix specificaltion of table and spelling mistakes.
-
-    * src/sndfile.c src/command.c
-    Fixed bug in SFC_CALC_MAX_SIGNAL family and psf_calc_signal_max ().
-
-    * tests/command.c
-    Removed cruft.
-    Added test for SFC_CALC_MAX_SIGNAL and SFC_CALC_NORM_MAX_SIGNAL.
-
-    * configure.in
-    Update version to 1.0.0rc5.
-
-    * sfendian.h
-    Removed inclusion of un-necessary header.
-
-2002-08-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Minor fixes of info written to log buffer.
-
-    * src/float_cast.h
-    Add definition of HAVE_LRINT_REPLACEMENT.
-
-    * tests/floating_point_test.c
-    Fix file hash check on systems without lrint/lrintf.
-
-    * tests/dft_cmp.c
-    Limit SNR to less than -500.0dB.
-
-    * examples/sndfile2oct.c
-    Fixed compiler warnings.
-
-    * doc/api.html
-    Fixed error where last parameter of sf_error_str() was sf_count_t instead
-    of size_t.
-
-2002-08-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    Why doesn't libsndfile do interleaving/de-interleaving.
-
-    * tests/pcm_test.tpl
-    On Win32 do not perform hash check on files containing doubles.
-
-2002-08-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Defined SF_COUNT_MAX_POSITIVE() macro, a portable way of setting variables
-    of type sf_count_t to their maximum positive value.
-
-    * src/dwvw.c src/w64.c
-    Used SF_COUNT_MAX_POSITIVE().
-
-2002-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    Fixed bug in reading/writing of 24 bit PCM PAF files on big endian systems.
-
-    * tests/floating_point_tests.c
-    Fixed hash values for 24 bit PCM PAF files.
-    Disabled file has check if lrintf() function is not available and added
-    warning.
-    Decreased level of signal from a peak of 1.0 to a value of 0.95 to prevent
-    problems on platforms without lrintf() ie Solaris.
-
-2002-07-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed a problem with two different kinds of mal-formed WAV file header. The
-    first had the 'fact' chunk before the 'fmt ' chunk, the other had an
-    incomplete 'INFO' chunk at the end of the file.
-
-    * src/w64.c
-    Added fix to allow differentiation between W64 files and ACID files.
-
-    * src/au_g72x.c src/common.h src/sndfile.c
-    Added error for G72x encoded files with more than one channel.
-
-    * tests/pcm_test.tpl tests/utils.tpl
-    Moved function check_file_hash_or_die() to utils.tpl. Function was then
-    modified to calculate the has of the whole file.
-
-    * src/wav.c
-    Fixed problem writing the 'fact' chunk on big endian systems.
-
-    * tests/sfconvert.c
-    Fixed bug where .paf files were being written as Sphere NIST.
-
-2002-07-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Fix for reading headers generated using SFC_UPDATE_HEADER_NOW.
-
-    * doc/command.html
-    Add docs for SFC_UPDATE_HEADER_NOW and SFC_SET_UPDATE_HEADER_AUTO.
-
-2002-07-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * man/sndfile-info.1 man/sndfile-play.1
-    Added manpages supplied by Joshua Haberman the Debian maintainer for
-    libsndfile. Additional tweaks by me.
-
-    * configure.in man/Makefile.am
-    Hooked manpages into autoconf/automake system.
-
-    * src/sndfile.c
-    Added hooks for SFC_SET_UPDATE_HEADER_AUTO.
-
-    * tests/update_header_test.c
-    Improved rigor of testing.
-
-    * src/*.c
-    Fixed problem with *_write_header() functions.
-
-2002-07-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/*.html
-    Updates to documentation to fix problems found by wdg-html-validator.
-
-    * src/common.h src/command.c
-    Added normalize parameter to calls to psf_calc_signal_max() and
-    psf_calc_max_all_channels().
-
-    * src/sndfile.c
-    Added handling for commands SFC_CALC_NORM_SIGNAL_MAX and
-    SFC_CALC_NORM_MAX_ALL_CHANNELS.
-
-    * doc/command.html
-    Added entry for SFC_CALC_NORM_SIGNAL_MAX and SFC_CALC_NORM_MAX_ALL_CHANNELS.
-
-2002-07-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c Win32/Makefile.msvc
-    Get sndfile-play program working on Win32. The Win32 PCM sample I/O API
-    sucks. The sndfile-play program now works on Linux, MacOSX, Solaris and
-    Win32.
-
-2002-07-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/FAQ.html
-    New file for frequently asked questsions.
-
-2002-07-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Documentation fixes.
-
-    * src/au.[ch] src/au_g72x.c src/G72x/g72x.h
-    Add support of 40kbps G723 ADPCM encoding.
-
-    * tests/lossy_comp_test.c tests/floating_point_test.c
-    Add tests for 40kbps G723 ADPCM encoding.
-
-    * doc/index.html
-    Update support matrix.
-
-2002-07-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/command.html
-    Documented SFC_GET_SIMPLE_FORMAT_COUNT, SFC_GET_SIMPLE_FORMAT,
-    SFC_GET_FORMAT_* and SFC_SET_ADD_PEAK_CHUNK.
-
-    * src/sndfile.c src/pcm.c
-    Add ability to turn on and off the addition of a PEAK chunk for floating
-    point WAV and AIFF files.
-
-    * src/sndfile.[ch] src/common.h src/command.c
-    Added sf_command SFC_CALC_MAX_ALL_CHANNELS. Implemented by Maurizio Umberto
-    Puxeddu.
-
-    * doc/command.html
-    Docs for SFC_CALC_MAX_ALL_CHANNELS (assisted by Maurizio Umberto Puxeddu).
-
-2002-07-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/gsm610.c
-    Finalised support for GSM 6.10 AIFF files and added support for GSM 6.10
-    encoded RAW (header-less) files.
-
-    * src/wav.c
-    Add support for IBM_FORMAT_MULAW and IBM_FORMAT_ALAW encodings.
-
-    * src/api.html
-    Fixed more documentation bugs.
-
-2002-07-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h src/common.h
-    Moved some yet-to-be-implelmented values for SF_FORMAT_* from the public
-    header file sndfile.h to the private header file common.h to avoid
-    confusion about the actual capabilities of libsndfile.
-
-2002-07-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/wav.c
-    Fixed file parsing for WAV and AIFF files containing non-audio data after
-    the data chunk.
-
-    * src/aiff.c src/sndfile.c
-    Add support for GSM 6.10 encoded AIFF files.
-
-    * tests/lossy_comp_test.c tests/Makefile.am
-    Add tests for GSM 6.10 encoded AIFF files.
-
-    * src/*.c
-    Fix compiler warnings.
-
-2002-07-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    For SFC_SET_NORM_* tests, change the file format from SF_FORMAT_WAV to
-    SF_FORMAT_RAW.
-
-    * src/sndfile.c
-    Added sf_command(SFC_TEST_ADD_TRAILING_DATA) to allow testing of reading
-    from AIFF and WAV files with non-audio data after the audio chunk.
-
-    * src/common.h
-    Add test commands SFC_TEST_WAV_ADD_INFO_CHUNK and
-    SFC_TEST_AIFF_ADD_INST_CHUNK. When these commands are working, they will be
-    moved to src/sndfile.h
-
-    * src/aiff.c src/wav.c
-    Begin implementation of XXXX_command() hook for sf_command().
-
-    * tests/write_read_test.tpl
-    Added sf_command (SFC_TEST_ADD_TRAILING_DATA) to ensure above new code was
-    working.
-
-2002-07-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/update_header_test.c
-    Allow read sample count == write sample count - 1 to fix problems with VOC
-    files.
-
-    * tests/write_read_test.tpl tests/pcm_test.tpl
-    Fixed some problems in the test suite discovered by using Valgrind.
-
-2002-07-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.[ch] tests/*.c
-    Renamed check_log_buffer() to check_log_buffer_or_die().
-
-    * src/sndfile.c
-    SFC_UPDATE_HEADER_NOW and SFC_SETUPDATE_HEADER_AUTO almost finished. Works
-    for all file formats other than VOC.
-
-2002-07-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.[ch] src/common.h
-    Started adding functionality to allow the file header to be updated before
-    the file is closed on files open for SFM_WRITE. This was requested by
-    Maurizio Umberto Puxeddu who is using libsndfile for file I/O in iCSound.
-
-    * tests/update_header_test.c
-    New test program to test that the above functionality is working correctly.
-
-    * tests/peak_chunk_test.c tests/floating_point_test.c
-    Cleanups.
-
-2002-07-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sfendian.[ch]
-    Changed length count parameters for all endswap_XXX() functions from
-    sf_count_t (which can be 64 bit even on 32 bit architectures) to int. These
-    functions are only called frin inside the library, are always called with
-    integer parameters and doing the actual calculation on 64 bit values is
-    slow in comparision to doing it on ints.
-
-    * examples/sndfile-play.c
-    More playback hacking for Win32.
-
-2002-07-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    In psf_log_printf(), changed %D format conversion specifier to %M (marker) and
-    added %D specifier for printing the sf_count_t type.
-
-    * src/*.c
-    Changed all usage of psf_log_printf() with %D format conversion specifiers
-    to use %M conversion instead.
-
-    * tests/pcm_test.tpl tests/pcm_test.def
-    New files to autogen pcm_test.c.
-
-    * src/pcm.c
-    Fixed bug in scaling floats and doubles to 24 bit PCM and vice versa.
-
-2002-07-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Fix setup of $ac_cv_sys_largefile_CFLAGS so that sndfile.pc gets valid
-    values for CFLAGS.
-
-    * examples/sndfile-play.c
-    Start adding playback support for Win32.
-
-2002-07-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Worked to removed compiler warnings.
-    Extensive refactoring.
-
-    * src/common.[ch]
-    Added function psf_memset() which works like the standard C function memset
-    but takes and sf_count_t as the length parameter.
-
-    * src/sndfile.c
-    Replaced calls to memset(0 with calls to psf_memset() as required.
-
-2002-07-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Added "libsndfile : " to the start of all error messages. This was suggested
-    by Conrad Parker author of Sweep ( http://sweep.sourceforge.net/ ).
-
-    * src/sfendian.[ch]
-    Added endswap_XXXX_copy() functions.
-
-    * src/pcm.c src/float32.c src/double64.c
-    Use endswap_XXXX_copy() functions and removed dead code.
-    Cleanups and optimisations.
-
-2002-07-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/sndfile.h
-    Gave values to all the SFC_* enum values to allow better control of the
-    interface as commands are added and removed.
-    Added new command SFC_SET_ADD_PEAK_CHUNK.
-
-    * src/wav.c src/aiff.c
-    Modified wav_write_header and aiff_write_header to make addition of a PEAK
-    chunk optional, even on floating point files.
-
-    * tests/benchmark.tpl
-    Added call to sf_command(SFC_SET_ADD_PEAK_CHUNK) to turn off addition of a
-    PEAK chunk for the benchmark where we are trying to miximize speed.
-
-    * src.pcm.c
-    Changed tribyte typedef to something more sensible.
-    Further conversion speed ups.
-
-2002-07-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/command.c
-    In major_formats rename "Sphere NIST" to "NIST Sphere".
-
-    * src/common.c src/sfendian.c
-    Moved all endswap_XXX_array() functions to sfendian.c. These functions will
-    be tweaked to provide maximum performance. Since maximum performance on one
-    platform does not guarantee maximum performance on another, a small set of
-    functions will be written and the optimal one chosen at compile time.
-
-    * src/common.h src/sfendian.h
-    Declarations of all endswap_XXX_array() functions moved to sfendian.h.
-
-    * src/Makefile.am
-    Add sfendian.c to build targets.
-
-2002-07-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c src/sfendian.h
-    Re-coded PCM encoders and decoders to match or better the speed of
-    libsndfile version 0.0.28.
-
-2002-06-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Add checking for WAVPACK data in standard PCM WAV file. Return error if
-    found. This WAVPACK is *WAY* broken. It uses the same PCM WAV file header
-    and then stores non-PCM data.
-
-    * tests/benchmark.tpl
-    Added more tests.
-
-2002-06-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/benchmark.tpl
-    Added conditional definition of M_PI.
-    For Win32, set WRITE_PERMS to 0777.
-
-    * Win32/Makefile.msvc
-    Added target to make generate program on Win32.
-
-    * src/samplitude.c
-    Removed handler for Samplitude RAP file format. This file type seems rarer
-    than hens teeth and is completely undocumented.
-
-    * src/common.h src/sndfile.c src/Makefile.am Win32/Makefile.msvc
-    Removed references to sampltiude RAP format.
-
-    * tests/benchmark.tpl
-    Benchmark program now prints the libsndfile version number when run. This
-    program was also backported to version 0 to compare results. Version
-    1.0.0rc2 is faster than version 0.0.28 on most conversions but slower on
-    some. The slow ones need to be fixed before final release.
-
-2002-06-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/benchmark.def tests/benchmark.tpl
-    New files which generate tests/benchmark.c using Autogen. Added int ->
-    SF_FORMAT_PCM_24 test.
-
-    * tests/benchmark.c
-    Now and Autogen output file.
-
-    * tests/Makefile.am
-    Updated for above changes.
-
-2002-06-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/benchmark.c
-    Basic benchmark program complete. Need to convert it to Autogen.
-
-    * Win32/Makefile.msvc
-    Added benchmark.exe target.
-
-2002-06-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/generate.c
-    New program to generate a number of different output file formats from a
-    single input file. This allows testing of the created files.
-
-    * tests/benchmark.c
-    New test program to benchmark libsndfile. Nowhere near complete yet.
-
-    * examples/Makefile.am tests/Makefile.am
-    New make rules for the two new programs.
-
-2002-06-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/libsndfile.def
-    Removed definition for sf_signal_max().
-
-    * src/sndfile.c
-    Removed cruft.
-
-    * doc/index.html
-    A number of documentation bugs were fixed. Thanks to Anand Kumria.
-
-    * doc/version-1.html
-    Minor doc updates.
-
-    * configure.in
-    Bumped version to 1.0.0rc2.
-
-    * src/sf_command.h src/Makefile.am
-    Removed the header file as it was no longer being used. Thanks to Anand
-    Kunria for spotting this.
-
-    * doc/index.html
-    A number of documentation bugs were fixed. Thanks to Anand Kumria.
-
-2002-06-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Test for Win32 before testing SIZEOF_OFF_T so that it works correctly
-    on Win32..
-
-    * src/file_io.c
-    Win32 fixes to ensure O_BINARY is used for file open.
-
-    * doc/win32.html
-    New file documenting the building libsndfile on Win32.
-
-    * doc/*.html
-    Updating of documentation.
-
-2002-06-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pcm_test.c
-    Minor changes to allow easier determination of test file name.
-
-    * src/sndfile.[ch]
-    Removed function sf_signal_max().
-
-    * examples/sndfile-play.c
-    Changed call to sf_signal_max() to a call to sf_command().
-
-2002-06-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/format.c src/command.c
-    Renamed format.c to command.c which will now include code for sf_command()
-    calls to perform operations other than format commands.
-
-    * src/sndfile.c src/sndfile.h
-    Removed function sf_get_signal_max() which is replaced by commands passed
-    to sf_command().
-
-    * src/command.c
-    Implement commands SFC_CALC_SIGNAL_MAX.
-
-    * doc/command.html
-    Documented SFC_CALC_SIGNAL_MAX.
-
-2002-06-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-play.c
-    Mods to make sndfile-play work on Solaris. The program sndfile-play now
-    runs on Linux, MaxOSX and Solaris. Win32 to come.
-
-    * src/format.c
-    Added SF_FORMAT_DWVW_* to subtype_formats array.
-
-    * src/nist.c
-    Added support for 8 bit NIST Sphere files. Example file supplied by Anand
-    Kumria.
-
-2002-06-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sndfile-info.c
-    Tidy up of output format.
-
-    * examnples/sndfile-play.c
-    Mods to make sndfile-play work on MacOSX using Apple's CoreAudio API.
-
-    * configure.in
-    Add new variables OS_SPECIFIC_INCLUDES and OS_SPECIFIC_LINKS which were
-    required to supply extra include paths and link parameters to get
-    sndfile-play working on MacOSX.
-
-    * examples/Makefile.am
-    Use OS_SPOECIFIC_INCLUDES and OS_SPECIFIC_LINKS to build commands for
-    sndfile-play.
-
-2002-06-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Added ability to read/write new NIST Sphere file types (A-law, u-law).
-    Header parser was re-written from scratch. Example files supplied by Anand
-    Kumria.
-
-    * src/sndfile.c
-    Support for A-law and u-law NIST files.
-
-    * tests/Makefile.am tests/lossy_comp_test.c
-    Tests for A-law and u-law NIST files.
-
-2002-06-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.c
-    Fixed an error in error string.
-
-2002-06-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * acinclude.m4
-    Removed exit command to allow cross-compiling.
-
-    * Win32/unistd.h src/file_io.c
-    Moved contents of first file into the second file (enclosed in #ifdef).
-    Win32/unistd.h is now an empty file but still must be there for libsndfile
-    to compile on Win32.
-
-    * src/sd2.c, src/sndfile.c:
-    Fixes for Sound Designer II files on big endian systems.
-
-2002-06-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Modified to work around problems with crappy MacOSX version of sed.
-    Added sanity check for proper values for CFLAGS.
-
-2002-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Code clean up in sf_open ().
-
-    * Win32/Makefile.msvc
-    Michael Fink's contributed MSVC++ makefile was hacked to bits and put back
-    together in a new improved form.
-
-    * src/file_io.c
-    Fixes for Win32; _lseeki64() returns an invalid argument for calls like
-    _lseeki64(fd, 0, SEEK_CUR) so need to use _telli64 (fd) instead.
-
-    * src/common.h src/sndfile.c src/wav.c src/aiff.c
-    Added SFE_LOG_OVERRUN error.
-    Added termination for potential infinite loop when parsing file headers.
-
-    * src/wav.c src/w64.c
-    Fixed bug casuing incorrect header generation when opening file read/write.
-
-2002-06-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/api.html
-    Improved the documentation to make it clearer that the file read method
-    and the underlying file format are completely disconnected. Suggested
-    by Josh Green.
-
-    * doc/command.html
-    Started correcting docs to take into account changes made to the
-    operations of the sf_command () function. Not complete yet.
-
-    * src/sndfile.c
-    Reverted some changes which had broken the partially working SDII header
-    parsing. Now have access to an iBook with OS X so reading and writing SDII
-    files on all platforms should be a reality in the near future. On Mac this
-    will involve reading the resource fork via the standard MacOS API. To move
-    a file from Mac to another OS, the resource and data forks will need to be
-    combined before transfer. The combined file will be read on both Mac and
-    other OSes like any other file.
-
-2002-06-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * ltmain.sh
-    Applied a patch from http://fink.sourceforge.net/doc/porting/libtool.php
-    which allows libsndfile to compile on MacOSX 10.1. This patch should not
-    interfere with compiling on other OSes.
-
-    * src/GSM610/private.h
-    Changes to fix compile problems on MacOSX (see src/GSM610/ChangeLog).
-
-    * src/float_cast.h
-    Added MacOSX replacements for lrint() and lrintf().
-
-2002-06-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Replaced the code to print the filename to the log buffer when a file is
-    opened. This code seems to have been left out during the merge of
-    sf_open_read() and sf_open_write() to make a single  functions sf_open().
-
-2002-06-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed a bug where the WAV header parser was going into an infinite loop
-    on a badly formed LIST chunk. File supplied by David Viens.
-
-2002-05-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Added a message at the end of the configuration process to warn about the
-    need for the use of pkg-config when linking programs against version 1 of
-    libsndfile.
-
-    * doc/pkg-config.html
-    New documentation file containing details of how to use pkg-config to
-    retrieve settings for CFLAGS and library locations for linking files
-    against version 1 of libsndfile.
-
-2002-05-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed minor bug in handling of so-called ACIDized WAV files.
-
-2002-05-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/libsndfile.def Win32/Makefile.msvc
-    Two new files contributed by Michael Fink (from the winLAME project)
-    which allows libsndfile to be built on windows in a MSDOS box by doing
-    "nmake -f Makefile.msvc". Way cool!
-
-2002-05-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    MacOSX is SSSOOOOOOO screwed up!!! I can't believe how hard it is to
-    generate a tarball which will configure and compile on that platform.
-    Joined the libtool mailing list to try and get some answers.
-
-2002-05-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Changed to autoconf version 2.50. MacOSX uses autoconf version 2.53 which
-    is incompatible with with version 2.13 which had been using until now.
-    The AC_SYS_LARGE_FILE macro distributed withe autoconf 2.50 is missing a
-    few features so AC_SYS_EXTRA_LARGE file was defined to replace it.
-
-    * configure.in
-    Changed to automake version 1.5 to try and make a tarball which will
-    work on MacOSX.
-
-2002-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_gsm610.c
-    Changed name to gsm610.c. Added reading/writing of headerless files.
-
-    * src/sndfile.c src/raw.c
-    Added ability to read/write headerless (SF_FORMAT_RAW) GSM 6.10 files.
-
-2002-05-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Clean up in preparation for Autogen-ing this file.
-
-    * src/GSM610/*.[ch]
-    Code cleanup and prepartion forgetting file seek working. Details in
-    src/GSM610/ChangeLog.
-
-    * sndfile.pc.in
-    Testing complete. Is sndfile.m4 still needed?
-
-2002-05-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.tpl tests/rdwr_test.tpl
-    Merged tests from these two programs into write_read_test.tpl and deleted
-    rdwr_test.tpl.
-
-2002-05-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c src/svx.c src/paf.c
-    Fixed bugs in read/write mode.
-
-2002-05-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/Makefile.am
-    Renamed sfplay.c to sndfile-play.c and sndfile_info.c to sndfile-info.c for
-    consistency when these programs become part of the Debian package
-    sndfile-programs.
-
-    * sndfile.pc.in
-    New file to replace sndfile-config.in. Libsndfile now uses the pkg-config
-    model for providing installation parameters to dependant programs.
-
-    * src/sndfile.c
-    Cleanup of code in sf_open().
-
-2002-05-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/utils.tpl tests/write_read_test.tpl
-    More conversion to Autogen fixes and enchancements.
-
-    * src/*.c
-    Read/write mode is now working for 16, 24 and 32 bit PCM as well as 32
-    bit float and 64 bit double data. More tests still required.
-
-    * src/Makefile.am
-    Added DISTCLEANFILES target to remove config.status and config.last.
-
-    * Win32/Makefile.am MacOS/Makefile.am
-    Added DISTCLEANFILES target to remove Makefile.
-
-2002-05-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch] tests/rdwr_test.c
-    More verifying workings of read/write mode. Fixing bugs found.
-
-    * tests/utils.[ch]
-    Made these files Autogen generated files.
-
-    * tests/util.tpl tests/util.def
-    New Autogen files to generate utils.[ch]. Moved some generic test functions
-    into this file. Autogen is such a great tool!
-
-2002-05-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c src/float_cast.h Win32/config.h
-    Fixed a couple of Win32 specific bugs pointed out by Michael Fink
-    (maintainer of WinLAME) and David Viens.
-
-    * tests/check_log_buffer.[ch] tests/utils.[ch]
-    Moved check_log_buffer() to utils.[ch] and deleted old file.
-
-2002-05-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.[ch] src/sndfile.c
-    New function psf_default_seek() which will be the default seek function
-    for things like PCM and floating point data. This default is set for
-    both read and write in sf_open() but can be over-ridden by any codec
-    during it's initialisation.
-
-2002-05-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c
-    AU files use a data size value of -1 to mean unknown. Fixed au_open_read()
-    to allow opening files like this.
-
-    * tests/rdwr_test .c
-    Added more tests.
-
-    * src/sndfile.c
-    Fixed bugs in read/write mode found due to improvements in the test
-    program.
-
-2002-04-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/rdwr_test .c
-    New file for testing read/write mode.
-
-2002-04-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * m4/*
-    Removed all m4 macros from this directory as they get concatenated to form
-    the file aclocal.m4 anyway.
-
-    * sndfile.m4
-    Moved this from the m4 directory to the root directory asn this is part of
-    the distribution and is installed during "make install".
-
-2002-04-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c
-    Removed logging of peaks for all file formats other than AIFF and WAV.
-
-    * tests/write_read_test.tpl tests/write_read_test.def
-    New files which autogen uses to generate write_read_test.c. Doing it this
-    way makes write_read_test.c far easier to maintain. Other test programs
-    will be converted to autogen in the near future.
-
-    * src/*.c
-    Fixed a few bugs found when testing on Sparc (bug endian) Solaris.
-
-2002-04-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * doc/*.html
-    Fixed documention versioning.
-
-    * configure.in
-    Fixed a bug in the routines which search for Large File Support on systems
-    which have large file support by defualt.
-
-2002-04-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch]
-    Found and fixed an issue which can cause a bug in other software (I was
-    porting Conrad Parker's Sweep program from version 0 of the library to
-    version 1). When opening a file for write, the libsndfile code would
-    set the sfinfo.samples field to a maximum value.
-
-    * tests/write_read_test.c
-    Added tests to detect the above problem.
-
-2002-04-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch]
-    Finished base implementation of read/write mode. Much more testing still
-    needed.
-
-    * m4/largefile.m4
-    Macro for detecting Large File Standard capabilities. This macro was ripped
-    out of the aclocal.m4 file of GNU tar-1.13.
-
-    * configure.in
-    Added detection of large file support. Files larger than 2 Gigabytes should
-    now be supported on 64 bit platforms and many 32 bit platforms including
-    Linux (2.4 kernel, glibc-2.2), *BSD, MacOS, Win32.
-
-    * libsndfile_convert_version.py
-    A Python script which attempts to autoconvert code written to use version 0
-    to version 1.
-
-2002-04-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch]
-    Finished base implementation of read/write mode. Much more testing still
-    needed.
-
-    * tests/write_read_test.c
-    Preliminary tests for read/write mode added. More needed.
-
-2002-04-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.[ch]
-    Removed sf_open_read() and sf_open_write() functions,replacting them with
-    sf_open() which takes an extra mode parameter (SF_OPEN_READ, SF_OPEN_WRITE,
-    or SF_OPEN_RDWR). This new function sf_open can now be modified to allow
-    opening a file formodification (RDWR).
-
-2002-04-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Completed merging of separate xxx_open_read() and xxx_open_write()
-    functions. All tests pass.
-
-2002-04-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c
-    Massive refactoring required to merge au_open_read() with au_open_write()
-    to create au_open().
-
-2002-04-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Started changes required to allow a sound file to be opened in read/write
-    mode, with separate file pointers for read and write. This involves merging
-    of encoder/decoder functions like pcm_read_init() and pcm_write_init()
-    int a new function pcm_init() as well as doing something similar for all
-    the file type specific functions ie aiff_open_read() and aiff_open_write()
-    were merged to make the function aiff_open().
-
-2002-04-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/file_io.c
-    New file containing psf_fopen(), psf_fread(), psf_fwrite(), psf_fseek() and
-    psf_ftell() functions. These function will replace use of fopen/fread/fwrite
-    etc and allow access to files larger than 2 gigabytes on a number of 32 bit
-    OSes (Linux on x86, 32 bit Solaris user space apps, Win32 and MacOS).
-
-    * src/*.c
-    Replaced all instances of fopen with psf_open, fread with psd_read, fwrite
-    with psf_write and so on.
-
-2002-03-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/dwvw.c
-    Finally fixed all known problems with 12, 16 and 24 bit DWVW encoding.
-
-    * tests/floating_point_test.c
-    Added tests for 12, 16 and 24 bit DWVW encoding.
-
-2002-03-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * m4/endian.m4
-    Defines a new m4 macro AC_C_FIND_ENDIAN, for determining the endian-ness of
-    the target CPU. It first checks for the definition of BYTE_ORDER in
-    <endian.h>, then in <sys/types.h> and <sys/param.h>. If none of these work
-    and the C compiler is not a cross compiler it compiles and runs a program
-    to test for endian-ness. If the compiler is a cross compiler it makes a
-    guess based on $target_cpu.
-
-    * configure.in
-    Modified to use AC_C_FIND_ENDIAN.
-
-    * src/sfendian.h
-    Simplified.
-
-2002-02-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/floating_point_test.c
-    Tests completely rewritten using the dft_cmp function. Now able to
-    calculate a quick guesstimate of the Signal to Noise Ratio of the encoder.
-
-2002-02-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/dft_cmp.[ch]
-    New files containing functions for comparing pre and post lossily
-    compressed data using a quickly hacked DFT.
-
-    * tests/utils.[ch]
-    New files containing functions for saving pre and post encoded data in a
-    file readable by the GNU Octave package.
-
-2002-02-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * m4/lrint.m4 m4/lrintf.m4
-    Fixed m4 macros to define HAVE_LRINT and HAVE_LRINTF even when the test
-    is cached.
-
-2002-02-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/floating_point_test.c
-    Fixed improper use of strncat ().
-
-2002-02-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/headerless_test.c
-    New test program to test the ability to open and read a known file type as a
-    RAW header-less file.
-
-2002-02-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/losy_comp_test.c
-    Added a test to ensure that the data read from a file is not all zeros.
-
-    * examples/sfconvert.c
-    Added "-gsm610" encoding types.
-
-2002-01-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfconvert.c
-    Added "-dwvw12", "-dwvw16" and "-dwvw24" encoding types.
-
-    * tests/dwvw_test.c
-    New file for testing DWVW encoder/decoder.
-
-2002-01-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/dwvw.c
-    Implemented writing of DWVW. 12 bit seems to work, 16 and 24 bit still broken.
-
-    * src/aiff.c
-    Improved reporting of encoding types.
-
-    * src/voc.c
-    Clean up.
-
-2002-01-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/dwvw.c
-    New file implementing lossless Delta Word Variable Width (DWVW) encoding.
-    Reading 12 bit DWVW is now working.
-
-    * src/aiff.c common.h sndfile.c
-    Added hooks for DWVW encoded AIFF and RAW files.
-
-2002-01-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Robustify header parsing.
-
-    * src/wav_w64.h
-    Header file wav.h was renamed to wav_w64.h to signify sharing of
-    definitions across the two file types.
-
-    * src/wav.c src/w64.c src/wav_w64.c
-    Refactoring.
-    Modified and moved functions with a high degree of similarity between
-    wav.c and w64.c to wav_w64.c.
-
-2002-01-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Completed work on getting read and write working.
-
-    * examples/sfplay.c
-    Added code to scale floating point data so it plays at a reasonable volume.
-
-    * tests/Makefile.am tests/write_read_test.c
-    Added tests for W64 files.
-
-2002-01-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Modded all code in file header writing routines to use
-    psf_new_binheader_writef().
-    Removed psf_binheader_writef() from src/common.c.
-    Globally replaced psf_new_binheader_writef with psf_binheader_writef.
-
-2002-01-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Modded all code in file parsing routines to use psf_new_binheader_readf().
-    Removed psf_binheader_readf() from src/common.c.
-    Globally replaced psf_new_binheader_readf with psf_binheader_readf.
-
-    * src/common.[ch]
-    Added new function psf_new_binheader_writef () which will soon replace
-    psf_binheader_writef (). The new function has basically the same function
-    as the original but has a more flexible and capable interface. It also
-    allows the writing of 64 bit integer values for files contains 64 bit file
-    offsets.
-
-2002-01-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/formats.c src/sndfile.c src/sndfile.h
-    Added code allowing full enumeration of supported file formats via the
-    sf_command () interface.
-    This feature will allow applications to avoid needing recompilation when
-    support for new file formats are added to libsndfile.
-
-    * tests/command_test.c
-    Added test code for the above feature.
-
-    * examples/list_formats.c
-    New file. An example of the use of the supported file enumeration
-    interface. This program lists all the major formats and for each major
-    format the supported subformats.
-
-2002-01-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch] tests/*.c
-    Changed command parameter of sf_command () function from a test string to
-    an int. The valid values for the command parameter begin with SFC_ and are
-    listed in src/sndfile.h.
-
-2001-12-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/formats.c src/sndfile.c
-    Added an way of enumerating a set of common file formats using the
-    sf_command () interface. This interface was suggested by Dominic Mazzoni,
-    one of the main authors of Audacity (http://audacity.sourceforge.net/).
-
-2001-12-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Added checking of filename parameter in sf_open_read (). Previousy, if a
-    NULL pointer was passed the library would segfault.
-
-2001-12-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c src/common.h
-    Changed the len parameter of the endswap_*_array () functions from type
-    int to type long.
-
-    * src/pcm.c
-    Fixed a problem which
-
-2001-12-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Added conditional #include <sys/types.h> for EMX/gcc on OS/2. Thanks to
-    Paul Hartman for pointing this out.
-
-    * tests/lossy_comp_test.c tests/floating_point_test.c
-    Added definitions for M_PI for when it isn't defined in <math.h>.
-
-2001-11-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ircam.c
-    Re-implemented the header reader. Old version was making incorrect
-    assumptions about the endian-ness of the file from the magic number at the
-    start of the file. The new code looks at the integer which holds the
-    number of channels and determines the endian-ness from that.
-
-2001-11-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Added support for other AIFC types ('raw ', 'in32', '23ni').
-    Further work on IMA ADPCM encoding.
-
-2001-11-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ima_adpcm.c
-    Renamed from wav_ima_adpcm.c. This file will soon handle IMA ADPCM
-    encodings for both WAV and AIFF files.
-
-    * src/aiff.c
-    Started adding IMA ADPCM support.
-
-2001-11-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/double.c
-    New file for handling double precision floating point (SF_FORMAT_DOUBLE)
-    data.
-
-    * src/wav.c src/aiff.c src/au.c src/raw.c
-    Added support for SF_FORMAT_DOUBLE data.
-
-    * src/common.[ch]
-    Addition of endswap_long_array () for endian swapping 64 bit integers. This
-    function will work correctly on processors with 32 bit and 64 bit longs.
-    Optimised endswap_short_array () and endswap_int_array ().
-
-    * tests/pcm_test.c
-    Added and extra check. After the first file of each type is written to disk
-    a checksum is performed of the first 64 bytes and checked against a pre-
-    calculated value. This will work whatever the endian-ness of the host
-    machine.
-
-2001-11-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Added handling of u-law, A-law encoded AIFF files. Thanks to Tom Erbe for
-    supplying example files.
-
-    * tests/lossy_comp_test.c
-    Added tests for above.
-
-    * src/common.h src/*.c
-    Removed function typedefs from common.h and function pointer casting in all
-    the other files. This allows the compiler to perform proper type checking.
-    Hopefully this will prevernt problems like the sf_seek bug for OpenBSD,
-    BeOS etc.
-
-    * src/common.[ch]
-    Added new function psf_new_binheader_readf () which will eventually replace
-    psf_binheader_readf (). The new function has basically the same function as
-    the original but has a more flexible and capable interface. It also allows
-    the reading of 64 bit integer values for files contains 64 bit file
-    offsets.
-
-2001-11-26  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Completed implementation of VOC file handling. Can now handle 8 and 16 bit
-    PCM, u-law and A-law files with one or two channels.
-
-    * src/write_read_test.c tests/lossy_comp_test.c
-    Added tests for VOC files.
-
-2001-11-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float_cast.h
-    Added inline asm version of lrint/lrintf for MacOS. Solution provided by
-    Stephane Letz.
-
-    * src/voc.c
-    More work on this braindamaged format. The VOC files produced by SoX also
-    have a number of inconsistencies.
-
-2001-11-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    Added support for 8 bit PCM PAF files.
-
-    * tests/write_read_test.c
-    Added tests for 8 bit PAF files.
-
-2001-11-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/pcm_test.c
-    New test program to test for correct scaling of integer values between
-    different sized integer containers (ie short -> int).
-    The new specs for libsndfile state that when the source and destination
-    containers are of a different size, the most significant bit of the source
-    value becomes the most significant bit of the destination container.
-
-    * src/pcm.c src/paf.c
-    Modified to pass the above test program.
-
-    * tests/write_read_test.c tests/lossy_comp_test.c
-    Modified to work with the new scaling rules.
-
-2001-11-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/raw.c tests/write_read_test.c tests/write_read_test.c
-    Added ability to do raw reads/writes of float, u-law and A-law files.
-
-    * src/*.[ch] examples/*.[ch] tests/*.[ch]
-    Removed dependance on pcmbitwidth field of SF_INFO struct and moved to new
-    SF_FORMAT_* types and use of SF_ENDIAN_BIG/LITTLE/CPU.
-
-2001-11-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch]
-    Started implmentation of major changes documented in doc/version1.html.
-
-    Removed all usage of off_t which is not part of the ISO C standard. All
-    places which were using it are now using type long which is the type of
-    the offset parameter for the fseek function.
-    This should fix problems on BeOS, MacOS and *BSD like systems which were
-    failing "make check" because sizeof (long) != sizeof (off_t).
-
---------------------------------------------------------------------------------
-This is the boundary between version 1 of the library above and version 0 below.
---------------------------------------------------------------------------------
-
-2001-11-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfplay_beos.cpp
-    Added BeOS version of sfplay.c. This needs to be compiled using a C++
-    compiler so is therefore not built by default. Thanks to Marcus Overhagen
-    for providing this.
-
-2001-11-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfplay.c
-    New example file showing how libsndfile can be used to read and play a
-    sound file.
-    At the moment on Linux is supported. Others will follow in the near future.
-
-2001-11-09  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    Fixed problem with normalisation code where a value of 1.0 could map to
-    a value greater than MAX_SHORT or MAX_INT. Thanks to Roger Dannenberg for
-    pointing this out.
-
-2001-11-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    Fixed scaling issue when reading/writing 8 bit files using
-    sf_read/sf_write_short ().
-    On read, values are scaled so that the most significant bit in the char
-    ends up in the most significant bit of the short. On write, values are
-    scaled so that most significant bit in the short ends up as the most
-    significant bit in the char.
-
-2001-11-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c src/sndfile.c
-    Added support for 32 bit float data in big and little endian AU files.
-
-    * tests/write_read_test.c
-    Added tests for 32 bit float data in AU files.
-
-2001-11-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Finalised testing of stereo files where possible.
-
-2001-11-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_ms_adpcm.c
-    Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for
-    pointing out this problem.
-
-2001-10-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_ms_adpcm.c
-    Modified function srate2blocksize () to handle 44k1Hz stereo files.
-
-2001-10-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/w64.c
-    Added support for Sonic Foundry 64 bit WAV format. As Linux (my main
-    development platform) does not yet support 64 bit file offsets by default,
-    current handling of this file format treats everything as 32 bit and fails
-    openning the file, if it finds anything that goes beyond 32 bit values.
-
-    * src/sndfile.[hc] src/common.h src/Makefile.am
-    Added hooks for W64 support.
-
-2001-10-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Added more warnings options to CFLAGS when the gcc compiler is detected.
-
-    * src/*.[ch] tests/*.c examples/*.c
-    Started fixing the warning messages due to the new CFLASG.
-
-    * src/voc.c
-    More work on VOC file read/writing.
-
-    * src/paf.c
-    Found that PAF files were not checking the normalisation flag when reading
-    or writing floats and doubles. Fixed it.
-
-    * tests/floating_point_test.c
-    Added specific test for the above problem.
-
-    * src/float_cast.h src/pcm.c
-    Added a section for Win32 to define lrint () and lrintf () in the header
-    and implement it in the pcm.c
-
-2001-10-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * sndfile-config.in m4/sndfile.m4
-    These files were donated by Conrad Parker who also provided instructions
-    on how to install them using autoconf/automake.
-
-    * src/float_cast.h
-    Fiddled around with this file some more. On Linux and other gcc supported
-    OSes use the C99 functions lrintf() and lrint() for casting from floating
-    point to int without incurring the huge perfromance penalty (particularly
-    on the i386 family) caused by the regular C cast from float to int.
-    These new C99 functions replace the FLOAT_TO_* and DOUBLE_TO_* macros which
-    I had been playing with.
-
-    * configure.in m4/lrint.m4 m4/lrintf.m4
-    Add detection of these functions.
-
-2001-10-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Completed code for reading VOC files containing a single audio data
-    segment.
-    Started implementing code to handle files with multiple VOC_SOUND_DATA
-    segments but couldn't be bothered finishing it. Multiple segment files can
-    have different sample rates for different sections and other nasties like
-    silence and repeat segments.
-
-2001-10-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/*.c
-    Removed SF_PRIVATE struct field fdata and replaced it with extra_data.
-
-    * src/voc.c
-    Further development of the read part of this woefult file format.
-
-2001-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float_cast.h
-    Implemented gcc and i386 floating point to int cast macros. Standard cast
-    will be used when not on gcc for i385.
-
-    * src/pcm.c
-    Modified all uses of FLOAT/DOUBLE_TO_INT and FLOAT/DOUBLE_TO_SHORT casts to
-    comply with macros in float_cast.h.
-
-2001-10-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/voc.c
-    Changed the TYPE_xxx enum names to VOC_TYPE_xxx to prevent name clashes
-    on MacOS with CodeWarrior 6.0.
-
-    * MacOS/MacOS-readme.txt
-    Updated the compile instructions. Probably still need work as I don't have
-    access to a Mac.
-
-2001-10-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/aiff.c common.c
-    Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to
-    LSF_VSNPRINTF. LSF_VSNPRINTF and LSF_VSNPRINTF are defined in common.h.
-
-    * src/common.h
-    Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining
-    LSF_VSNPRINTF and LSF_VSNPRINTF to appropriate values.
-
-    * src/missing.c
-    New file containing a minimal implementation of snprintf and vsnprintf
-    functions named missing_snprintf and missing_vsnprintf respectively. These
-    are only compliled into the binary if snprintf and/or vsnprintf are not
-    available.
-
-2001-09-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ircam.c
-    New file to handle Berkeley/IRCAM/CARL files.
-
-    * src/sndfile.c src/common.h
-    Modified for IRCAM handling.
-
-    * tests/*.c
-    Added tests for IRCAM files.
-
-2001-09-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with
-    20 byte format chunks (contrary to ms's own documentation). Fixed the WAV
-    header writing code to generate smaller ms compliant ulaw and Alaw WAV
-    files.
-
-2001-09-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/stdio_test.sh tests/stdio_test.c
-    Shell script was rewritten as a C program due to incompatibilities of the
-    sh shell on Linux and Solaris.
-
-2001-09-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/stdio_test.sh tests/stdout_test.c tests/stdin_test.c
-    New test programs to verify the correct operation of reading from stdin and
-    writing to stdout.
-
-    * src/sndfile.c wav.c au.c nist.c paf.c
-    Fixed a bugs uncovered by the new test programs above.
-
-2001-09-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c wav.c
-    Fixed a bug preventing reading a file from stdin. Found by T. Narita.
-
-2001-09-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA
-    WAV files. Root cause was the declaration of the func_seek typedef not
-    matching the functions it was actually being used to point to. In OpenBSD
-    sizeof (off_t) != sizeof (int). Thanks to Heikki Korpela for allowing me
-    to log into his OpenBSD machine to debug this problem.
-
-2001-09-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Implemented sf_command ("norm float").
-
-    * src/*.c
-    Implemented handling of sf_command ("set-norm-float"). Float normalization
-    can now be turned on and off.
-
-    * tests/double_test.c
-    Renamed to floating_point_test.c. Modified to include tests for all scaled
-    reads and writes of floats and doubles.
-
-    * src/au_g72x.c
-    Fixed bug in normalization code found with improved floating_point_test
-    program.
-
-    * src/wav.c
-    Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract
-    text annotations from WAV files.
-
-    * src/aiff.c
-    Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract
-    text annotations from WAV files.
-
-2001-09-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sf_info.c example/Makefile.am
-    Renamed to sndfile_info.c. The program sndfile_info will now be installed
-    when the library is installed.
-
-    * src/float_cast.h
-    New file defining floating point to short and int casts. These casts will
-    eventually replace all flot and double casts to short and int. See comments
-    at the top of the file for the reasoning.
-
-    * src/*.c
-    Changed all default float and double casts to short or int with macros
-    defined in floatcast.h. At the moment these casts do nothing. They will be
-    replaced with faster float to int cast operations in the near future.
-
-2001-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/command_test.c
-    New file for testing sf_command () functionality.
-
-    * src/sndfile.c
-    Revisiting of error return values of some functions.
-    Started implementing sf_command () a new function will allow on-the-fly
-    modification of library behaviour, or instance, sample value scaling.
-
-    * src/common.h
-    Added hook for format specific sf_command () calls to SNDFILE struct.
-
-    * doc/api.html
-    Updated and errors corrected.
-
-    * doc/command.html
-    New documentation file explaining new sf_command () function.
-
-2001-08-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed error return values from sf_read*() and sf_write*(). There were
-    numerous instances of -1 being returned through size_t. These now all set
-    error int the SF_PRIVATE struct and return 0. Thanks to David Viens for
-    spotting this.
-
-2001-08-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fixed use of va_arg() calls that were causing warning messages with the
-    latest version of gcc (thanks Maurizio Umberto Puxeddu).
-
-2001-07-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c src/sfendian.h
-    Moved definition of MAKE_MARKER macro to sfendian.h
-
-2001-07-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Modified sf_get_lib_version () so that version string will be visible using
-    the Unix strings command.
-
-    * examples/Makefile.am examples/sfinfo.c
-    Renamed sfinfo program and source code to sf_info. This prevents a name
-    clash with the program included with libaudiofile.
-
-2001-07-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/read_seek_test.c tests/lossy_comp_test.c
-    Added tests for sf_read_float () and sf_readf_float ().
-
-    * src/voc.c
-    New files for handling Creative Voice files (not complete).
-
-    * src/samplitude.c
-    New files for handling Samplitude files (not complete).
-
-2001-07-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/au.c src/paf.c src/svx.c src/wav.c
-    Converted these files to using psf_binheader_readf() function. Will soon be
-    ready to attempt to make reading writing from pipes work reliably.
-
-    * src/*.[ch]
-    Added code for sf_read_float () and sf_readf_float () methods of accessing
-    file data.
-
-2001-07-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c src/wav_gsm610.c
-    Removed two printf()s which had escaped notice for some time (thanks
-    Sigbjørn Skjæret).
-
-2001-07-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_gsm610.c
-    Fixed a bug which prevented GSM 6.10 encoded WAV files generated by
-    libsndfile from being played in Windoze (thanks klay).
-
-2001-07-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.[ch]
-    Implemented psf_binheader_readf() which will do for file header reading what
-    psf_binheader_writef() did for writing headers. Will eventually allow
-    libsndfile to read and write from pipes, including named pipes.
-
-2001-07-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * MacOS/config.h Win32/config.h
-    Attempted to bring these two files uptodate with src/config.h. As I don't
-    have access to either of these systems support for them may be completely
-    broken.
-
-2001-06-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c
-    Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now
-    tested on Intel x86 and UltraSparc processors.
-
-2001-06-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Modified to allow REX files (from Propellorhead's Recycle and Reason
-    programs) to be read.
-    REX files are basically an AIFF file with slightly unusual sequence of
-    chunks (AIFF files are supposed to allow any sequence) and some extra
-    application specific information.
-    Not yet able to write a REX file as the details of the application specific
-    data is unknown.
-
-2001-06-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed endian bug when reading PEAK chunk on big endian machines.
-
-    * src/common.c
-    Fixed endian bug when reading PEAK chunk on big endian machines with
-    --enable-force-broken-float configure option.
-    Fix psf_binheader_writef for (FORCE_BROKEN_FLOAT ||______)
-
-2001-06-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in src/config.h.in
-    Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float
-    capabilities are detected at run time.
-    Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines
-    where the processor can in fact handle floats correctly.
-
-    * src/float32.c
-    Rejigged code reading and writing of floats on broken processors.
-
-    * m4/
-    Removed this directory and all its files as they are no longer needed.
-
-2001-06-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/peak_chunk_test.c
-    New test to validate reading and writing of peak chunk.
-
-    * examples/sfconvert
-    Added -float32 option.
-
-    * src/*.c
-    Changed all error return values to negative values (ie the negative of what
-    they were).
-
-    * src/sndfile.c tests/error_test.c
-    Modified to take account of the previous change.
-
-2001-06-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/float32.c
-    File renamed from wav_float.c and renamed function to something more
-    general.
-    Added runtime detection of floating point capabilities.
-    Added recording of peaks during write for generation of PEAK chunk.
-
-    * src/wav.c src/aiff.c
-    Added handing for PEAK chunk for floating point files. PEAK is read when the
-    file headers are read and generated when the file is closed. Logic is in
-    place for adding PEAK chunk to end of file when writing to a pipe (reading
-    and writing from/to pipe to be implemented soon).
-
-    * src/sndfile.c
-    Modified sf_signal_max () to use PEAK values if present.
-
-2001-06-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all
-    other calls to functions in this file from the filetype specific files.
-
-    * src/*.c
-    Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and
-    ulaw_write_init () and removed all other calls to functions in alaw.c and
-    ulaw.c from the filetype specific files.
-
-    * tests/write_read_test.c
-    Added tests to validate sf_seek () on all file types.
-
-    * src/raw.c
-    Implemented raw_seek () function to fix a bug where
-    sf_seek (file, 0, SEEK_SET) on a RAW file failed.
-
-    * src/paf.c
-    Fixed a bug in paf24_seek () found due to added seeks tests in
-    tests/write_read_test.c
-
-2001-06-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/read_seek_test.c
-    Fixed a couple of broken binary files.
-
-    * src/aiff.c src/wav.c
-    Added handling of PEAK chunks on file read.
-
-2001-05-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * check_libsndfile.py
-    New file for the regression testing of libsndfile.
-    check_libsndfile.py is a Python script which reads in a file containing
-    filenames of audio files. Each file is checked by running the examples/sfinfo
-    program on them and checking for error or warning messages in the libsndfile
-    log buffer.
-
-    * check_libsndfile.list
-    This is an example list of audio files for use with check_libsndfile.py
-
-    * tests/lossy_comp_test.c
-    Changed the defined value of M_PI for math header files which don't have it.
-    This fixed validation test failures on MetroWerks compilers. Thanks to Lord
-    Praetor Satanus of Acheron for bringing this to my attention.
-
-2001-05-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.[ch]
-    Removed psf_header_setf () which was no longer required after refactoring
-    and simplification of header writing.
-    Added 'z' format specifier to psf_binheader_writef () for zero filling header
-    with N bytes. Used by paf.c and nist.c
-
-    * tests/check_log_buffer.c
-    New file implementing check_log_buffer () which reads the log buffer of a
-    SNDFILE* object and searches for error and warning messages. Calls exit ()
-    if any are found.
-
-    * tests/*.c
-    Added calls to check_log_buffer () after each call to sf_open_XXX ().
-
-2001-05-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/wav_ms_adpcm.c src/wav_gsm610.c
-    Major rehack of header writing using psf_binheader_writef ().
-
-2001-05-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/wav_ima_adpcm.c
-    Major rehack of header writing using psf_binheader_writef ().
-
-2001-05-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Changed return type of get_encoding_str () to prevent compiler warnings on
-    Mac OSX.
-
-    * src/aiff.c src/au.c
-    Major rehack of header writing using psf_binheader_writef ().
-
-2001-05-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h src/common.c
-    Added comments.
-    Name of log buffer changed from strbuffer to logbuffer.
-    Name of log buffer index variable changed from strindex to logindex.
-
-    * src/*.[ch]
-    Changed name of internal logging function from psf_sprintf () to
-    psf_log_printf ().
-    Changed name of internal header generation functions from
-    psf_[ab]h_printf () to psf_asciiheader_printf () and
-    psf_binheader_writef ().
-    Changed name of internal header manipulation function psf_hsetf () to
-    psf_header_setf ().
-
-2001-05-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    Fixed reading and writing of sample_byte_format header. "01" means little
-    endian and "10" means big endian regardless of bit width.
-
-    * configure.in
-    Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is
-    way screwed up and spews out buckets of warning messages from the system
-    headers.
-    Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for
-    easier debugging.
-    Made decision to harmonise source code version number and .so library
-    version number. Future releases will stick to this rule.
-
-    * doc/new_file_type.HOWTO
-    New file to document the addition of new file types to libsndfile.
-
-2001-05-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/nist.c
-    New file for reading/writing Sphere NIST audio file format.
-    Originally requested by Elis Pomales in 1999.
-    Retrieved from unstable (and untouched for 18 months) branch of libsndfile.
-    Some vital information gleaned from the source code to Bill Schottstaedt's
-    sndlib library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
-    Currently reading and writing 16, 24 and 32 bit, big-endian and little
-    endian, stereo and mono files.
-
-    * src/common.h src/common.c
-    Added psf_ah_printf () function to help construction of ASCII headers (ie NIST).
-
-    * configure.in
-    Added test for vsnprintf () required by psf_ah_printf ().
-
-    * tests/write_read_test.c
-    Added tests for supported NIST files.
-
-2001-05-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.c
-    Added tests for little endian AIFC files.
-
-    * src/aiff.c
-    Minor re-working of aiff_open_write ().
-    Added write support for little endian PCM encoded AIFC files.
-
-2001-05-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Minor re-working of aiff_open_read ().
-    Added read support for little endian PCM encoded AIFC files from the Mac
-    OSX CD ripper program. Guillaume Lessard provided a couple of sample files
-    and a working patch.
-    The patch was not used as is but gave a good guide as to what to do.
-
-2001-05-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h
-    Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard
-    pointed out the error.
-
-2001-04-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/make_sine.c
-    Re-write of this example using sample rate and required frequency in Hz.
-
-2001-02-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed bug that prevented known file types from being read as RAW PCM data.
-
-2000-12-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Added handing of COMT chunk.
-
-2000-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfconvert.c
-    Fixed bug in normalisatio code. Pointed out by Johnny Wu.
-
-2000-11-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * Win32/config.h
-    Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue.
-
-2000-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/Makefile.am
-    Added -lm for write_read_test_LDADD.
-
-2000-10-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/au.c
-    Fixed bug which prevented writing of G723 24kbps AU files.
-
-    * tests/lossy_comp_test.c
-    Corrrection to options for G723 tests.
-
-    * configure.in
-    Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which
-    doesn't allow gcc -pipe option.
-
-2000-09-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/ulaw.c src/alaw.c src/wav_imaadpcm.c src/msadpcm.c src/wav_gsm610.c
-    Fixed normailsation bugs shown up by new double_test program.
-
-2000-08-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c
-    Fixed bug in normalisation code (spotted by Steve Lhomme).
-
-    * tests/double_test.c
-    New file to test scaled and unscaled sf_read_double() and sf_write_double()
-    functions.
-
-2000-08-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * COPYING
-    Changed to the LGPL COPYING file (spotted by H. S. Teoh).
-
-2000-08-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h
-    Removed prototype of unimplemented function sf_get_info(). Added prototype
-    for sf_error_number() Thanks to Sigbjørn Skjæret for spotting these.
-
-2000-08-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/newpcm.h
-    New file to contain a complete rewrite of the PCM data handling.
-
-2000-08-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbjørn
-    Skjæret for spotting this one.
-
-2000-08-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au_g72x.c src/G72x/g72x.c
-    Added G723 encoded AU file support.
-
-    * tests/lossy_comp_test.c
-    Added tests for G721 and G723 encoded AU files.
-
-2000-08-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * all files
-    Changed the license to LGPL. Albert Faber who had copyright on
-    Win32/unistd.h gave his permission to change the license on that file. All
-    other files were either copyright erikd AT mega-nerd DOT com or copyright
-    under a GPL/LGPL compatible license.
-
-2000-08-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Fixed incorrect error message.
-
-    * src/au_g72x.c src/G72x/*
-    G721 encoded AU files now working.
-
-    * Win32/README-Win32.txt
-    Replaced this file with a new one which gives a full explanation
-    of how to build libsndfile under Win32. Thanks to Mike Ricos.
-
-2000-08-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.[ch]
-    Removed double leading underscores from the start of all variable and
-    function names. Identifiers with a leading underscores are reserved
-    for use by the compiler.
-
-    * src/au_g72x.c src/G72x/*
-    Continued work on G721 encoded AU files.
-
-2000-07-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/G72x/*
-    New files for reading/writing G721 and G723 ADPCM audio. These files
-    are from a Sun Microsystems reference implementation released under a
-    free software licence.
-    Extensive changes to this code to make it fit in with libsndfile.
-    See the ChangeLog in this directory for details.
-
-    * src/au_g72x.c
-    New file for G721 encoded AU files.
-
-2000-07-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * libsndfile.spec.in
-    Added a spec file for making RPMs. Thanks to Josh Green for supplying this.
-
-2000-06-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/sndfile.h
-    Add checking for and handling of header-less u-law encoded AU/SND files.
-    Any file with a ".au" or ".snd" file extension and without the normal
-    AU file header is treated as an 8kHz, u-law encoded file.
-
-    * src/au.h
-    New function for opening a headerless u-law encoded file for read.
-
-2000-06-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    Add checking for files shorter than minimal PAF file header length.
-
-2000-06-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.c
-    Added extra sf_perror() calls when sf_write_XXXX fails.
-
-2000-05-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Modified usage of va_arg() macro to work correctly on PowerPC
-    Linux. Thanks to Kyle Wheeler for giving me ssh access to his
-    machine while I was trying to track this down.
-
-    * configure.in src/*.[ch]
-    Sorted out some endian-ness issues brought up by PowerPC Linux.
-
-    * tests/read_seek_test.c
-    Added extra debugging for when tests fail.
-
-2000-05-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Fixed bug in GSM 6.10 handling for big-endian machines. Thanks
-    to Sigbjørn Skjæret for reporting this.
-
-2000-04-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/wav.c src/wav_gsm610.c
-    Finallised writing of GSM 6.10 WAV files.
-
-    * tests/lossy_comp_test.c
-    Wrote new test code for GSM 6.10 files.
-
-    * examples/sfinfo.c
-    Fixed incorrect format in printf() statement.
-
-2000-04-06  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h.in
-    Fixed comments about sf_perror () and sf_error_str ().
-
-2000-03-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Fixed --enable-justsrc option.
-
-2000-03-07  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * wav.c
-    Fixed checking of bytespersec field of header. Still some weirdness
-    with some files.
-
-2000-03-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/lossy_comp_test.c
-    Added option to test PCM WAV files (sanity check).
-    Fixed bug in sf_seek() tests.
-
-2000-02-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/wav.c
-    Minor changes to allow writing of GSM 6.10 WAV files.
-
-2000-02-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in Makefile.am src/Makefile.am
-    Finally got around to figuring out how to build a single library from
-    multiple source directories.
-    Reading GSM 6.10 files now seems to work.
-
-2000-01-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Added more error reporting in read_fmt_chunk().
-
-1999-12-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfinfo.c
-    Modified program to accept multiple filenames from the command line.
-
-1999-11-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_ima_adpcm.c
-    Moved code around in preparation to adding ability to read/write IMA ADPCM
-    encoded AIFF files.
-
-1999-11-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Fixed put_int() and put_short() macros used by _psf_hprintf() which were
-    causing seg. faults on Sparc Solaris.
-
-1999-11-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.c
-    Added string.h to includes. Thanks to Sigbjxrn Skjfret.
-
-    * src/svx.c
-    Fixed __svx_close() function to ensure FORM and BODY chunks are correctly
-    set.
-
-1999-10-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c
-    Fixed handling of incorrect size field in AU header on read. Thanks to
-    Christoph Lauer for finding this problem.
-
-1999-09-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fixed a bug with incorrect SSND chunk length being written. This also lead
-    to finding an minor error in AIFF header parsing. Thanks to Dan Timis for
-    pointing this out.
-
-1999-09-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    Fixed a bug with reading and writing 24 bit stereo PAF files. This problem
-    came to light when implementing tests for the new functions which operate
-    in terms of frames rather than items.
-
-1999-09-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Modified file type detection to use first 12 bytes of file rather than
-    file name extension. Required this because NIST files use the same
-    filename extension as Microsoft WAV files.
-
-    * src/sndfile.c src/sndfile.h
-    Added short, int and double read/write functions which work in frames
-    rather than items. This was originally suggested by Maurizio Umberto
-    Puxeddu.
-
-1999-09-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/svx.c
-    Finished off implementation of write using __psf_hprintf().
-
-1999-09-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/common.h
-    Added a buffer to SF_PRIVATE for writing the header. This is required
-    to make generating headers for IFF/SVX files easier as well as making
-    it easier to do re-write the headers which will be required when
-    sf_rewrite_header() is implemented.
-
-    * src/common.c
-    Implemented __psf_hprintf() function. This is an internal function
-    which is documented briefly just above the code.
-
-1999-09-05  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed a bug in sf_write_raw() where it was returning incorrect values
-    (thanks to Richard Dobson for finding this one). Must put in a test
-    routine for sf_read_raw and sf_write_raw.
-
-    * src/aiff.c
-    Fixed default FORMsize in __aiff_open_write ().
-
-    * src/sndfile.c
-    Added copy of filename to internal data structure. IFF/SVX files
-    contain a NAME header chunk. Both sf_open_read() and sf_open_write()
-    copy the file name (less the leading path information) to the
-    filename field.
-
-    * src/svx.c
-    Started implementing writing of files.
-
-1999-08-04  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/svx.c
-    New file for reading/writing 8SVX and 16SVX files.
-
-    * src/sndfile.[ch] src/common.h
-    Changes for SVX files.
-
-    * src/aiff.c
-    Fixed header parsing when unknown chunk is found.
-
-1999-08-01  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/paf.c
-    New file for reading/writing Ensoniq PARIS audio file format.
-
-    * src/sndfile.[ch] src/common.h
-    Changes for PAF files.
-
-    * src/sndfile.[ch]
-    Added stuff for sf_get_lib_version() function.
-
-
-1999-07-31  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h MacOS/config.h
-    Fixed minor MacOS configuration issues.
-
-1999-07-30  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * MacOS/
-    Added a new directory for the MacOS config.h file and the
-    readme file.
-
-    * src/aiff.c
-    Fixed calculation of datalength when reading SSND chunk. Thanks to
-    Sigbjørn Skjæret for pointing out this error.
-
-1999-07-29  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/sndfile.h src/raw.c
-    Further fixing of #includes for MacOS.
-
-1999-07-25  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/aiff.c
-    Added call to ferror () in main header parsing loop of __XXX_open_read
-    functions. This should fix problems on platforms (MacOS, AmigaOS) where
-    fseek()ing or fread()ing beyond the end of the file puts the FILE*
-    stream in an error state until clearerr() is called.
-
-    * tests/write_read_test.c
-    Added tests for RAW header-less PCM files.
-
-    * src/common.h
-    Moved definition of struct tribyte to pcm.c which is the only place
-    which needs it.
-
-    * src/pcm.c
-    Modified all code which assumed sizeof (struct tribyte) == 3. This code
-    did not work on MacOS. Thanks to Ben "Jacobs" for pointing this out.
-
-    * src/au.c
-    Removed <sys/stat.h> from list of #includes (not being used).
-
-    * src/sndfile.c
-    Added MacOS specific #ifdef to replace <sys/stat.h>.
-
-    * src/sndfile.h
-    Added MacOS specific #ifdef to replace <sys/stat.h>.
-
-    * src/sndfile.h
-    Added MacOS specific typedef for off_t.
-
-    * MacOS-readme.txt
-    New file with instructions for building libsndfile under MacOS. Thanks
-    to Ben "Jacobs" for supplying these instructions.
-
-1999-07-24  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Removed sndfile.h from generated file list as there were no longer
-    any autoconf substitutions being made.
-
-    * src/raw.c
-    New file for handling raw header-less PCM files. In order to open these
-    for read, the user must specify format, pcmbitwidth and channels in the
-    SF_INFO struct when calling sf_open_read ().
-
-    * src/sndfile.c
-    Added support for raw header-less PCM files.
-
-1999-07-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * examples/sfinfo.c
-    Removed options so the sfinfo program always prints out all the information.
-
-1999-07-19  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/alaw.c
-    New file for A-law encoding (similar to u-law).
-
-    * tests/alaw_test.c
-    New test program to test the A-law encode/decode lookup tables.
-
-    * tests/lossy_comp_test.c
-    Added tests for a-law encoded WAV, AU and AULE files.
-
-1999-07-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c src/au.c
-    Removed second "#include <unistd.h>". Thanks to Ben "Jacobs" for pointing
-    this out.
-
-1999-07-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/ulaw_test.c
-    New test program to test the u-law encode/decode lookup tables.
-
-1999-07-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.h
-    Made corrections to comments on the return values from sf_seek ().
-
-    * src/sndfile.c
-    Fixed boundary condition checking bug and accounting bug in sf_read_raw ().
-
-1999-07-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/au.c src/ulaw.c
-    Finished implementation of u-law encoded AU files.
-
-    * src/wav.c
-    Implemented reading and writing of u-law encoded WAV files.
-
-    * tests/
-    Changed name of adpcm_test.c to lossy_comp_test.c. This test program
-    will now be used to test Ulaw and Alaw encoding as well as APDCM.
-    Added tests for Ulaw encoded WAV files.
-
-1999-07-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/adpcm_test.c
-    Initialised amp variable in gen_signal() to remove compiler warning.
-
-1999-07-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    In __aiff_open_read () prevented fseek()ing beyond end of file which
-    was causing trouble on MacOS with the MetroWerks compiler. Thanks to
-    Ben "Jacobs" for pointing this out.
-
-    *src/wav.c
-    Fixed as above in __wav_open_read ().
-
-1999-07-01    Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_ms_adpcm.c
-    Implemented MS ADPCM encoding. Code cleanup of decoder.
-
-    * tests/adpcm_test.c
-    Added tests for MS ADPCM WAV files.
-
-    * src/wav_ima_adpcm.c
-    Fixed incorrect parameter in call to srate2blocksize () from
-    __ima_writer_init ().
-
-1999-06-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/read_seek_test.c
-    Added test for 8 bit AIFF files.
-
-1999-06-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.c
-    Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c
-
-    * configure.in
-    Added -Wconversion to CFLAGS.
-
-    * src/*.c tests/*.c examples/*.c
-    Fixed all warnings resulting from use of -Wconversion.
-
-1999-06-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM
-    WAV files.
-
-    * src/wav_ima.c
-    Changed block alignment to be dependant on sample rate. This should make
-    WAV files created with libsndfile compatible with the MS Windows media
-    players.
-
-    * tests/adpcm_test.c
-    Reimplemented adpcm_test_short and implemented adpcm_test_int and
-    adpcm_test_double.
-    Now have full testing of IMA ADPCM WAV file read, write and seek.
-
-1999-06-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_float.c
-    Fixed function prototype for x86f2d_array () which was causing ocassional
-    seg. faults on Sparc Solaris machines.
-
-1999-06-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c
-    Fixed bug in __aiff_close where the length fields in the header were
-    not being correctly calculated before writing.
-
-    * tests/write_read_test.c
-    Modified to detect the above bug in WAV, AIFF and AU files.
-
-1999-06-12    Erik de Castro Lopo     <erikd AT mega-nerd DOT com>
-
-    * Win32/*
-    Added a contribution from Albert Faber to allow libsndfile to compile
-    under Win32 systems. libsndfile will now be used as part of LAME the
-    the MPEG 1 Layer 3 encoder (http://internet.roadrunner.com/~mt/mp3/).
-
-1999-06-11    Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in
-    Changed to reflect previous changes.
-
-    * src/wav_ima_adpcm.c
-    Fixed incorrect calculation of bytespersec header field (IMA ADPCM only).
-
-    Fixed bug when writing from int or double data to IMA ADPCM file. Will need
-    to write test code for this.
-
-    Fixed bug in __ima_write () whereby the length of the current block was
-    calculated incorrectly. Thanks to Jongcheon Park for pointing this out.
-
-1999-03-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/*.c
-    Changed all read/write/lseek function calls to fread/fwrite/
-    fseek/ftell and added error checking of return values from
-    fread and fwrite in critical areas of the code.
-
-    * src/au.c
-    Fixed incorrect datasize element in AU header on write.
-
-    * tests/error_test.c
-    Add new test to check all error values have an associated error
-    string. This will avoid embarrassing real world core dumps.
-
-1999-03-23  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c src/aiff.c
-    Added handling for unknown chunk markers in the file.
-
-1999-03-22  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Filled in missing error strings in SndfileErrors array. Missing entries
-    can cause core dumps when calling sf_error-str (). Thanks to Sam
-    <mrsam at-sign geocities.com> for finding this problem.
-
-1999-03-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav_ima_adpcm.c
-    Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading
-    stereo files. Caused by not adjusting offset into buffer of decoded
-    samples for 2 channels. A similar bug existed in __ima_write ().
-    Need a test for stereo ADPCM files.
-
-    * src/wav_ms_adpcm.c
-    Decoder working correctly.
-
-1999-03-18  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * configure.in Makefile.am
-    Added --enable-justsrc configuration variable sent by Sam
-    <mrsam at-sign geocities.com>.
-
-    * src/wav_ima_adpcm.c
-    Fixed bug when reading beyond end of data section due to not
-    checking pima->blockcount.
-    This uncovered __ima_seek () bug due to pima->blockcount being set
-    before calling __ima_init_block ().
-
-1999-03-17  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Started implementing MS ADPCM decoder.
-    If file is WAVE_FORMAT_ADPCM and length of data chunk is odd, this
-    encoder seems to add an extra byte. Why not just give an even data
-    length?
-
-1999-03-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c.
-    This will make it easier to add and debug other kinds of WAV files
-    in future.
-
-1999-03-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/
-    Added adpcm_test.c which implements test functions for
-    IMA ADPCM reading/writing/seeking etc.
-
-    * src/wav.c
-    Fixed many bugs in IMA ADPCM encoder and decoder.
-
-1999-03-11  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Finished implementing IMA ADPCM encoder and decoder (what a bitch!).
-
-1999-03-03  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/wav.c
-    Started implementing IMA ADPCM decoder.
-
-1999-03-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/sndfile.c
-    Fixed bug where the sf_read_XXX functions were returning a
-    incorrect read count when reading past end of file.
-    Fixed bug in sf_seek () when seeking backwards from end of file.
-
-    * tests/read_seek_test.c
-    Added multiple read test to short_test(), int_test () and
-    double_test ().
-    Added extra chunk to all test WAV files to test that reading
-    stops at end of 'data' chunk.
-
-1999-02-21  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.c
-    Added tests for little DEC endian AU files.
-
-    * src/au.c
-    Add handling for DEC format little endian AU files.
-
-1999-02-20  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c src/au.c src/wav.c
-    Add __psf_sprintf calls during header parsing.
-
-    * src/sndfile.c src/common.c
-    Implement sf_header_info (sndfile.c) function and __psf_sprintf (common.c).
-
-    * tests/write_read_test.c
-    Added tests for 8 bit PCM files (WAV, AIFF and AU).
-
-    * src/au.c src/aiff.c
-    Add handling of 8 bit PCM data format.
-
-    * src/aiff.c
-    On write, set blocksize in SSND chunk to zero like everybody else.
-
-1999-02-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c:
-    Fixed bug in let2s_array (cptr was not being initialised).
-
-    * src/sndfile.c:
-    Fixed bug in sf_read_raw and sf_write_raw. sf_seek should
-    now work when using these functions.
-
-1999-02-15  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * tests/write_read_test.c:
-    Force test_buffer array to be double aligned. Sparc Solaris
-    requires this.
-
-1999-02-14  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/pcm.c:
-    Fixed a bug which was causing errors in the reading
-    and writing of 24 bit PCM files.
-
-    * doc/api.html
-    Finished of preliminary documentaion.
-
-1999-02-13  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
-
-    * src/aiff.c:
-    Changed reading of 'COMM' chunk to avoid reading an int
-    which overlaps an int (4 byte) boundary.
-
index ce0164a..45ec409 100644 (file)
@@ -26,7 +26,8 @@
 <A HREF="#Q006">Q6 : What's the best format for storing temporary files?</A><BR/>
 <A HREF="#Q007">Q7 : On Linux/Unix/MacOS X, what's the best way of detecting the
        presence of libsndfile?</A><BR/>
-<A HREF="#Q008">Q8 : But I just want a simple Makefile! What do I do?</A><BR/>
+<A HREF="#Q008">Q8 : I have libsndfile installed and now I want to use it. I
+       just want a simple Makefile! What do I do?</A><BR/>
 <A HREF="#Q009">Q9 : How about adding the ability to write/read sound files to/from
        memory buffers?</A><BR/>
 <A HREF="#Q010">Q10 : Reading a 16 bit PCM file as normalised floats and then
@@ -95,7 +96,7 @@ If you can't find either then the answer is no.
 </UL>
 <P>
 As documented
-    <A HREF="http://www.mega-nerd.com/libsndfile/api.html#note1">here</A>
+    <A HREF="api.html#note1">here</A>
 there is now a well defined behaviour which ensures that no matter what the
 bit width of the source file, the scaling always does something sensible.
 This makes it safe to read 8, 16, 24 and 32 bit PCM files using sf_read_short()
@@ -246,7 +247,8 @@ libsndfile configure process. For instance on my system I get this:
 <!-- ========================================================================= -->
 
 <A NAME="Q008"></A>
-<H2><BR/><B>Q8 : But I just want a simple Makefile! What do I do?</B></H2>
+<H2><BR/><B>Q8 : I have libsndfile installed and now I want to use it. I just want
+               a simple Makefile! What do I do?</B></H2>
 
 <P>
 The <B>pkg-config</B> program makes finding the correct compiler flag values and
@@ -339,7 +341,7 @@ other than normalized floats in the application.
 Alternatives to normalized floats are the <b>short</b> and <b>int</b> data
 types (ie using sf_read_short or sf_read_int) or using un-normalized floats
 (see
-       <a href="http://www.mega-nerd.com/libsndfile/command.html#SFC_SET_NORM_FLOAT">
+       <a href="command.html#SFC_SET_NORM_FLOAT">
        SFC_SET_NORM_FLOAT</a>).
 </P>
 <P>
@@ -389,11 +391,12 @@ is the risk of breaking something that currently works.
 </B></H2>
 
 <P>
-An <tt>item</tt>tt> is a single sample of the data type you are reading; ie a
+An <tt>item</tt> is a single sample of the data type you are reading; ie a
 single <tt>short</tt> value for <tt>sf_read_short</tt> or a single <tt>float</tt>
 for <tt>sf_read_float</tt>.
 </P>
 
+<P>
 For a sound file with only one channel, a frame is the same as a item (ie a
 single sample) while for multi channel sound files, a single frame contains a
 single item for each channel.
@@ -412,7 +415,7 @@ on a stereo file, first using items:
 </PRE>
 
 <P>
-and now readng the exact same amount of data using frames:
+and now reading the exact same amount of data using frames:
 </P>
 
 <PRE>
@@ -640,7 +643,7 @@ CPU and run them on the other, the test suite will fail.
 </P>
 
 <P>
-Part of the problem is the the CPU endian-ness is detected at configure time.
+Part of the problem is that the CPU endian-ness is detected at configure time.
 Yes, I know the Apple compiler defines one of the macros __LITTLE_ENDIAN__
 and __BIG_ENDIAN__, but those macros are not part of the 1999 ISO C Standard
 and they are not portable.
@@ -751,8 +754,7 @@ Some of those authors may be students and hence wouldn't be worth pursuing.
 However, libsndfile is released under the name of a company, Mega Nerd Pty Ltd;
 a company which has income from from libsamplerate licensing, libsndfile based
 consulting income and other unrelated consulting income.
-Adding MP3 support to libsndfile could place that income would be under legal
-threat.
+Adding MP3 support to libsndfile could place that income under legal threat.
 </p>
 
 <p>
@@ -842,7 +844,7 @@ the top level of the extracted tarball.
                <A HREF="http://www.mega-nerd.com/libsndfile/">
                        http://www.mega-nerd.com/libsndfile/</A>.
 <BR/>
-Version : 1.0.25
+Version : 1.0.26
 </P>
 
 </BODY>
index 40a04d9..b89f145 100644 (file)
@@ -1,8 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
-htmldir = $(htmldocdir)
 html_DATA = index.html libsndfile.jpg libsndfile.css api.html command.html \
-                       bugs.html sndfile_info.html new_file_type.HOWTO pkgconfig.html \
+                       bugs.html sndfile_info.html new_file_type.HOWTO \
                        win32.html FAQ.html lists.html embedded_files.html octave.html \
                        dither.html tutorial.html
 
index 1169ab1..0705745 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,34 +90,44 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = doc
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(srcdir)/libsndfile.css.in AUTHORS ChangeLog NEWS
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES = libsndfile.css
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -85,11 +149,18 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(htmldir)"
 DATA = $(html_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libsndfile.css.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -127,13 +198,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -197,7 +269,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -235,8 +309,7 @@ host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
-htmldir = $(htmldocdir)
-htmldocdir = @htmldocdir@
+htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -248,9 +321,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -264,7 +339,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 html_DATA = index.html libsndfile.jpg libsndfile.css api.html command.html \
-                       bugs.html sndfile_info.html new_file_type.HOWTO pkgconfig.html \
+                       bugs.html sndfile_info.html new_file_type.HOWTO \
                        win32.html FAQ.html lists.html embedded_files.html octave.html \
                        dither.html tutorial.html
 
@@ -284,7 +359,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu doc/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -312,8 +386,11 @@ clean-libtool:
        -rm -rf .libs _libs
 install-htmlDATA: $(html_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
        @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -327,14 +404,12 @@ uninstall-htmlDATA:
        @$(NORMAL_UNINSTALL)
        @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(htmldir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(htmldir)" && rm -f $$files
-tags: TAGS
-TAGS:
+       dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -384,10 +459,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -468,16 +548,18 @@ uninstall-am: uninstall-htmlDATA
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       distclean distclean-generic distclean-libtool distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-htmlDATA install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       uninstall uninstall-am uninstall-htmlDATA
+       cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-htmlDATA install-info install-info-am \
+       install-man install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags-am uninstall uninstall-am uninstall-htmlDATA
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/doc/NEWS b/doc/NEWS
deleted file mode 100644 (file)
index 9626d45..0000000
--- a/doc/NEWS
+++ /dev/null
@@ -1,175 +0,0 @@
-Version 1.0.25 (2011-07-13)
-  * Fix for Secunia Advisory SA45125, heap overflow in PAF file handler.
-  * Accept broken WAV files with blockalign == 0.
-  * Minor bug fixes and improvements.
-
-Version 1.0.24 (2011-03-23)
-  * WAV files now have an 18 byte u-law and A-law fmt chunk.
-  * Document virtual I/O functionality.
-  * Two new methods rawHandle() and takeOwnership() in sndfile.hh.
-  * AIFF fix for non-zero offset value in SSND chunk.
-  * Minor bug fixes and improvements.
-
-Version 1.0.23 (2010-10-10)
-  * Add version metadata to Windows DLL.
-  * Add a missing 'inline' to sndfile.hh.
-  * Update docs.
-  * Minor bug fixes and improvements.
-
-Version 1.0.22 (2010-10-04)
-  * Couple of fixes for SDS file writer.
-  * Fixes arising from static analysis.
-  * Handle FLAC files with ID3 meta data at start of file.
-  * Handle FLAC files which report zero length.
-  * Other minor bug fixes and improvements.
-
-Version 1.0.21 (2009-12-13)
-  * Add a couple of new binary programs to programs/ dir.
-  * Remove sndfile-jackplay (now in sndfile-tools package).
-  * Add windows only function sf_wchar_open().
-  * Bunch of minor bug fixes.
-
-Version 1.0.20 (2009-05-14)
-  * Fix potential heap overflow in VOC file parser (Tobias Klein, http://www.trapkit.de/).
-
-Version 1.0.19 (2009-03-02)
-  * Fix for CVE-2009-0186 (Alin Rad Pop, Secunia Research).
-  * Huge number of minor bug fixes as a result of static analysis.
-
-Version 1.0.18 (2009-02-07)
-  * Add Ogg/Vorbis support (thanks to John ffitch).
-  * Remove captive FLAC library.
-  * Many new features and bug fixes.
-  * Generate Win32 and Win64 pre-compiled binaries.
-
-Version 1.0.17 (2006-08-31)
-  * Add sndfile.hh C++ wrapper.
-  * Update Win32 MinGW build instructions.
-  * Minor bug fixes and cleanups.
-
-Version 1.0.16 (2006-04-30)
-  * Add support for Broadcast (BEXT) chunks in WAV files.
-  * Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS.
-  * Add support for RIFX (big endian WAV variant).
-  * Fix configure script bugs.
-  * Fix bug in INST and MARK chunk writing for AIFF files.
-
-Version 1.0.15 (2006-03-16)
-  * Fix some ia64 issues.
-  * Fix precompiled DLL.
-  * Minor bug fixes.
-
-Version 1.0.14 (2006-02-19)
-  * Really fix MinGW compile problems.
-  * Minor bug fixes.
-
-Version 1.0.13 (2006-01-21)
-  * Fix for MinGW compiler problems.
-  * Allow readin/write of instrument chunks from WAV and AIFF files.
-  * Compile problem fix for Solaris compiler.
-  * Minor cleanups and bug fixes.
-
-Version 1.0.12 (2005-09-30)
-  * Add support for FLAC and Apple's Core Audio Format (CAF).
-  * Add virtual I/O interface (still needs docs).
-  * Cygwin and other Win32 fixes.
-  * Minor bug fixes and cleanups.
-
-Version 1.0.11 (2004-11-15)
-  * Add support for SD2 files.
-  * Add read support for loop info in WAV and AIFF files.
-  * Add more tests.
-  * Improve type safety.
-  * Minor optimisations and bug fixes.
-
-Version 1.0.10 (2004-06-15)
-  * Fix AIFF read/write mode bugs.
-  * Add support for compiling Win32 DLLS using MinGW.
-  * Fix problems resulting in failed compiles with gcc-2.95.
-  * Improve test suite.
-  * Minor bug fixes.
-
-Version 1.0.9 (2004-03-30)
-  * Add handling of AVR (Audio Visual Research) files.
-  * Improve handling of WAVEFORMATEXTENSIBLE WAV files.
-  * Fix for using pipes on Win32.
-
-Version 1.0.8 (2004-03-14)
-  * Correct peak chunk handing for files with > 16 tracks.
-  * Fix for WAV files with huge number of CUE chunks.
-
-Version 1.0.7 (2004-02-25)
-  * Fix clip mode detection on ia64, MIPS and other CPUs.
-  * Fix two MacOSX build problems.
-
-Version 1.0.6 (2004-02-08)
-  * Added support for native Win32 file access API (Ross Bencina).
-  * New mode to add clippling then a converting from float/double to integer
-    would otherwise wrap around.
-  * Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others.
-  * Many minor bug fixes.
-  * Other random fixes for Win32.
-
-Version 1.0.5 (2003-05-03)
-  * Added support for HTK files.
-  * Added new function sf_open_fd() to allow for secure opening of temporary
-    files as well as reading/writing sound files embedded within larger
-    container files.
-  * Added string support for AIFF files.
-  * Minor bug fixes and code cleanups.
-
-Version 1.0.4 (2003-02-02)
-  * Added suport of PVF and XI files.
-  * Added functionality for setting and retreiving strings from sound files.
-  * Minor code cleanups and bug fixes.
-
-Version 1.0.3 (2002-12-09)
-  * Minor bug fixes.
-
-Version 1.0.2 (2002-11-24)
-  * Added support for VOX ADPCM.
-  * Improved error reporting.
-  * Added version scripting on Linux and Solaris.
-  * Minor bug fixes.
-
-Version 1.0.1 (2002-09-14)
-  * Added MAT and MAT5 file formats.
-  * Minor bug fixes.
-
-Version 1.0.0 (2002-08-16)
-  * Final release for 1.0.0.
-
-Version 1.0.0rc6 (2002-08-14)
-  * Release candidate 6 for the 1.0.0 series.
-  * MacOS9 fixes.
-
-Version 1.0.0rc5 (2002-08-10)
-  * Release candidate 5 for the 1.0.0 series.
-  * Changed the definition of sf_count_t which was causing problems when
-    libsndfile was compiled with other libraries (ie WxWindows).
-  * Minor bug fixes.
-  * Documentation cleanup.
-
-Version 1.0.0rc4 (2002-08-03)
-  * Release candidate 4 for the 1.0.0 series.
-  * Minor bug fixes.
-  * Fix broken Win32 "make check".
-
-Version 1.0.0rc3 (2002-08-02)
-  * Release candidate 3 for the 1.0.0 series.
-  * Fix bug where libsndfile was reading beyond the end of the data chunk.
-  * Added on-the-fly header updates on write.
-  * Fix a couple of documentation issues.
-
-Version 1.0.0rc2 (2002-06-24)
-  * Release candidate 2 for the 1.0.0 series.
-  * Fix compile problem for Win32.
-
-Version 1.0.0rc1 (2002-06-24)
-  * Release candidate 1 for the 1.0.0 series.
-
-Version 0.0.28 (2002-04-27)
-  * Last offical release of 0.0.X series of the library.
-
-Version 0.0.8 (1999-02-16)
-  * First offical release.
diff --git a/doc/README b/doc/README
deleted file mode 100644 (file)
index 0676711..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-This is libsndfile, 1.0.25
-
-libsndfile is a library of C routines for reading and writing
-files containing sampled audio data.
-
-The src/ directory contains the source code for library itself.
-
-The doc/ directory contains the libsndfile documentation.
-
-The examples/ directory contains examples of how to write code using
-libsndfile.
-
-The tests/ directory contains programs which link against libsndfile
-and test its functionality.
-
-The src/GSM610 directory contains code written by Jutta Degener and Carsten
-Bormann. Their original code can be found at :
-    http://kbs.cs.tu-berlin.de/~jutta/toast.html
-
-The src/G72x directory contains code written and released by Sun Microsystems
-under a suitably free license.
-
-
-LINUX
------
-Whereever possible, you should use the packages supplied by your Linux
-distribution.
-
-If you really do need to compile from source it should be as easy as:
-
-               ./configure
-               make
-               make install
-
-Since libsndfile optionally links against libFLAC, libogg and libvorbis, you
-will need to install appropriate versions of these libraries before running
-configure as above.
-
-
-UNIX
-----
-Compile as for Linux.
-
-
-Win32/Win64
------------
-The default Windows compilers are nowhere near compliant with the 1999 ISO
-C Standard and hence not able to compile libsndfile.
-
-Please use the libsndfile binaries available on the libsndfile web site.
-
-
-MacOSX
-------
-Building on MacOSX should be the same as building it on any other Unix.
-
-
-CONTACTS
---------
-
-libsndfile was written by Erik de Castro Lopo (erikd AT mega-nerd DOT com).
-The libsndfile home page is at :
-
-       http://www.mega-nerd.com/libsndfile/
-
index 33d53dd..832a355 100644 (file)
@@ -34,7 +34,7 @@
        Every effort is made to keep these documents up-to-date, error free and
        unambiguous.
        However, since maintaining the documentation is the least fun part of working
-       on libsndfile, these docs can and do fall behind the behaviour of library.
+       on libsndfile, these docs can and do fall behind the behaviour of the library.
        If any errors, omissions or ambiguities are found, please notify me (erikd)
        at mega-nerd dot com.
 </P>
@@ -63,6 +63,7 @@ The functions of libsndfile are defined as follows:
       #include &lt;sndfile.h&gt;
 
       SNDFILE*    <A HREF="#open">sf_open</A>          (const char *path, int mode, SF_INFO *sfinfo) ;
+      SNDFILE*    <A HREF="#open">sf_wchar_open</A>    (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
       SNDFILE*    <A HREF="#open_fd">sf_open_fd</A>       (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
       SNDFILE*           <A HREF="#open_virtual">sf_open_virtual</A>  (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
       int         <A HREF="#check">sf_format_check</A>  (const SF_INFO *info) ;
@@ -122,6 +123,18 @@ SNDFILE* is an anonymous pointer to data which is private to the library.
 </PRE>
 
 <P>
+The sf_open() function opens the sound file at the specified path.
+The filename is byte encoded, but may be utf-8 on Linux, while on Mac OS X it
+will use the filesystem character set.
+On Windows, there is also a Windows specific sf_wchar_open() that takes a
+UTF16_BE encoded filename.
+</P>
+
+<PRE>
+      SNDFILE*  sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
+</PRE>
+
+<P>
 The SF_INFO structure is for passing data between the calling function and the library
 when opening a file for reading or writing. It is defined in sndfile.h as follows:
 </P>
@@ -714,9 +727,20 @@ It returns zero on success and non-zero on error.
 The error code can be converted to a string using sf_error_number().
 </P>
 
-
 <P>
+Strings passed to and retrieved from these two functions are assumed to be
+utf-8.
+However, while formats like Ogg/Vorbis and FLAC fully support utf-8, others
+like WAV and AIFF officially only support ASCII.
+Writing utf-8 strings to WAV and AIF files with libsndfile will work when read
+back with libsndfile, but may not work with other programs.
+</P>
 
+<P>
+The suggested method of dealing with tags retrived using sf_get_string() is to
+assume they are utf-8.
+Similarly if you have a string in some exotic format like utf-16, it should be
+encoded to utf-8 before being written using libsndfile.
 </P>
 
 <HR>
@@ -725,8 +749,9 @@ The error code can be converted to a string using sf_error_number().
 <H2><BR><B>Note 1</B></H2>
 <!-- pepper -->
 <P>
-When converting between integer PCM formats of differing size (ie using sf_read_int()
-to read a 16 bit PCM encoded WAV file) libsndfile obeys one simple rule:
+When converting between integer PCM formats of differing size
+(e.g. using sf_read_int() to read a 16 bit PCM encoded WAV file)
+libsndfile obeys one simple rule:
 </P>
 
 <P CLASS=indent_block>
@@ -770,7 +795,7 @@ and a parameter of SF_TRUE to force correct scaling.
                <A HREF="http://www.mega-nerd.com/libsndfile/">here</A>.
 </P>
 <P>
-Version : 1.0.25
+Version : 1.0.26
 </P>
 <!-- pepper -->
 <!-- pepper -->
index 937e189..3a441fe 100644 (file)
@@ -68,9 +68,8 @@
        problems.
 </P>
 <P>
-       Once you have the above information you should email it to one of the
-                <A HREF="lists.html">mailing lists</a>
-       (posting to these lists is limited to the list subscribers).
+       Once you have the above information you should submit a ticket on the libsnfile
+               <A HREF="https://github.com/erikd/libsndfile/issues">github issue tracker</A>.
 
 </P>
 </BODY>
index 3af84c8..9cdeb8c 100644 (file)
 
 <TR>
        <TD><A HREF="#SFC_SET_VBR_ENCODING_QUALITY">SFC_SET_VBR_ENCODING_QUALITY</A></TD>
-       <TD>Set the the Variable Bit Rate encoding quality</TD>
+       <TD>Set the Variable Bit Rate encoding quality</TD>
+</TR>
+
+<TR>
+       <TD><A HREF="#SFC_SET_COMPRESSION_LEVEL">SFC_SET_COMPRESSION_LEVEL</A></TD>
+       <TD>Set the compression level.</TD>
 </TR>
 
 <TR>
 </TR>
 
 <TR>
+       <TD><A HREF="#SFC_SET_CART_INFO">SFC_SET_CART_INFO</A></TD>
+       <TD>Set the Cart Chunk info</TD>
+</TR>
+
+<TR>
+       <TD><A HREF="#SFC_GET_CART_INFO">SFC_GET_CART_INFO</A></TD>
+       <TD>Retrieve the Cart Chunk info</TD>
+</TR>
+
+<TR>
        <TD><A HREF="#SFC_GET_LOOP_INFO">SFC_GET_LOOP_INFO</A></TD>
        <TD>Get loop info</TD>
 </TR>
 </TR>
 
 <TR>
-       <TD><A HREF="#SFC_SET_VBR_ENCODING_QUALITY">SFC_SET_VBR_ENCODING_QUALITY</A></TD>
-       <TD>Set variable bit rate encoding quality</TD>
+       <TD><A HREF="#SFC_RF64_AUTO_DOWNGRADE">SFC_RF64_AUTO_DOWNGRADE</A></TD>
+       <TD>Enable auto downgrade from RF64 to WAV</TD>
 </TR>
 
-
-
 <!--
 <TR>
        <TD><A HREF="#add-dither">add dither</A></TD>
@@ -253,7 +266,7 @@ Parameters:
         sndfile  : Not used
         cmd      : SFC_GET_LIB_VERSION
         data     : A pointer to a char buffer
-        datasize : The size of the the buffer
+        datasize : The size of the buffer
 </PRE>
 <P>
 Example:
@@ -288,7 +301,7 @@ Parameters:
         sndfile  : A valid SNDFILE* pointer
         cmd      : SFC_GET_LOG_INFO
         data     : A pointer to a char buffer
-        datasize : The size of the the buffer
+        datasize : The size of the buffer
 </PRE>
 <P>
 Example:
@@ -1302,9 +1315,11 @@ This command is currently only supported for files with SF_FORMAT_WAVEX format.
 <A NAME="SFC_SET_VBR_ENCODING_QUALITY"></A>
 <H2><BR><B>SFC_SET_VBR_ENCODING_QUALITY</B></H2>
 <P>
-Set the the Variable Bit Rate encoding quality.
+Set the Variable Bit Rate encoding quality.
 The encoding quality value should be between 0.0 (lowest quality) and 1.0
 (highest quality).
+Currenly this command is only implemented for FLAC and Ogg/Vorbis files.
+It has no effect on un-compressed file formats.
 </P>
 <P>
 Parameters:
@@ -1320,8 +1335,38 @@ The command must be sent before any audio data is written to the file.
 <P>
 </P>
 <DL>
-<DT>Return value: </DT>
-       <DD>Zero on success, non-zero otherwise.
+<DT>Return value:</DT>
+       <dd>SF_TRUE if VBR encoding quality was set.
+    SF_FALSE otherwise.
+</DL>
+
+<!-- ========================================================================= -->
+<A NAME="SFC_SET_COMPRESSION_LEVEL"></A>
+<H2><BR><B>SFC_SET_COMPRESSION_LEVEL</B></H2>
+<P>
+Set the compression level.
+The compression level should be between 0.0 (minimum compression level) and 1.0
+(highest compression level).
+Currenly this command is only implemented for FLAC and Ogg/Vorbis files.
+It has no effect on un-compressed file formats.
+</P>
+<P>
+Parameters:
+<PRE>
+        sndfile  : A valid SNDFILE* pointer
+        cmd      : SFC_SET_COMPRESSION_LEVEL
+        data     : A pointer to a double value
+        datasize : sizeof (double)
+</PRE>
+<P>
+The command must be sent before any audio data is written to the file.
+</P>
+<P>
+</P>
+<DL>
+<DT>Return value:</DT>
+       <dd>SF_TRUE if compression level was set.
+    SF_FALSE otherwise.
 </DL>
 
 <!-- ========================================================================= -->
@@ -1414,6 +1459,79 @@ Parameters:
 <DT>Return value: </DT>
        <DD>SF_TRUE if setting the Broadcast Extension chunk was successful and SF_FALSE
        otherwise.
+
+</DL>
+
+<!-- ========================================================================= -->
+<A NAME="SFC_GET_CART_INFO"></A>
+<H2><BR><B>SFC_GET_CART_INFO</B></H2>
+<P>Retrieve the Cart Chunk from WAV (and related) files.  Based on AES46 standard for CartChunk (see <a href="http://www.cartchunk.org/">CartChunk.org</a> for more information.
+</P>
+<p>
+Parameters:
+</p>
+<PRE>
+        sndfile  : A valid SNDFILE* pointer
+        cmd      : SFC_GET_CART_INFO
+        data     : a pointer to an SF_CART_INFO struct
+        datasize : sizeof (SF_CART_INFO)
+</PRE>
+<P>
+The SF_CART_INFO struct is defined in &lt;sndfile.h&gt; as:
+</P>
+<PRE>
+#define SF_CART_INFO_VAR(p_tag_text_size) \
+                        struct
+                        {       char            version [4] ;
+                                char            title [64] ;
+                                char            artist [64] ;
+                                char            cut_id [64] ;
+                                char            client_id [64] ;
+                                char            category [64] ;
+                                char            classification [64] ;
+                                char            out_cue [64] ;
+                                char            start_date [10] ;
+                                char            start_time [8] ;
+                                char            end_date [10] ;
+                                char            end_time [8] ;
+                                char            producer_app_id [64] ;
+                                char            producer_app_version [64] ;
+                                char            user_def [64] ;
+                                long    level_reference ;
+                                SF_CART_TIMER   post_timers [8] ;
+                                char            reserved [276] ;
+                                char            url [1024] ;
+                                unsigned int    tag_text_size ;
+                                char            tag_text[p_tag_text_size] ;
+                        }
+</PRE>
+
+<DL>
+<DT>Return value: </DT>
+       <DD>SF_TRUE if the file contained a Cart chunk or SF_FALSE
+       otherwise.
+</DL>
+
+<!-- ========================================================================= -->
+<A NAME="SFC_SET_CART_INFO"></A>
+<H2><BR><B>SFC_SET_CART_INFO</B></H2>
+<P>
+Set the Cart Chunk for WAV (and related) files.
+</P>
+<p>
+Parameters:
+</p>
+<PRE>
+        sndfile  : A valid SNDFILE* pointer
+        cmd      : SFC_SET_CART_INFO
+        data     : a pointer to an SF_CART_INFO struct
+        datasize : sizeof (SF_CART_INFO)
+</PRE>
+
+<DL>
+<DT>Return value: </DT>
+       <DD>SF_TRUE if setting the Cart chunk was successful and SF_FALSE
+       otherwise.
 </DL>
 <!-- ========================================================================= -->
 
@@ -1558,37 +1676,53 @@ Example:
     file. SF_FALSE otherwise.
 </DL>
 
+
 <!-- ========================================================================= -->
 
 
-<A NAME="SFC_SET_VBR_ENCODING_QUALITY"></A>
-<H2><BR><B>SFC_SET_VBR_ENCODING_QUALITY</B></H2>
+<A NAME="SFC_RF64_AUTO_DOWNGRADE"></A>
+<H2><BR><B>SFC_RF64_AUTO_DOWNGRADE</B></H2>
 <P>
-Set the Variable Bite Rate encoding quality.
-Currenly only implemented fro Ogg/Vorbis files.
+Enable auto downgrade from RF64 to WAV.
+</P>
+<P>
+The EBU recomendation is that when writing RF64 files and the resulting file is
+less than 4Gig in size, it should be downgraded to a WAV file (WAV files have a
+maximum size of 4Gig).
+libsndfile doesn't follow the EBU recommendations exactly, , mainly because the
+test suite needs to be able test reading/writing RF64 files without having to
+generate files larger than 4 gigabytes.
 </P>
 <p>
+Note: This command should be issued before the first bit of audio data has been
+written to the file.
+Calling this command after audio data has been written will return the current
+value of this setting, but will not allow it to be changed.
+</p>
+<p>
 Parameters:
 </p>
 <PRE>
          sndfile  : A valid SNDFILE* pointer
-         cmd      : SFC_SET_VBR_ENCODING_QUALITY
-         data     : a pointer to double specifing VBR quality
-         datasize : sizeof (double)
+         cmd      : SFC_RF64_AUTO_DOWNGRADE
+         data     : NULL
+         datasize : SF_TRUE or SF_FALSE
 </PRE>
 <P>
 Example:
 </P>
 <PRE>
-         double quality = 0.5 ;
-         sf_command (sndfile, SFC_SET_VBR_ENCODING_QUALITY, &amp;quality, sizeof (double)) ;
+         /* Enable auto downgrade on file close. */
+         sf_command (sndfile, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) ;
 </PRE>
 <DL>
 <DT>Return value:</DT>
-       <dd>SF_TRUE if VBR encoding quality was set.
-    SF_FALSE otherwise.
+       <dd>Returns SF_TRUE if SFC_RF64_AUTO_DOWNGRADE is set and SF_FALSE
+       otherwise.
 </DL>
 
+
+
 <!-- ========================================================================= -->
 
 
index 01a416f..a3bea79 100644 (file)
         int    sf_command (SNDFILE *sndfile, int cmd, void *data, int datasize) ;
 </PRE>
 <P>
-       This function allows the caller to retrieve information from or change aspects of the 
-       library behaviour. 
-       Examples include retrieving a string containing the library version or changing the 
+       This function allows the caller to retrieve information from or change aspects of the
+       library behaviour.
+       Examples include retrieving a string containing the library version or changing the
        scaling applied to floating point sample data during read and write.
        Most of these operations are performed on a per-file basis.
 </P>
 <P>
        The cmd parameter is a integer identifier which is defined in &lt;sndfile.h&gt;.
        All of the valid command identifiers have names begining with "SFC_".
-       Data is passed to and returned from the library by use of a void pointer. 
-       The library will not read or write more than datasize bytes from the void pointer. 
-       For some calls no data is required in which case data should be NULL and datasize 
+       Data is passed to and returned from the library by use of a void pointer.
+       The library will not read or write more than datasize bytes from the void pointer.
+       For some calls no data is required in which case data should be NULL and datasize
        may be used for some other purpose.
 </P>
 <P>
@@ -70,7 +70,7 @@
        <TD><A HREF="#SFC_SET_NORM_FLOAT">SFC_SET_NORM_FLOAT</A></TD>
        <TD>Modify the normalisation behaviour of the floating point reading and writing functions.</TD>
 </TR>
-<TR>   
+<TR>
        <TD><A HREF="#SFC_SET_NORM_DOUBLE">SFC_SET_NORM_DOUBLE</A></TD>
        <TD>Modify the normalisation behaviour of the double precision floating point reading and writing functions.</TD>
 </TR>
@@ -78,7 +78,7 @@
        <TD><A HREF="#SFC_GET_NORM_FLOAT">SFC_GET_NORM_FLOAT</A></TD>
        <TD>Retrieve the current normalisation behaviour of the floating point reading and writing functions.</TD>
 </TR>
-<TR>   
+<TR>
        <TD><A HREF="#SFC_GET_NORM_DOUBLE">SFC_GET_NORM_DOUBLE</A></TD>
        <TD>Retrieve the current normalisation behaviour of the double precision floating point reading and writing functions.</TD>
 </TR>
        <TD>Add dither to output on write.</TD>
 </TR>
 -->
-</TABLE>       
+</TABLE>
 </CENTER>
 
 <BR><BR>
@@ -166,7 +166,7 @@ Parameters:
         sndfile  : Not used
         cmd      : SFC_GET_LIB_VERSION
         data     : A pointer to a char buffer
-        datasize : The size of the the buffer
+        datasize : The size of the buffer
 </PRE>
 <P>
 Example:
@@ -201,7 +201,7 @@ Parameters:
         sndfile  : A valid SNDFILE* pointer
         cmd      : SFC_GET_LOG_INFO
         data     : A pointer to a char buffer
-        datasize : The size of the the buffer
+        datasize : The size of the buffer
 </PRE>
 <P>
 Example:
@@ -254,7 +254,7 @@ Example:
 <A NAME="SFC_CALC_NORM_SIGNAL_MAX"></A>
 <H2><BR><B>SFC_CALC_NORM_SIGNAL_MAX</B></H2>
 <P>
-Retrieve the measured normailised maximum signal value. This involves reading 
+Retrieve the measured normailised maximum signal value. This involves reading
 through the whole file which can be slow on large files.
 </P>
 <P>
@@ -347,7 +347,7 @@ of the file. If a file contains such a string, this functions will return it to
 </P>
 <P>
 It should be noted that the way the string is added to the file is file format dependant
-but that any string added with <A HREF="#write-text">write text</A> will be returned by 
+but that any string added with <A HREF="#write-text">write text</A> will be returned by
 <A HREF="#read-text">read text</A>.
 </P>
 <P>
@@ -358,7 +358,7 @@ Parameters:
         sndfile  : A valid SNDFILE* pointer
         cmd      : The text string "read text".
         data     : A pointer to a char buffer.
-        datasize : The size of the the buffer.
+        datasize : The size of the buffer.
 </PRE>
 <P>
 Example:
@@ -369,9 +369,9 @@ Example:
 </PRE>
 <DL>
 <DT>Return value:</DT>
-<DD>If a text string is found, this call will return the length of the retrieved text 
+<DD>If a text string is found, this call will return the length of the retrieved text
        string.
-       <DD>If no text string is found, zero will be returned and the first element in the 
+       <DD>If no text string is found, zero will be returned and the first element in the
        buffer will be set to the null character.
 <DT>Notes:</DT>
 <DD>The string returned in the buffer passed to this function will not overflow
@@ -382,7 +382,7 @@ Example:
 <H2><BR><B>Write text</B></H2>
 <P>
 Add a text string to a file. The text string added can be retrieved when the file is
-read using <A HREF="#read-text">read text</A>. 
+read using <A HREF="#read-text">read text</A>.
 </P>
 <P>
 Parameters:
@@ -402,10 +402,10 @@ Example:
 </PRE>
 <DL>
 <DT>Return value: </DT>
-       <DD>If the current file format allows the addition of text strings, the string will 
-               be added and the length of the string will be returned. 
+       <DD>If the current file format allows the addition of text strings, the string will
+               be added and the length of the string will be returned.
        <DD>If the file format does not allow the addition of text strings zero will be returned.
-       <DD>If this function is called after the file is openned but before 
+       <DD>If this function is called after the file is openned but before
 </DL>
 -->
 
@@ -433,7 +433,7 @@ Parameters:
         datasize : SF_TRUE or SF_FALSE
 </PRE>
 <P>
-For read operations setting normalisation to SF_TRUE means that the data from all 
+For read operations setting normalisation to SF_TRUE means that the data from all
 subsequent reads will be be normalised to the range [-1.0, 1.0].
 </P>
 <P>
@@ -461,7 +461,7 @@ Example:
 <A NAME="SFC_SET_NORM_DOUBLE"></A>
 <H2><BR><B>SFC_SET_NORM_DOUBLE</B></H2>
 <P>
-This command only affects data read from or written to using the double precision 
+This command only affects data read from or written to using the double precision
 floating point functions:
 </P>
 <PRE>
@@ -481,7 +481,7 @@ Parameters:
         datasize : SF_TRUE or SF_FALSE
 </PRE>
 <P>
-For read operations setting normalisation to SF_TRUE means that the data 
+For read operations setting normalisation to SF_TRUE means that the data
 from all subsequent reads will be be normalised to the range [-1.0, 1.0].
 </P>
 <P>
@@ -610,7 +610,7 @@ The SF_FORMAT_INFO struct is defined in &lt;sndfile.h&gt; as:
         } SF_FORMAT_INFO ;
 </PRE>
 <P>
-When sf_command() is called with SF_GET_SIMPLE_FORMAT, the value of the format 
+When sf_command() is called with SF_GET_SIMPLE_FORMAT, the value of the format
 field should be the format number (ie 0 <= format <= count value obtained using
 SF_GET_SIMPLE_FORMAT_COUNT).
 </P>
@@ -632,8 +632,8 @@ Example:
 <DL>
 <DT>Return value: </DT>
        <DD>0 on success and non-zero otherwise.
-       <DD>The value of the format field of the SF_FORMAT_INFO struct will be an value which 
-               can be placed in the format field of an SF_INFO struct when a file is to be opened 
+       <DD>The value of the format field of the SF_FORMAT_INFO struct will be an value which
+               can be placed in the format field of an SF_INFO struct when a file is to be opened
                for write.
        <DD>The name field will contain a char* pointer to the name of the string ie "WAV (Microsoft 16 bit PCM)".
        <DD>The extention field will contain the most commonly used file extension for that file type.
@@ -665,11 +665,11 @@ The SF_FORMAT_INFO struct is defined in &lt;sndfile.h&gt; as:
         } SF_FORMAT_INFO ;
 </PRE>
 <P>
-When sf_command() is called with SF_GET_FORMAT_INFO, the format field is 
+When sf_command() is called with SF_GET_FORMAT_INFO, the format field is
 examined and if (format & SF_FORMAT_TYPEMASK) is a valid format then the struct
 is filled in with information about the given major type.
 If (format & SF_FORMAT_TYPEMASK) is FALSE and (format & SF_FORMAT_SUBMASK) is a
-valid subtype format then the struct is filled in with information about the given 
+valid subtype format then the struct is filled in with information about the given
 subtype.
 </P>
 <P>
@@ -829,7 +829,7 @@ directory of the libsndfile source code distribution.
        <DD>0 on success and non-zero otherwise.
        <DD>The value of the format field will one of the major format identifiers such as SF_FORMAT_WAV
                SF_FORMAT_AIFF.
-       <DD>The name field will contain a char* pointer to the name of the string; for instance 
+       <DD>The name field will contain a char* pointer to the name of the string; for instance
                "WAV (Microsoft)" or "AIFF (Apple/SGI)".
        <DD>The extention field will be a NULL pointer.
 </DL>
@@ -838,7 +838,7 @@ directory of the libsndfile source code distribution.
 <A NAME="SFC_SET_ADD_PEAK_CHUNK"></A>
 <H2><BR><B>SFC_SET_ADD_PEAK_CHUNK</B></H2>
 <P>
-By default, WAV and AIFF files which contain floating point data (subtype SF_FORMAT_FLOAT 
+By default, WAV and AIFF files which contain floating point data (subtype SF_FORMAT_FLOAT
 or SF_FORMAT_DOUBLE) have a PEAK chunk.
 By using this command, the addition of a PEAK chunk can be turned on or off.
 </P>
@@ -879,9 +879,9 @@ closed using <B>sf_close()</B>.
 <P>
 There are however situations where large files are being generated and it would
 be nice to have valid data in the header before the file is complete.
-Using this command will update the file header to reflect the amount of data written 
+Using this command will update the file header to reflect the amount of data written
 to the file so far.
-Other programs opening the file for read (before any more data is written) will 
+Other programs opening the file for read (before any more data is written) will
 then read a valid sound file header.
 </P>
 <P>
@@ -954,7 +954,7 @@ Truncate the file to the number of frames specified by the sf_count_t pointed
 to by data.
 After this command, both the read and the write pointer will be
 at the new end of the file.
-This command will fail (returning non-zero) if the requested truncate position 
+This command will fail (returning non-zero) if the requested truncate position
 is beyond the end of the file.
 </P>
 <P>
@@ -1006,11 +1006,11 @@ Example:
 
 <HR>
 <P>
-       The libsndfile home page is here : 
+       The libsndfile home page is here :
                <A HREF="http://www.mega-nerd.com/libsndfile/">
                        http://www.mega-nerd.com/libsndfile/</A>.
 <BR>
-Version : 1.0.25
+Version : 1.0.26
 </P>
 
 </BODY>
index bb128f5..f694db5 100644 (file)
@@ -6,7 +6,7 @@
        libsndfile
        </TITLE>
        <META NAME="Author"      CONTENT="Erik de Castro Lopo (erikd AT mega-nerd DOT com)">
-    <META NAME="Version"     CONTENT="libsndfile-1.0.25">
+    <META NAME="Version"     CONTENT="libsndfile-1.0.26">
        <META NAME="Description" CONTENT="The libsndfile Home Page">
        <META NAME="Keywords"    CONTENT="WAV AIFF AU SVX PAF NIST W64 libsndfile sound audio dsp Linux">
        <META NAME="ROBOTS"      CONTENT="NOFOLLOW">
@@ -68,7 +68,6 @@
        <LI>Every platform supported by Debian GNU/Linux including x86_64-linux-gnu,
                i486-linux-gnu, powerpc-linux-gnu, sparc-linux-gnu, alpha-linux-gnu,
                mips-linux-gnu and armel-linux-gnu.</LI>
-       <LI>arm-linux-androideab (Android phones OS)</LI>
        <LI>powerpc-apple-darwin7.0 (Mac OS X 10.3)</LI>
        <LI>sparc-sun-solaris2.8 (using gcc)</LI>
        <LI>mips-sgi-irix5.3 (using gcc)</LI>
@@ -293,7 +292,7 @@ and
        I have decided that I will not be adding support for MPEG Layer 3 (commonly
        known as MP3) due to the patent issues surrounding this file format.
        See
-               <a href="http://www.mega-nerd.com/libsndfile/FAQ.html#Q020">
+               <a href="FAQ.html#Q020">
                the FAQ</a>
        for more.
 </P>
@@ -369,6 +368,8 @@ and
        <LI>Version 1.0.24 (March 23 2011) Minor bug fixes.
        <LI>Version 1.0.25 (July 13 2011) Fix for Secunia Advisory SA45125. Minor bug fixes and
                                improvements.
+       <LI>Version 1.0.26 (November 22 2015) Fix for CVE-2014-9496, CVE-2014-9756 and CVE-2015-7805.
+                               Add ALAC/CAF support. Minor bug fixes and improvements.
        </UL>
 
 <A NAME="Similar"></A>
@@ -430,16 +431,16 @@ and
 </P>
        <UL>
        <LI>Source code as a .tar.gz :
-                       <A HREF="files/libsndfile-1.0.25.tar.gz">libsndfile-1.0.25.tar.gz</A>
+                       <A HREF="files/libsndfile-1.0.26.tar.gz">libsndfile-1.0.26.tar.gz</A>
                        and
-                       <A HREF="files/libsndfile-1.0.25.tar.gz.asc">(GPG signature)</A>.
+                       <A HREF="files/libsndfile-1.0.26.tar.gz.asc">(GPG signature)</A>.
        <LI>Win32 installer:
-                       <A HREF="files/libsndfile-1.0.25-w32-setup.exe">
-                       libsndfile-1.0.25-w32-setup.exe</A> (thoroughly tested under
+                       <A HREF="files/libsndfile-1.0.26-w32-setup.exe">
+                       libsndfile-1.0.26-w32-setup.exe</A> (thoroughly tested under
                        <a href="http://www.winehq.com/">Wine</a> and Windows XP).
        <LI>Win64 installer:
-                       <A HREF="files/libsndfile-1.0.25-w64-setup.exe">
-                       libsndfile-1.0.25-w64-setup.exe</A>
+                       <A HREF="files/libsndfile-1.0.26-w64-setup.exe">
+                       libsndfile-1.0.26-w64-setup.exe</A>
                        (thoroughly tested on 64 bit Windows 7).
        </UL>
 
index eab8d06..6c58e57 100644 (file)
@@ -83,6 +83,8 @@ h4 {
 pre {
        font-family : courier, monospace ;
        font-size : medium ;
+       margin-left : 6% ;
+       margin-right : 6% ;
 }
 a:link { color : #9090FF ; }
 a:visited { color : #5050FF ; }
index 9069080..40fca0f 100644 (file)
@@ -83,6 +83,8 @@ h4 {
 pre {
        font-family : courier, monospace ;
        font-size : medium ;
+       margin-left : 6% ;
+       margin-right : 6% ;
 }
 a:link { color : #9090FF ; }
 a:visited { color : #5050FF ; }
index 525b7ae..b696e6b 100644 (file)
 <BR>
 <H1><B>libsndfile and GNU Octave</B></H1>
 <P>
-       <A HREF="http://www.octave.org/">GNU Octave</A> is a high-level interactive 
-       language for numerical computations. 
+       <A HREF="http://www.octave.org/">GNU Octave</A> is a high-level interactive
+       language for numerical computations.
        There are currently two development streams, a stable 2.0.X series and a
        development 2.1.X series.
        Octave reads and writes data in binary formats that were originally developed
-       for 
+       for
                <A HREF="http://www.mathworks.com/">MATLAB</A>.
        Version 2.0.X of Octave uses binary data files compatible with MATLAB
        version 4.2 while Octave 2.1.X uses binary data files compatible
-       with MATLAB version 5.0 as well as being able to read the older MATLAB 4.2 
+       with MATLAB version 5.0 as well as being able to read the older MATLAB 4.2
        format.
 </P>
 <P>
-       From version 1.0.1 of libsndfile onwards, libsndfile has the ability of reading 
-       and writing a small subset of the binary data files used by both versions 
+       From version 1.0.1 of libsndfile onwards, libsndfile has the ability of reading
+       and writing a small subset of the binary data files used by both versions
        of GNU Octave.
        This gives people using GNU Octave for audio based work an easy method of
        moving audio data between GNU Octave and other programs which use libsndfile.
 <P>
        For instance it is now possible to do the following:
 </P>
-       
+
        <UL>
-       <LI> Load a WAV file into a sound file editor such as 
+       <LI> Load a WAV file into a sound file editor such as
                <A HREF="http://www.metadecks.org/software/sweep/">Sweep</A>.
        <LI> Save it as a MAT4 file.
        <LI> Load the data into Octave for manipulation.
-       <LI> Save the modified data. 
+       <LI> Save the modified data.
        <LI> Reload it in Sweep.
        </UL>
 <P>
        Another example would be using the MAT4 or MAT5 file formats as a format which
-       can be easily loaded into Octave for viewing/analyzing as well as a format 
+       can be easily loaded into Octave for viewing/analyzing as well as a format
        which can be played with command line players such as the one included with
        libsndfile.
 </P>
-       
+
 <H2><B>Details</B></H2>
 <P>
        Octave, like most programming languages, uses variables to store data, and
@@ -70,7 +70,7 @@
 <PRE>
         octave:1 > samplerate = 44100 ;
         octave:2 > wavedata = sin ((0:1023)*2*pi/1024) ;
-        octave:3 > save sine.mat samplerate wavedata 
+        octave:3 > save sine.mat samplerate wavedata
 </PRE>
 
 <P>
@@ -84,7 +84,7 @@
 <P>
        In addition, libsndfile contains a command line program which which is able
        to play the correct types of Octave files.
-       Using this command line player <B>sndfile-play</B> and a third Octave script 
+       Using this command line player <B>sndfile-play</B> and a third Octave script
        file allows Octave data to be played from within Octave on any of the platforms
        which <B>sndfile-play</B> supports (at the moment: Linux, MacOS X, Solaris and
        Win32).
 </P>
 
 <P>
-       There are some other Octave scripts for audio to be found 
-               <A HREF="http://octave.sourceforge.net/index/audio.html">here</A>.
+       There are some other Octave scripts for audio to be found
+               <A HREF="http://octave.sourceforge.net/audio/index.html">here</A>.
 </P>
 
 <BR>
 
 <HR>
 <P>
-       The libsndfile home page is here : 
+       The libsndfile home page is here :
                <A HREF="http://www.mega-nerd.com/libsndfile/">
                        http://www.mega-nerd.com/libsndfile/</A>.
 </P>
diff --git a/doc/pkgconfig.html b/doc/pkgconfig.html
deleted file mode 100644 (file)
index c89193d..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-
-<HEAD>
-       <TITLE>
-       libsndfile : pkg-config
-       </TITLE>
-       <META NAME="Author"      CONTENT="Erik de Castro Lopo (erikd AT mega-nerd DOT com)">
-       <LINK REL="stylesheet" HREF="libsndfile.css" TYPE="text/css" MEDIA="all">
-       <LINK REL="stylesheet" HREF="print.css" TYPE="text/css" MEDIA="print">
-</HEAD>
-
-<BODY>
-
-<BR>
-<H1>libsndfile and pkg-config</H1>
-
-<P>
-       From version 1.0.0 libsndfile has had the ability to read and write files of
-       greater than 2 Gig in size on most OSes even if sizeof (long) == 4. 
-       OSes which support this feature include Linux (2.4 kernel, glibc6) on x86, PPC and
-       probably others, Win32, MacOS X, *BSD, Solaris and probably others.
-       OSes on 64 bit processors where the default compile environment is LP64 (longs and 
-       pointers are 64 bit ie Linux on DEC/Compaq/HP Alpha processors) automatically 
-       support large file access.
-</P>
-<P>
-       Other OSes including Linux on 32 bit processors, 32 bit Solaris and others require 
-       special compiler flags to add large file support. 
-       This applies to both the compilation of the library itself and the compilation of 
-       programs which link to the library.
-</P>
-<P>
-       Note : People using Win32, MacOS (both OS X and pre-OS X) or *BSD can disregard the 
-       rest of this document as it does not apply to either of these OSes.     
-</P>
-<P>
-       The <B>pkg-config</B> program makes finding the correct compiler flag values and 
-       library location far easier.
-       During the installation of libsndfile, a file named <B>sndfile.pc</B> is installed
-       in the directory <B>${libdir}/pkgconfig</B> (ie if libsndfile is installed in 
-       <B>/usr/local/lib</B>, <B>sndfile.pc</B> will be installed in 
-       <B>/usr/local/lib/pkgconfig/</B>).
-</P>
-<P>
-       In order for pkg-config to find sndfile.pc it may be necessary to point the 
-       environment variable <B>PKG_CONFIG_PATH</B> in the right direction.
-</P>
-       <PRE>
-        export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
-       </PRE>
-       
-<P>
-       Then, to compile a C file into an object file, the command would be:
-</P>
-       <PRE>
-        gcc `pkg-config --cflags sndfile` -c somefile.c
-       </PRE>
-<P>
-       and to link a number of objects into an executable that links against libsndfile,
-       the command would be:
-</P>
-       <PRE>
-        gcc `pkg-config --libs sndfile` obj1.o obj2.o -o program
-       </PRE>
-       
-<P>
-       Obviously all this can be rolled into a Makefile for easier maintenance.
-</P>
-</BODY>
-</HTML>
diff --git a/echo-install-dirs.in b/echo-install-dirs.in
new file mode 100644 (file)
index 0000000..48d54b4
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+# @configure_input@
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+bindir=@bindir@
+pkgconfigdir=@pkgconfigdir@
+datadir=@datadir@
+datarootdir=@datarootdir@
+docdir=@docdir@
+htmldir=@htmldir@
+
+echo "
+  Installation directories :
+
+    Library directory : ................... $libdir
+    Program directory : ................... $bindir
+    Pkgconfig directory : ................. $pkgconfigdir
+    HTML docs directory : ................. $htmldir
+"
+echo "Compiling some other packages against libsndfile may require"
+echo "the addition of '$pkgconfigdir' to the"
+echo "PKG_CONFIG_PATH environment variable."
+echo
index 9797a72..2a90516 100644 (file)
@@ -1,12 +1,16 @@
 ## Process this file with automake to produce Makefile.in
 
-noinst_PROGRAMS = make_sine sfprocess list_formats generate sndfilehandle sndfile-to-text
+noinst_PROGRAMS = make_sine sfprocess list_formats generate sndfilehandle \
+       sndfile-to-text sndfile-loopify
 
-INCLUDES = -I$(top_srcdir)/src
+AM_CPPFLAGS = -I$(top_srcdir)/src
 
 sndfile_to_text_SOURCES = sndfile-to-text.c
 sndfile_to_text_LDADD = $(top_builddir)/src/libsndfile.la
 
+sndfile_loopify_SOURCES = sndfile-loopify.c
+sndfile_loopify_LDADD = $(top_builddir)/src/libsndfile.la
+
 make_sine_SOURCES = make_sine.c
 make_sine_LDADD = $(top_builddir)/src/libsndfile.la
 
@@ -22,3 +26,4 @@ generate_LDADD = $(top_builddir)/src/libsndfile.la
 sndfilehandle_SOURCES = sndfilehandle.cc
 sndfilehandle_LDADD = $(top_builddir)/src/libsndfile.la
 
+CLEANFILES = *~ *.exe
index 2f867c6..adaa641 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -37,23 +91,23 @@ host_triplet = @host@
 target_triplet = @target@
 noinst_PROGRAMS = make_sine$(EXEEXT) sfprocess$(EXEEXT) \
        list_formats$(EXEEXT) generate$(EXEEXT) sndfilehandle$(EXEEXT) \
-       sndfile-to-text$(EXEEXT)
+       sndfile-to-text$(EXEEXT) sndfile-loopify$(EXEEXT)
 subdir = examples
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
@@ -62,9 +116,10 @@ PROGRAMS = $(noinst_PROGRAMS)
 am_generate_OBJECTS = generate.$(OBJEXT)
 generate_OBJECTS = $(am_generate_OBJECTS)
 generate_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
+am__v_lt_1 = 
 am_list_formats_OBJECTS = list_formats.$(OBJEXT)
 list_formats_OBJECTS = $(am_list_formats_OBJECTS)
 list_formats_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
@@ -74,12 +129,27 @@ make_sine_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_sfprocess_OBJECTS = sfprocess.$(OBJEXT)
 sfprocess_OBJECTS = $(am_sfprocess_OBJECTS)
 sfprocess_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+am_sndfile_loopify_OBJECTS = sndfile-loopify.$(OBJEXT)
+sndfile_loopify_OBJECTS = $(am_sndfile_loopify_OBJECTS)
+sndfile_loopify_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_sndfile_to_text_OBJECTS = sndfile-to-text.$(OBJEXT)
 sndfile_to_text_OBJECTS = $(am_sndfile_to_text_OBJECTS)
 sndfile_to_text_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_sndfilehandle_OBJECTS = sndfilehandle.$(OBJEXT)
 sndfilehandle_OBJECTS = $(am_sndfilehandle_OBJECTS)
 sndfilehandle_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
 depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
 am__depfiles_maybe = depfiles
@@ -90,49 +160,71 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_$(V))
-am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
-am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
 CXXLD = $(CXX)
 CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
        $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_$(V))
-am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CXXLD_0 = @echo "  CXXLD " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
 SOURCES = $(generate_SOURCES) $(list_formats_SOURCES) \
        $(make_sine_SOURCES) $(sfprocess_SOURCES) \
-       $(sndfile_to_text_SOURCES) $(sndfilehandle_SOURCES)
+       $(sndfile_loopify_SOURCES) $(sndfile_to_text_SOURCES) \
+       $(sndfilehandle_SOURCES)
 DIST_SOURCES = $(generate_SOURCES) $(list_formats_SOURCES) \
        $(make_sine_SOURCES) $(sfprocess_SOURCES) \
-       $(sndfile_to_text_SOURCES) $(sndfilehandle_SOURCES)
+       $(sndfile_loopify_SOURCES) $(sndfile_to_text_SOURCES) \
+       $(sndfilehandle_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Cfg/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -170,13 +262,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -240,7 +333,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -279,7 +374,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -291,9 +385,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -306,9 +402,11 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = -I$(top_srcdir)/src
+AM_CPPFLAGS = -I$(top_srcdir)/src
 sndfile_to_text_SOURCES = sndfile-to-text.c
 sndfile_to_text_LDADD = $(top_builddir)/src/libsndfile.la
+sndfile_loopify_SOURCES = sndfile-loopify.c
+sndfile_loopify_LDADD = $(top_builddir)/src/libsndfile.la
 make_sine_SOURCES = make_sine.c
 make_sine_LDADD = $(top_builddir)/src/libsndfile.la
 sfprocess_SOURCES = sfprocess.c
@@ -319,6 +417,7 @@ generate_SOURCES = generate.c
 generate_LDADD = $(top_builddir)/src/libsndfile.la
 sndfilehandle_SOURCES = sndfilehandle.cc
 sndfilehandle_LDADD = $(top_builddir)/src/libsndfile.la
+CLEANFILES = *~ *.exe
 all: all-am
 
 .SUFFIXES:
@@ -335,7 +434,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -362,22 +460,32 @@ clean-noinstPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-generate$(EXEEXT): $(generate_OBJECTS) $(generate_DEPENDENCIES) 
+
+generate$(EXEEXT): $(generate_OBJECTS) $(generate_DEPENDENCIES) $(EXTRA_generate_DEPENDENCIES) 
        @rm -f generate$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(generate_OBJECTS) $(generate_LDADD) $(LIBS)
-list_formats$(EXEEXT): $(list_formats_OBJECTS) $(list_formats_DEPENDENCIES) 
+
+list_formats$(EXEEXT): $(list_formats_OBJECTS) $(list_formats_DEPENDENCIES) $(EXTRA_list_formats_DEPENDENCIES) 
        @rm -f list_formats$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(list_formats_OBJECTS) $(list_formats_LDADD) $(LIBS)
-make_sine$(EXEEXT): $(make_sine_OBJECTS) $(make_sine_DEPENDENCIES) 
+
+make_sine$(EXEEXT): $(make_sine_OBJECTS) $(make_sine_DEPENDENCIES) $(EXTRA_make_sine_DEPENDENCIES) 
        @rm -f make_sine$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(make_sine_OBJECTS) $(make_sine_LDADD) $(LIBS)
-sfprocess$(EXEEXT): $(sfprocess_OBJECTS) $(sfprocess_DEPENDENCIES) 
+
+sfprocess$(EXEEXT): $(sfprocess_OBJECTS) $(sfprocess_DEPENDENCIES) $(EXTRA_sfprocess_DEPENDENCIES) 
        @rm -f sfprocess$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sfprocess_OBJECTS) $(sfprocess_LDADD) $(LIBS)
-sndfile-to-text$(EXEEXT): $(sndfile_to_text_OBJECTS) $(sndfile_to_text_DEPENDENCIES) 
+
+sndfile-loopify$(EXEEXT): $(sndfile_loopify_OBJECTS) $(sndfile_loopify_DEPENDENCIES) $(EXTRA_sndfile_loopify_DEPENDENCIES) 
+       @rm -f sndfile-loopify$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(sndfile_loopify_OBJECTS) $(sndfile_loopify_LDADD) $(LIBS)
+
+sndfile-to-text$(EXEEXT): $(sndfile_to_text_OBJECTS) $(sndfile_to_text_DEPENDENCIES) $(EXTRA_sndfile_to_text_DEPENDENCIES) 
        @rm -f sndfile-to-text$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_to_text_OBJECTS) $(sndfile_to_text_LDADD) $(LIBS)
-sndfilehandle$(EXEEXT): $(sndfilehandle_OBJECTS) $(sndfilehandle_DEPENDENCIES) 
+
+sndfilehandle$(EXEEXT): $(sndfilehandle_OBJECTS) $(sndfilehandle_DEPENDENCIES) $(EXTRA_sndfilehandle_DEPENDENCIES) 
        @rm -f sndfilehandle$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(sndfilehandle_OBJECTS) $(sndfilehandle_LDADD) $(LIBS)
 
@@ -391,56 +499,51 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list_formats.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_sine.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sfprocess.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndfile-loopify.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndfile-to-text.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndfilehandle.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 .cc.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -448,26 +551,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -479,15 +571,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -496,6 +584,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -544,13 +647,19 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -632,18 +741,21 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-libtool clean-noinstPROGRAMS ctags distclean \
-       distclean-compile distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-       pdf pdf-am ps ps-am tags uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index 8a92332..884e8d7 100644 (file)
@@ -98,6 +98,8 @@ encode_file (const char *infilename, const char *outfilename, int filetype)
        k = 16 - strlen (outfilename) ;
        PUT_DOTS (k) ;
 
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+
        if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
        {       printf ("Error : could not open file : %s\n", infilename) ;
                puts (sf_strerror (NULL)) ;
index 6d462f0..348c81b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -41,17 +41,10 @@ int
 main (void)
 {      SF_FORMAT_INFO  info ;
        SF_INFO                 sfinfo ;
-       char buffer [128] ;
        int format, major_count, subtype_count, m, s ;
 
        memset (&sfinfo, 0, sizeof (sfinfo)) ;
-       buffer [0] = 0 ;
-       sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
-       if (strlen (buffer) < 1)
-       {       printf ("Line %d: could not retrieve lib version.\n", __LINE__) ;
-               exit (1) ;
-               } ;
-       printf ("Version : %s\n\n", buffer) ;
+       printf ("Version : %s\n\n", sf_version_string ()) ;
 
        sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ;
        sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &subtype_count, sizeof (int)) ;
index ec8a830..69d4dbf 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -68,6 +68,7 @@ main (void)
 
        if (! (file = sf_open ("sine.wav", SFM_WRITE, &sfinfo)))
        {       printf ("Error : Not able to open output file.\n") ;
+               free (buffer) ;
                return 1 ;
                } ;
 
@@ -91,6 +92,7 @@ main (void)
                puts (sf_strerror (file)) ;
 
        sf_close (file) ;
-       return   0 ;
+       free (buffer) ;
+       return 0 ;
 } /* main */
 
index 5c7db28..1c141a4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -7,15 +7,15 @@
 ** modification, are permitted provided that the following conditions are
 ** met:
 **
-**     * Redistributions of source code must retain the above copyright
-**       notice, this list of conditions and the following disclaimer.
-**     * Redistributions in binary form must reproduce the above copyright
-**       notice, this list of conditions and the following disclaimer in
-**       the documentation and/or other materials provided with the
-**       distribution.
-**     * Neither the author nor the names of any contributors may be used
-**       to endorse or promote products derived from this software without
-**       specific prior written permission.
+**      * Redistributions of source code must retain the above copyright
+**        notice, this list of conditions and the following disclaimer.
+**      * Redistributions in binary form must reproduce the above copyright
+**        notice, this list of conditions and the following disclaimer in
+**        the documentation and/or other materials provided with the
+**        distribution.
+**      * Neither the author nor the names of any contributors may be used
+**        to endorse or promote products derived from this software without
+**        specific prior written permission.
 **
 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 */
 
 #include       <stdio.h>
+#include       <string.h>
 
 /* Include this header file to use functions from libsndfile. */
 #include       <sndfile.h>
 
-/*    This will be the length of the buffer used to hold.frames while
-**    we process them.
+/*     This will be the length of the buffer used to hold.frames while
+**     we process them.
 */
 #define                BUFFER_LEN      1024
 
@@ -49,31 +50,35 @@ static void process_data (double *data, int count, int channels) ;
 
 int
 main (void)
-{   /* This is a buffer of double precision floating point values
-    ** which will hold our data while we process it.
-    */
-    static double data [BUFFER_LEN] ;
+{      /* This is a buffer of double precision floating point values
+       ** which will hold our data while we process it.
+       */
+       static double data [BUFFER_LEN] ;
 
-    /* A SNDFILE is very much like a FILE in the Standard C library. The
-    ** sf_open function return an SNDFILE* pointer when they sucessfully
+       /* A SNDFILE is very much like a FILE in the Standard C library. The
+       ** sf_open function return an SNDFILE* pointer when they sucessfully
        ** open the specified file.
-    */
-    SNDFILE      *infile, *outfile ;
-
-    /* A pointer to an SF_INFO stutct is passed to sf_open.
-    ** On read, the library fills this struct with information about the file.
-    ** On write, the struct must be filled in before calling sf_open.
-    */
-    SF_INFO            sfinfo ;
-    int                        readcount ;
-    const char *infilename = "input.wav" ;
-    const char *outfilename = "output.wav" ;
-
-    /* Here's where we open the input file. We pass sf_open the file name and
-    ** a pointer to an SF_INFO struct.
-    ** On successful open, sf_open returns a SNDFILE* pointer which is used
-    ** for all subsequent operations on that file.
-    ** If an error occurs during sf_open, the function returns a NULL pointer.
+       */
+       SNDFILE *infile, *outfile ;
+
+       /* A pointer to an SF_INFO struct is passed to sf_open.
+       ** On read, the library fills this struct with information about the file.
+       ** On write, the struct must be filled in before calling sf_open.
+       */
+       SF_INFO         sfinfo ;
+       int                     readcount ;
+       const char      *infilename = "input.wav" ;
+       const char      *outfilename = "output.wav" ;
+
+       /* The SF_INFO struct must be initialized before using it.
+       */
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+
+       /* Here's where we open the input file. We pass sf_open the file name and
+       ** a pointer to an SF_INFO struct.
+       ** On successful open, sf_open returns a SNDFILE* pointer which is used
+       ** for all subsequent operations on that file.
+       ** If an error occurs during sf_open, the function returns a NULL pointer.
        **
        ** If you are trying to open a raw headerless file you will need to set the
        ** format and channels fields of sfinfo before calling sf_open(). For
@@ -82,56 +87,56 @@ main (void)
        **
        **              sfinfo.format   = SF_FORMAT_RAW | SF_FORMAT_PCM_16 ;
        **              sfinfo.channels = 2 ;
-    */
-    if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
-    {   /* Open failed so print an error message. */
-        printf ("Not able to open input file %s.\n", infilename) ;
-        /* Print the error message from libsndfile. */
-        puts (sf_strerror (NULL)) ;
-        return  1 ;
-        } ;
-
-    if (sfinfo.channels > MAX_CHANNELS)
-    {   printf ("Not able to process more than %d channels\n", MAX_CHANNELS) ;
-        return  1 ;
-        } ;
-    /* Open the output file. */
-    if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)))
-    {   printf ("Not able to open output file %s.\n", outfilename) ;
-        puts (sf_strerror (NULL)) ;
-        return  1 ;
-        } ;
-
-    /* While there are.frames in the input file, read them, process
-    ** them and write them to the output file.
-    */
-    while ((readcount = sf_read_double (infile, data, BUFFER_LEN)))
-    {   process_data (data, readcount, sfinfo.channels) ;
-        sf_write_double (outfile, data, readcount) ;
-        } ;
-
-    /* Close input and output files. */
-    sf_close (infile) ;
-    sf_close (outfile) ;
-
-    return 0 ;
+       */
+       if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
+       {       /* Open failed so print an error message. */
+               printf ("Not able to open input file %s.\n", infilename) ;
+               /* Print the error message from libsndfile. */
+               puts (sf_strerror (NULL)) ;
+               return 1 ;
+               } ;
+
+       if (sfinfo.channels > MAX_CHANNELS)
+       {       printf ("Not able to process more than %d channels\n", MAX_CHANNELS) ;
+               return 1 ;
+               } ;
+       /* Open the output file. */
+       if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)))
+       {       printf ("Not able to open output file %s.\n", outfilename) ;
+               puts (sf_strerror (NULL)) ;
+               return 1 ;
+               } ;
+
+       /* While there are.frames in the input file, read them, process
+       ** them and write them to the output file.
+       */
+       while ((readcount = sf_read_double (infile, data, BUFFER_LEN)))
+       {       process_data (data, readcount, sfinfo.channels) ;
+               sf_write_double (outfile, data, readcount) ;
+               } ;
+
+       /* Close input and output files. */
+       sf_close (infile) ;
+       sf_close (outfile) ;
+
+       return 0 ;
 } /* main */
 
 static void
 process_data (double *data, int count, int channels)
 {      double channel_gain [MAX_CHANNELS] = { 0.5, 0.8, 0.1, 0.4, 0.4, 0.9 } ;
-    int k, chan ;
+       int k, chan ;
 
-    /* Process the data here.
-    ** If the soundfile contains more then 1 channel you need to take care of
-    ** the data interleaving youself.
-    ** Current we just apply a channel dependant gain.
-    */
+       /* Process the data here.
+       ** If the soundfile contains more then 1 channel you need to take care of
+       ** the data interleaving youself.
+       ** Current we just apply a channel dependant gain.
+       */
 
-    for (chan = 0 ; chan < channels ; chan ++)
-        for (k = chan ; k < count ; k+= channels)
-            data [k] *= channel_gain [chan] ;
+       for (chan = 0 ; chan < channels ; chan ++)
+               for (k = chan ; k < count ; k+= channels)
+                       data [k] *= channel_gain [chan] ;
 
-    return ;
+       return ;
 } /* process_data */
 
diff --git a/examples/sndfile-loopify.c b/examples/sndfile-loopify.c
new file mode 100644 (file)
index 0000000..f0ceb6d
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**
+**     * Redistributions of source code must retain the above copyright
+**       notice, this list of conditions and the following disclaimer.
+**     * Redistributions in binary form must reproduce the above copyright
+**       notice, this list of conditions and the following disclaimer in
+**       the documentation and/or other materials provided with the
+**       distribution.
+**     * Neither the author nor the names of any contributors may be used
+**       to endorse or promote products derived from this software without
+**       specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** A quick/rough hack to add SF_INSTRUMENT data to a file. It compiles, but
+** no guarantees beyond that. Happy to receive patches to fix/improve it.
+**
+** Code for this was stolen from programs/sndfile-convert.c and related code.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <sndfile.h>
+
+#include "common.h"
+
+#define BUFFER_LEN             (1 << 14)
+
+
+typedef        struct
+{      char    *infilename, *outfilename ;
+       SF_INFO infileinfo, outfileinfo ;
+} OptionData ;
+
+const char * program_name (const char * argv0) ;
+static void sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ;
+static void add_instrument_data (SNDFILE *outfile, const SF_INFO * in_info) ;
+
+static void
+usage_exit (const char *progname)
+{
+       printf ("\nUsage : %s <input file> <output file>\n", progname) ;
+       puts ("") ;
+       exit (1) ;
+} /* usage_exit */
+
+int
+main (int argc, char * argv [])
+{      const char      *progname, *infilename, *outfilename ;
+       SNDFILE         *infile = NULL, *outfile = NULL ;
+       SF_INFO         in_sfinfo, out_sfinfo ;
+
+       progname = program_name (argv [0]) ;
+
+       if (argc < 3 || argc > 5)
+               usage_exit (progname) ;
+
+       infilename = argv [argc-2] ;
+       outfilename = argv [argc-1] ;
+
+       if (strcmp (infilename, outfilename) == 0)
+       {       printf ("Error : Input and output filenames are the same.\n\n") ;
+               usage_exit (progname) ;
+               } ;
+
+       if (strlen (infilename) > 1 && infilename [0] == '-')
+       {       printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ;
+               usage_exit (progname) ;
+               } ;
+
+       if (outfilename [0] == '-')
+       {       printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ;
+               usage_exit (progname) ;
+               } ;
+
+       memset (&in_sfinfo, 0, sizeof (in_sfinfo)) ;
+
+       if ((infile = sf_open (infilename, SFM_READ, &in_sfinfo)) == NULL)
+       {       printf ("Not able to open input file %s.\n", infilename) ;
+               puts (sf_strerror (NULL)) ;
+               return 1 ;
+               } ;
+
+       memcpy (&out_sfinfo, &in_sfinfo, sizeof (out_sfinfo)) ;
+       /* Open the output file. */
+       if ((outfile = sf_open (outfilename, SFM_WRITE, &out_sfinfo)) == NULL)
+       {       printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ;
+               return 1 ;
+               } ;
+
+       /* Add the loop data */
+       add_instrument_data (outfile, &in_sfinfo) ;
+
+       /* Copy the audio data */
+       sfe_copy_data_int (outfile, infile, in_sfinfo.channels) ;
+
+       sf_close (infile) ;
+       sf_close (outfile) ;
+
+       return 0 ;
+} /* main */
+
+const char *
+program_name (const char * argv0)
+{      const char * tmp ;
+
+       tmp = strrchr (argv0, '/') ;
+       argv0 = tmp ? tmp + 1 : argv0 ;
+
+       /* Remove leading libtool name mangling. */
+       if (strstr (argv0, "lt-") == argv0)
+               return argv0 + 3 ;
+
+       return argv0 ;
+} /* program_name */
+
+static void
+sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels)
+{      static int      data [BUFFER_LEN] ;
+       int             frames, readcount ;
+
+       frames = BUFFER_LEN / channels ;
+       readcount = frames ;
+
+       while (readcount > 0)
+       {       readcount = sf_readf_int (infile, data, frames) ;
+               sf_writef_int (outfile, data, readcount) ;
+               } ;
+
+       return ;
+} /* sfe_copy_data_int */
+
+static void
+add_instrument_data (SNDFILE *file, const SF_INFO *info)
+{      SF_INSTRUMENT instr ;
+
+       memset (&instr, 0, sizeof (instr)) ;
+
+       instr.gain = 1 ;
+       instr.basenote = 0 ;
+       instr.detune = 0 ;
+       instr.velocity_lo = 0 ;
+       instr.velocity_hi = 0 ;
+       instr.key_lo = 0 ;
+       instr.key_hi = 0 ;
+       instr.loop_count = 1 ;
+
+       instr.loops [0].mode = SF_LOOP_FORWARD ;
+       instr.loops [0].start = 0 ;
+       instr.loops [0].end = info->frames ;
+       instr.loops [0].count = 0 ;
+
+       if (sf_command (file, SFC_SET_INSTRUMENT, &instr, sizeof (instr)) == SF_FALSE)
+       {       printf ("\n\nLine %d : sf_command (SFC_SET_INSTRUMENT) failed.\n\n", __LINE__) ;
+               exit (1) ;
+               } ;
+
+       return ;
+} /* add_instrument_data */
+
index 7a7a219..466bb86 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -68,9 +68,9 @@ convert_to_text (SNDFILE * infile, FILE * outfile, int channels)
 int
 main (int argc, char * argv [])
 {      char            *progname, *infilename, *outfilename ;
-       SNDFILE         *infile = NULL ;
+       SNDFILE         *infile = NULL ;
        FILE            *outfile = NULL ;
-       SF_INFO         sfinfo ;
+       SF_INFO         sfinfo ;
 
        progname = strrchr (argv [0], '/') ;
        progname = progname ? progname + 1 : argv [0] ;
@@ -101,6 +101,8 @@ main (int argc, char * argv [])
                return 1 ;
                } ;
 
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+
        if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL)
        {       printf ("Not able to open input file %s.\n", infilename) ;
                puts (sf_strerror (NULL)) ;
index ad47a5f..d442728 100644 (file)
@@ -10,7 +10,7 @@ Release: %{release}
 Copyright: LGPL
 Group: Libraries/Sound
 Source: http://www.mega-nerd.com/libsndfile/libsndfile-%{version}.tar.gz
-URL: http://www.mega-nerd.com/libsndfile/
+Url: http://www.mega-nerd.com/libsndfile/
 BuildRoot: /var/tmp/%{name}-%{version}
 
 %description
index 3f5d9ef..4964336 100644 (file)
@@ -1,11 +1,12 @@
 ## Process this file with automake to produce Makefile.in
 
 man_MANS = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \
-                       sndfile-metadata-get.1 sndfile-metadata-set.1 sndfile-concat.1 \
-                       sndfile-interleave.1 sndfile-deinterleave.1
+       sndfile-metadata-get.1 sndfile-metadata-set.1 sndfile-concat.1 \
+       sndfile-interleave.1 sndfile-deinterleave.1 sndfile-salvage.1
 
 EXTRA_DIST = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \
-                       sndfile-metadata-get.1 sndfile-concat.1 sndfile-interleave.1
+       sndfile-metadata-get.1 sndfile-concat.1 sndfile-interleave.1 \
+       sndfile-salvage.1
 
 # Same manpage for both programs.
 sndfile-metadata-set.1 : sndfile-metadata-get.1
index 10c0e42..358b4e9 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,33 +89,44 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = man
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -83,13 +148,20 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 man1dir = $(mandir)/man1
 am__installdirs = "$(DESTDIR)$(man1dir)"
 NROFF = nroff
 MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -127,13 +199,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -197,7 +270,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -236,7 +311,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -248,9 +322,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -264,11 +340,12 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 man_MANS = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \
-                       sndfile-metadata-get.1 sndfile-metadata-set.1 sndfile-concat.1 \
-                       sndfile-interleave.1 sndfile-deinterleave.1
+       sndfile-metadata-get.1 sndfile-metadata-set.1 sndfile-concat.1 \
+       sndfile-interleave.1 sndfile-deinterleave.1 sndfile-salvage.1
 
 EXTRA_DIST = sndfile-info.1 sndfile-play.1 sndfile-convert.1 sndfile-cmp.1 \
-                       sndfile-metadata-get.1 sndfile-concat.1 sndfile-interleave.1
+       sndfile-metadata-get.1 sndfile-concat.1 sndfile-interleave.1 \
+       sndfile-salvage.1
 
 all: all-am
 
@@ -285,7 +362,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu man/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -311,11 +387,18 @@ clean-libtool:
        -rm -rf .libs _libs
 install-man1: $(man_MANS)
        @$(NORMAL_INSTALL)
-       test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
-       @list=''; test -n "$(man1dir)" || exit 0; \
-       { for i in $$list; do echo "$$i"; done; \
-       l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-         sed -n '/\.1[a-z]*$$/p'; \
+       @list1=''; \
+       list2='$(man_MANS)'; \
+       test -n "$(man1dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.1[a-z]*$$/p'; \
+       fi; \
        } | while read p; do \
          if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; echo "$$p"; \
@@ -344,30 +427,15 @@ uninstall-man1:
          sed -n '/\.1[a-z]*$$/p'; \
        } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
              -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-       test -z "$$files" || { \
-         echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
-         cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
-tags: TAGS
-TAGS:
+       dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
-       @list='$(MANS)'; if test -n "$$list"; then \
-         list=`for p in $$list; do \
-           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
-         if test -n "$$list" && \
-           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
-           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
-           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
-           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
-           echo "       typically \`make maintainer-clean' will remove them" >&2; \
-           exit 1; \
-         else :; fi; \
-       else :; fi
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -414,10 +482,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -500,16 +573,19 @@ uninstall-man: uninstall-man1
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       distclean distclean-generic distclean-libtool distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-man1 \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       uninstall uninstall-am uninstall-man uninstall-man1
+       cscopelist-am ctags-am distclean distclean-generic \
+       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-man1 install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags-am uninstall uninstall-am uninstall-man \
+       uninstall-man1
+
+.PRECIOUS: Makefile
 
 
 # Same manpage for both programs.
index 30870bd..d346e2c 100644 (file)
@@ -1,16 +1,29 @@
-.TH SNDFILE-CMP 1 "October 5, 2009"
-.SH NAME
-sndfile-cmp \- compares two audio files
-.SH SYNOPSIS
-.B sndfile-cmp
-.RI "file1 file2"
-.SH DESCRIPTION
-sndfile-cmp compares the audio data of two sound files. In particular most
-differences in the audio file header, particularly metadata like string info,
-are completely ignored.
-
-sndfile-cmp does its work using libsndfile
-(http://www.mega-nerd.com/libsndfile/).
-.SH AUTHOR
-This manual page was written by Erik de Castro Lopo <erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-CMP 1
+.Os
+.Sh NAME
+.Nm sndfile-cmp
+.Nd compare two audio files
+.Sh SYNOPSIS
+.Nm sndfile-cmp
+.Ar file1
+.Ar file2
+.Sh DESCRIPTION
+.Nm
+compares the audio data of two sound files.
+For two files to compare as being the same, their channel counts, sample rate,
+audio data lengths and actual audio data must match.
+Other differences such as string metadata like song title, artist etc and their
+presence or absence are ignored.
+.Sh EXIT STATUS
+.Bl -tag -width 1n -compact
+.It 0
+The audio data is the same.
+.It 1
+The audio data differs.
+.El
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile
+.Sh AUTHORS
+.An Conrad Parker Aq Mt conrad@metadecks.org
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
index 1d95765..2110401 100644 (file)
@@ -1,16 +1,28 @@
-.TH SNDFILE-CONCAT 1 "December 9, 2009"
-.SH NAME
-sndfile-concat \- concatenates two or more audio files
-.SH SYNOPSIS
-.B sndfile-concat
-.RI "infile1 infile2 .... outfile"
-.SH DESCRIPTION
-sndfile-concat generates a new output file by concatenating two or more input
-files. The format of the output file is the same as the format of the input
-file.
-
-sndfile-concat does its work using libsndfile
-(http://www.mega-nerd.com/libsndfile/).
-.SH AUTHOR
-This manual page was written by Erik de Castro Lopo <erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-CONCAT 1
+.Os
+.Sh NAME
+.Nm sndfile-concat
+.Nd concatenate audio data from two or more audio files
+.Sh SYNOPSIS
+.Nm sndfile-concat
+.Ar infile1
+.Ar infile2
+.Ar ...
+.Ar outfile
+.Sh DESCRIPTION
+.Nm
+generates a new output file by concatenating the audio data
+of two or more input files. The encoding of the output file
+is the encoding used in
+.Ar infile1 .
+Audio data from the subsequent files are converted to this encoding.
+The only restriction is that the files must have
+the same number of channels.
+The output file is overwritten if it already exists.
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
index 583c956..d34edcd 100644 (file)
-.TH SNDFILE-CONVERT 1 "October 09, 2002"
-.SH NAME
-sndfile-convert \- convert a sound files from one format to another
-.SH SYNOPSIS
-.B sndfile-convert
-.RI "[encoding] input_file output_file"
-.LP
-.B sndfile-convert
-.RI --help
-.SH DESCRIPTION
-sndfile-convert converts sound files from one format to another using
-libsndfile (http://www.mega-nerd.com/libsndfile/) to read and write
-the data.
-.LP
-The format of the output file is determined by the filename extension
-of the output file.
-.LP
-The optional encoding parameter allows setting of the data encoding for
-the output file. Run "sndfile\-convert \-\-help" for more information.
-.SH AUTHOR
-This manual page was written by Erik de Castro Lopo <erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-CONVERT 1
+.Os
+.Sh NAME
+.Nm sndfile-convert
+.Nd convert sound files from one format to another
+.Sh SYNOPSIS
+.Nm sndfile-convert
+.Op Fl override-sample-rate Ns = Ns Ar rate
+.Op Fl endian Ns = Ns Cm little | big | cpu
+.Op Fl normalize
+.Op Ar encoding
+.Ar input
+.Ar output
+.Sh DESCRIPTION
+.Nm
+converts sound files from one audio format to another.
+The output file is overwritten it it already exists.
+.Ss Formats
+The format of the output file is determined by the filename extension.
+The following file formats are currently recognized:
+.Pp
+.Bl -tag -compact -width ircam
+.It wav
+WAV (Microsoft)
+.It aif
+AIFF (Apple/SGI)
+.It au
+AU (Sun/NeXT)
+.It snd
+AU (Sun/NeXT)
+.It raw
+RAW (header-less)
+.It gsm
+RAW (header-less)
+.It vox
+RAW (header-less)
+.It paf
+PAF (Ensoniq PARIS, big-endian)
+.It fap
+PAF (Ensoniq PARIS, little-endian)
+.It svx
+IFF (Amiga IFF/SVX8/SV16)
+.It nist
+SPHERE (NIST SPeech HEader Resources)
+.It sph
+SPHERE (NIST SPeech HEader Resources)
+.It voc
+VOC (Creative Labs)
+.It ircam
+SF (Berkeley/IRCAM/CARL)
+.It sf
+SF (Berkeley/IRCAM/CARL)
+.It w64
+W64 (SoundFoundry WAVE 64)
+.It mat
+MAT4 (GNU Octave 2.0 / Matlab 4.2)
+.It mat4
+MAT4 (GNU Octave 2.0 / Matlab 4.2)
+.It mat5
+MAT5 (GNU Octave 2.1 / Matlab 5.0)
+.It pvf
+PVF (Portable Voice Format)
+.It xi
+XI (FastTracker 2)
+.It htk
+HTK (HMM Tool Kit)
+.It sds
+SDS (Midi Sample Dump Standard)
+.It avr
+AVR (Audio Visual Research)
+.It wavex
+WAVEX (MS WAVE with WAVEFORMATEX)
+.It sd2
+SD2 (Sound Designer II)
+.It flac
+FLAC (FLAC Lossless Audio Codec)
+.It caf
+CAF (Apple Core Audio File)
+.It wve
+WVE (Psion Series 3)
+.It prc
+WVE (Psion Series 3)
+.It ogg
+OGG (OGG Container format)
+.It oga
+OGG (OGG Container format)
+.It mpc
+MPC (Akai MPC 2k)
+.It rf64
+RF64 (RIFF 64)
+.El
+.Ss Options
+The following options are recoginzed:
+.Pp
+.Bl -tag -compact -width "override-sample-rate=XXXXX"
+.It Fl override-sample-rate Ns = Ns Ar rate
+Make the input use sample rate of
+.Ar rate
+Hz.
+.It Fl endian Ns = Ns Cm little
+Make the output file use little endian data.
+.It Fl endian Ns = Ns Cm big
+Make the output file use big endian data.
+.It Fl endian Ns = Ns Cm cpu
+Make the output file use CPU endianness.
+.It Fl normalize
+Normalize the audio data in the output file.
+.El
+.Ss Encodings
+The optional
+.Ar encoding
+parameter allows setting of the data encoding for the output file.
+The following encodings are currently supported:
+.Pp
+.Bl -tag -compact -width ima-adpcmXX
+.It Fl pcms8
+signed 8 bit pcm
+.It Fl pcmu8
+unsigned 8 bit pcm
+.It Fl pcm16
+16 bit pcm
+.It Fl pcm24
+24 bit pcm
+.It Fl pcm32
+32 bit pcm
+.It Fl float32
+32 bit floating point
+.It Fl ulaw
+ULAW
+.It Fl alaw
+ALAW
+.It Fl ima-adpcm
+IMA ADPCM (WAV only)
+.It Fl ms-adpcm
+MS ADPCM (WAV only)
+.It Fl gsm610
+GSM6.10 (WAV only)
+.It Fl dwvw12
+12 bit DWVW (AIFF only)
+.It Fl dwvw16
+16 bit DWVW (AIFF only)
+.It Fl dwvw24
+24 bit DWVW (AIFF only)
+.It Fl vorbis
+Vorbis (OGG only)
+.El
+.Pp
+If no encoding is specified for the output file,
+.Nm
+will try to use the encoding of the input file.
+This will not always work as most container formats
+(e.g. WAV, AIFF etc) only support a small subset of encodings
+(e.g. 16 bit PCM, a-law, Vorbis etc).
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com .
index b668758..68c6a1e 100644 (file)
@@ -1,16 +1,34 @@
-.TH SNDFILE-INFO 1 "July 28, 2002"
-.SH NAME
-sndfile-info \- display information about a sound file
-.SH SYNOPSIS
-.B sndfile-info
-.RI file
-.SH DESCRIPTION
-sndfile-info will display basic information about a sound file such as
-its format, its sample rate, and the number of channels. This information
-is obtained using libsndfile (http://www.mega-nerd.com/libsndfile/).
-.SH AUTHOR
-This manual page was originally written by Joshua Haberman 
-<joshua@debian.org>, for the Debian GNU/Linux system (but may be used by 
-others). Further additions have been made by Erik de Castro Lopo 
-<erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-INFO 1
+.Os
+.Sh NAME
+.Nm sndfile-info
+.Nd display information about sound files
+.Sh SYNOPSIS
+.Nm sndfile-info
+.Op Fl -broadcast
+.Op Fl -cart
+.Op Fl -channel-map
+.Op Fl -instrument
+.Ar
+.Sh DESCRIPTION
+.Nm
+displays basic information about sound files
+such as format, number of channels, samplerate, and length.
+The following options are recognized:
+.Pp
+.Bl -tag -compact -width channelmapXXXX
+.It Fl -broadcast
+Display broadcast (BWF) info.
+.It Fl -cart
+Display the cart chunk of a WAV (or related) file.
+.It Fl -channel-map
+Display channel map.
+.It Fl -instrument
+Display instrument info:
+a base note, gain, velocity, key, and loop points.
+.El
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com .
index 26ca345..04498c6 100644 (file)
@@ -1,23 +1,62 @@
-.TH SNDFILE-INTERLEAVE 1 "December 14, 2009"
-.SH NAME
-sndfile-interleave \- convert multiple single channel files into a multi-channel file
-.br
-sndfile-deinterleave \- split a multi-channel into multiple single channel files
-.SH SYNOPSIS
-.B sndfile-interleave
-.RI "<input 1> <input 2> ... -o <output file>"
-.br
-.B sndfile-deinterleave
-.RI "filename"
-
-.SH DESCRIPTION
-sndfile-interleave and sndfile-deinterleave use libsndfile
-(http://www.mega-nerd.com/libsndfile/) to convert back and forth between multiple
-single channel files and a single multi-channel sound file.
-
-Run "sndfile\-interleave \-\-help" or "sndfile\-deinterleave \-\-help" for
-more information
-
-.SH AUTHOR
-This manual page was written by Erik de Castro Lopo <erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-INTERLEAVE 1
+.Os
+.Sh NAME
+.Nm sndfile-interleave ,
+.Nm sndfile-deinterleave
+.Nd convert mono files into a multi-channel file and vice versa
+.Sh SYNOPSIS
+.Nm sndfile-interleave
+.Ar input1
+.Ar input2
+.Ar ...
+.Fl o Ar output
+.Nm sndfile-deinterleave
+.Ar file
+.Sh DESCRIPTION
+.Nm sndfile-interleave
+creates a multi-channel file taking audio data
+from two or more mono files as individual channels.
+The format of the output file is determined by its filename suffix.
+The audio parameters of the output file will be made so that
+the format can accommodate each of the mono inputs;
+for example, the samplerate will be the maximal samplerate
+occuring in the inputs.
+The output file will be overwritten if it already exists.
+.Pp
+.Nm sndfile-deinterleave
+creates two or more mono files from a multi-channel audio file,
+containing data from the individual channels. The names of the
+resulting mono files are of the form
+.Dq name_XY.suf
+where
+.Em name
+and
+.Em suf
+are the basename and suffix of the original file.
+If any file of such name already exists, it will be overwritten.
+Apart from the number of channels,
+the audio format of the resulting mono files
+is the same as that of the original file.
+.Sh EXIT STATUS
+.Ex -std
+.Sh EXAMPLES
+Merge a mono OGG file and a mono FLAC file into a stereo WAV file:
+.Bd -literal -offset indent
+$ sndfile-interleave left.ogg right.flac -o stereo.wav
+.Ed
+.Pp
+Split a multi-channel into individual mono files:
+.Bd -literal -offset indent
+$ sndfile-deinterleave multi.wav
+Input file : multi
+Output files :
+    multi_00.wav
+    multi_01.wav
+    multi_02.wav
+    multi_03.wav
+.Ed
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
index b97560e..90aac3a 100644 (file)
-.TH SNDFILE-METADATA-GET 1 "October 6, 2009"
-.SH NAME
-sndfile-metadata-get \- retrieve metadata from a sound file
-.br
-sndfile-metadata-set \- set metadata in a sound file
-.SH SYNOPSIS
-.B sndfile-metadata-get
-.RI "[options] file"
-.br
-.B sndfile-metadata-set
-.RI "[options] file"
-.br
-.B sndfile-metadata-set
-.RI "[options] input-file output-file"
-
-.SH DESCRIPTION
-sndfile-metadata-get and sndfile-metadata-set use libsndfile
-(http://www.mega-nerd.com/libsndfile/) to retrieve metadata from or set metadata
-in a sound file.
-
-Run "sndfile\-metadata\-get \-\-help" or "sndfile\-metadata\-set \-\-help" for
-more information
-
-.SH AUTHOR
-This manual page was written by Erik de Castro Lopo <erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-METADATA-GET 1
+.Os
+.Sh NAME
+.Nm sndfile-metadata-get ,
+.Nm sndfile-metadata-set
+.Nd get or set metadata in a sound file
+.Sh SYNOPSIS
+.Nm sndfile-metadata-get
+.Op Ar options
+.Ar file
+.Nm sndfile-metadata-set
+.Op Ar options
+.Ar file
+.Nm sndfile-metadata-set
+.Op Ar options
+.Ar input
+.Ar output
+.Sh DESCRIPTION
+.Nm sndfile-metadata-get
+displays bext and string metadata stored in an audio file.
+The following options specify what to print.
+.Pp
+.Bl -tag -width bext-descriptionXXXX -compact
+.It Fl -all
+all metadata
+.It Fl -bext-description
+description
+.It Fl -bext-originator
+originator info
+.It Fl -bext-orig-ref
+originator reference
+.It Fl -bext-umid
+Unique Material Identifier
+.It Fl -bext-orig-date
+origination date
+.It Fl -bext-orig-time
+origination time
+.It Fl -bext-coding-hist
+coding history
+.It Fl -str-title
+title
+.It Fl -str-copyright
+copyright
+.It Fl -str-artist
+artist
+.It Fl -str-comment
+comment
+.It Fl -str-date
+creation date
+.It Fl -str-album
+album
+.It Fl -str-license
+license
+.El
+.Pp
+.Nm sndfile-metadata-set
+sets bext and string metadata in an audio file if the format supports it.
+If the file does not contain a BEXT chunk to be modified,
+the second synopsis must be used, where another output file
+capable of storing the metadata is created.
+This file is overwritten if it already exists.
+The following options take an argument specifying the metadata:
+.Pp
+.Bl -tag -width bext-coding-histXXXXXXX -compact
+.It Fl -bext-description
+description
+.It Fl -bext-originator
+originator
+.It Fl -bext-orig-ref
+originator reference
+.It Fl -bext-umid
+Unique Material Identifier
+.It Fl -bext-orig-date
+origination date
+.It Fl -bext-orig-time
+origination time
+.It Fl -bext-coding-hist
+coding history
+.It Fl -bext-time-raf
+time reference
+.It Fl -str-comment
+comment
+.It Fl -str-title
+title
+.It Fl -str-copyright
+copyright
+.It Fl -str-artist
+artist
+.It Fl -str-date
+date
+.It Fl -str-album
+album
+.It Fl -str-license
+license
+.El
+.Pp
+The following options take no argument:
+.Pp
+.Bl -tag -width bext-coding-histXXXXXXX -compact
+.It Fl -bext-auto-time-date
+Set the BEXT time and date to current.
+.It Fl -bext-auto-time
+Set the BEXT time to current.
+.It Fl -bext-auto-date
+Set the BEXT date to current.
+.It Fl -str-auto-date
+Set the string date to current.
+.El
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.Lk http://tech.ebu.ch/docs/tech/tech3285.pdf
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
index 0196461..6f69042 100644 (file)
@@ -1,36 +1,35 @@
-.de EX
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
-.TH SNDFILE-PLAY 1 "July 28, 2002"
-.SH NAME
-sndfile-play \- play a sound file
-.SH SYNOPSIS
-.B sndfile-play
-.RI file
-.SH DESCRIPTION
-sndfile-play plays the specified sound file using :
-.EX
-ALSA on Linux
-/dev/dsp on systems supporting OSS (including Linux)
-/dev/audio on Sun Solaris
-CoreAudio on Apple MacOSX
-waveOut on Microsoft Win32
-.EE
-sndfile-play uses libsndfile (http://www.mega-nerd.com/libsndfile/)
-to read the file.
-.SH AUTHOR
-This manual page was originally written by Joshua Haberman 
-<joshua@debian.org>, for the Debian GNU/Linux system (but may be used by 
-others). Further additions have been made by Erik de Castro Lopo 
-<erikd@mega-nerd.com>.
-
+.Dd November 2, 2014
+.Dt SNDFILE-PLAY 1
+.Os
+.Sh NAME
+.Nm sndfile-play
+.Nd play a sound file
+.Sh SYNOPSIS
+.Nm sndfile-play
+.Ar
+.Sh DESCRIPTION
+.Nm
+plays one or more sound files on various operating systems using standard audio
+output APIs. The following table summarizes which audio API is used where:
+.Pp
+.Bl -tag -width MacOSX10XXX -compact
+.It Linux
+ALSA or OSS
+.It OpenBSD
+sndio
+.It FreeBSD
+/dev/dsp (OSS)
+.It Solaris
+/dev/audio
+.It MacOSX 10.6
+Carbon and CoreAudio
+.It MacOSX 10.7
+AudioToolbox
+.It Win32
+waveOut
+.El
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.\" FIXME: links to ALSA, OSS, sndio, Sun audio, MacOSX audio
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
diff --git a/man/sndfile-salvage.1 b/man/sndfile-salvage.1
new file mode 100644 (file)
index 0000000..87e0408
--- /dev/null
@@ -0,0 +1,25 @@
+.Dd November 2, 2014
+.Dt SNDFILE-SALVAGE 1
+.Os
+.Sh NAME
+.Nm sndfile-salvage
+.Nd salvage audio data from WAV files longer than 4G
+.Sh SYNOPSIS
+.Nm sndfile-salvage
+.Ar toolong.wav
+.Ar fixed64.wav
+.Sh DESCRIPTION
+Audio files using the WAV file container are inherently limited to 4G of data
+size fields in the WAV header being stored as unsigned 32bit integers.
+Many applications have trouble with these WAV files
+that are more the 4G in size.
+.Nm
+rewrites the WAV file into a W64 file with the same audio content.
+This file is overwritten if it already exists.
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Lk http://www.mega-nerd.com/libsndfile/
+.\".Lk http://en.wikipedia.org/wiki/RF64
+.Sh AUTHORS
+.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com
index b513c56..8149553 100644 (file)
@@ -7,9 +7,9 @@ bin_PROGRAMS = sndfile-info sndfile-play sndfile-convert sndfile-cmp \
 OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@
 OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 
-INCLUDES = -I$(top_srcdir)/src $(OS_SPECIFIC_CFLAGS)
+AM_CPPFLAGS = -I$(top_srcdir)/src $(OS_SPECIFIC_CFLAGS)
 
-CLEANFILES = *~
+CLEANFILES = *~ sndfile-*.exe
 
 # This is the BeOS version of sndfile-play. It needs to be compiled with the C++
 # compiler.
index db33994..56e3c75 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -41,21 +95,21 @@ bin_PROGRAMS = sndfile-info$(EXEEXT) sndfile-play$(EXEEXT) \
        sndfile-interleave$(EXEEXT) sndfile-deinterleave$(EXEEXT) \
        sndfile-concat$(EXEEXT) sndfile-salvage$(EXEEXT)
 subdir = programs
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
@@ -65,9 +119,10 @@ PROGRAMS = $(bin_PROGRAMS)
 am_sndfile_cmp_OBJECTS = sndfile-cmp.$(OBJEXT) common.$(OBJEXT)
 sndfile_cmp_OBJECTS = $(am_sndfile_cmp_OBJECTS)
 sndfile_cmp_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
+am__v_lt_1 = 
 am_sndfile_concat_OBJECTS = sndfile-concat.$(OBJEXT) common.$(OBJEXT)
 sndfile_concat_OBJECTS = $(am_sndfile_concat_OBJECTS)
 sndfile_concat_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
@@ -104,6 +159,18 @@ am_sndfile_salvage_OBJECTS = sndfile-salvage.$(OBJEXT) \
        common.$(OBJEXT)
 sndfile_salvage_OBJECTS = $(am_sndfile_salvage_OBJECTS)
 sndfile_salvage_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
 depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
 am__depfiles_maybe = depfiles
@@ -114,22 +181,18 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(sndfile_cmp_SOURCES) $(sndfile_concat_SOURCES) \
        $(sndfile_convert_SOURCES) $(sndfile_deinterleave_SOURCES) \
        $(sndfile_info_SOURCES) $(sndfile_interleave_SOURCES) \
@@ -142,11 +205,33 @@ DIST_SOURCES = $(sndfile_cmp_SOURCES) $(sndfile_concat_SOURCES) \
        $(sndfile_metadata_get_SOURCES) \
        $(sndfile_metadata_set_SOURCES) $(sndfile_play_SOURCES) \
        $(sndfile_salvage_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Cfg/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -184,13 +269,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -254,7 +340,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -293,7 +381,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -305,9 +392,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -320,8 +409,8 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-INCLUDES = -I$(top_srcdir)/src $(OS_SPECIFIC_CFLAGS)
-CLEANFILES = *~
+AM_CPPFLAGS = -I$(top_srcdir)/src $(OS_SPECIFIC_CFLAGS)
+CLEANFILES = *~ sndfile-*.exe
 
 # This is the BeOS version of sndfile-play. It needs to be compiled with the C++
 # compiler.
@@ -362,7 +451,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu programs/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu programs/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -382,14 +470,19 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
        for p in $$list; do echo "$$p $$p"; done | \
        sed 's/$(EXEEXT)$$//' | \
-       while read p p1; do if test -f $$p || test -f $$p1; \
-         then echo "$$p"; echo "$$p"; else :; fi; \
+       while read p p1; do if test -f $$p \
+        || test -f $$p1 \
+         ; then echo "$$p"; echo "$$p"; else :; fi; \
        done | \
-       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+       sed -e 'p;s,.*/,,;n;h' \
+           -e 's|.*|.|' \
            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
        sed 'N;N;N;s,\n, ,g' | \
        $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -410,7 +503,8 @@ uninstall-binPROGRAMS:
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
        files=`for p in $$list; do echo "$$p"; done | \
          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-             -e 's/$$/$(EXEEXT)/' `; \
+             -e 's/$$/$(EXEEXT)/' \
+       `; \
        test -n "$$list" || exit 0; \
        echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
        cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -423,34 +517,44 @@ clean-binPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-sndfile-cmp$(EXEEXT): $(sndfile_cmp_OBJECTS) $(sndfile_cmp_DEPENDENCIES) 
+
+sndfile-cmp$(EXEEXT): $(sndfile_cmp_OBJECTS) $(sndfile_cmp_DEPENDENCIES) $(EXTRA_sndfile_cmp_DEPENDENCIES) 
        @rm -f sndfile-cmp$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_cmp_OBJECTS) $(sndfile_cmp_LDADD) $(LIBS)
-sndfile-concat$(EXEEXT): $(sndfile_concat_OBJECTS) $(sndfile_concat_DEPENDENCIES) 
+
+sndfile-concat$(EXEEXT): $(sndfile_concat_OBJECTS) $(sndfile_concat_DEPENDENCIES) $(EXTRA_sndfile_concat_DEPENDENCIES) 
        @rm -f sndfile-concat$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_concat_OBJECTS) $(sndfile_concat_LDADD) $(LIBS)
-sndfile-convert$(EXEEXT): $(sndfile_convert_OBJECTS) $(sndfile_convert_DEPENDENCIES) 
+
+sndfile-convert$(EXEEXT): $(sndfile_convert_OBJECTS) $(sndfile_convert_DEPENDENCIES) $(EXTRA_sndfile_convert_DEPENDENCIES) 
        @rm -f sndfile-convert$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_convert_OBJECTS) $(sndfile_convert_LDADD) $(LIBS)
-sndfile-deinterleave$(EXEEXT): $(sndfile_deinterleave_OBJECTS) $(sndfile_deinterleave_DEPENDENCIES) 
+
+sndfile-deinterleave$(EXEEXT): $(sndfile_deinterleave_OBJECTS) $(sndfile_deinterleave_DEPENDENCIES) $(EXTRA_sndfile_deinterleave_DEPENDENCIES) 
        @rm -f sndfile-deinterleave$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_deinterleave_OBJECTS) $(sndfile_deinterleave_LDADD) $(LIBS)
-sndfile-info$(EXEEXT): $(sndfile_info_OBJECTS) $(sndfile_info_DEPENDENCIES) 
+
+sndfile-info$(EXEEXT): $(sndfile_info_OBJECTS) $(sndfile_info_DEPENDENCIES) $(EXTRA_sndfile_info_DEPENDENCIES) 
        @rm -f sndfile-info$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_info_OBJECTS) $(sndfile_info_LDADD) $(LIBS)
-sndfile-interleave$(EXEEXT): $(sndfile_interleave_OBJECTS) $(sndfile_interleave_DEPENDENCIES) 
+
+sndfile-interleave$(EXEEXT): $(sndfile_interleave_OBJECTS) $(sndfile_interleave_DEPENDENCIES) $(EXTRA_sndfile_interleave_DEPENDENCIES) 
        @rm -f sndfile-interleave$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_interleave_OBJECTS) $(sndfile_interleave_LDADD) $(LIBS)
-sndfile-metadata-get$(EXEEXT): $(sndfile_metadata_get_OBJECTS) $(sndfile_metadata_get_DEPENDENCIES) 
+
+sndfile-metadata-get$(EXEEXT): $(sndfile_metadata_get_OBJECTS) $(sndfile_metadata_get_DEPENDENCIES) $(EXTRA_sndfile_metadata_get_DEPENDENCIES) 
        @rm -f sndfile-metadata-get$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_metadata_get_OBJECTS) $(sndfile_metadata_get_LDADD) $(LIBS)
-sndfile-metadata-set$(EXEEXT): $(sndfile_metadata_set_OBJECTS) $(sndfile_metadata_set_DEPENDENCIES) 
+
+sndfile-metadata-set$(EXEEXT): $(sndfile_metadata_set_OBJECTS) $(sndfile_metadata_set_DEPENDENCIES) $(EXTRA_sndfile_metadata_set_DEPENDENCIES) 
        @rm -f sndfile-metadata-set$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_metadata_set_OBJECTS) $(sndfile_metadata_set_LDADD) $(LIBS)
-sndfile-play$(EXEEXT): $(sndfile_play_OBJECTS) $(sndfile_play_DEPENDENCIES) 
+
+sndfile-play$(EXEEXT): $(sndfile_play_OBJECTS) $(sndfile_play_DEPENDENCIES) $(EXTRA_sndfile_play_DEPENDENCIES) 
        @rm -f sndfile-play$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_play_OBJECTS) $(sndfile_play_LDADD) $(LIBS)
-sndfile-salvage$(EXEEXT): $(sndfile_salvage_OBJECTS) $(sndfile_salvage_DEPENDENCIES) 
+
+sndfile-salvage$(EXEEXT): $(sndfile_salvage_OBJECTS) $(sndfile_salvage_DEPENDENCIES) $(EXTRA_sndfile_salvage_DEPENDENCIES) 
        @rm -f sndfile-salvage$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_salvage_OBJECTS) $(sndfile_salvage_LDADD) $(LIBS)
 
@@ -475,26 +579,23 @@ distclean-compile:
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -502,26 +603,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -533,15 +623,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -550,6 +636,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -601,10 +702,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -689,19 +795,21 @@ uninstall-am: uninstall-binPROGRAMS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-       clean-generic clean-libtool ctags distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-binPROGRAMS install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-       pdf pdf-am ps ps-am tags uninstall uninstall-am \
-       uninstall-binPROGRAMS
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+       clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-binPROGRAMS \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index 41b8e6e..3fc4e3d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2008 George Blood Audio
 **
 ** All rights reserved.
 
 #include "common.h"
 
-#define         BUFFER_LEN     4096
+#define        BUFFER_LEN      4096
 
-#define        MIN(x,y)        ((x) < (y) ? (x) : (y))
+#define        MIN(x, y)       ((x) < (y) ? (x) : (y))
 
 void
-sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels)
+sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize)
 {      static double   data [BUFFER_LEN], max ;
        int             frames, readcount, k ;
 
@@ -55,7 +55,7 @@ sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels)
 
        sf_command (infile, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ;
 
-       if (max < 1.0)
+       if (!normalize && max < 1.0)
        {       while (readcount > 0)
                {       readcount = sf_readf_double (infile, data, frames) ;
                        sf_writef_double (outfile, data, readcount) ;
@@ -252,7 +252,7 @@ sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * in
 
                /* If the input file is not the same as the output file, copy the data. */
                if ((infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT))
-                       sfe_copy_data_fp (outfile, infile, sfinfo.channels) ;
+                       sfe_copy_data_fp (outfile, infile, sfinfo.channels, SF_FALSE) ;
                else
                        sfe_copy_data_int (outfile, infile, sfinfo.channels) ;
                } ;
@@ -284,32 +284,37 @@ typedef struct
 
 static OUTPUT_FORMAT_MAP format_map [] =
 {
-       {       "aif",          3,      SF_FORMAT_AIFF  },
        {       "wav",          0,      SF_FORMAT_WAV   },
+       {       "aif",          3,      SF_FORMAT_AIFF  },
        {       "au",           0,      SF_FORMAT_AU    },
-       {       "caf",          0,      SF_FORMAT_CAF   },
-       {       "flac",         0,      SF_FORMAT_FLAC  },
        {       "snd",          0,      SF_FORMAT_AU    },
-       {       "svx",          0,      SF_FORMAT_SVX   },
-       {       "paf",          0,      SF_ENDIAN_BIG | SF_FORMAT_PAF   },
-       {       "fap",          0,      SF_ENDIAN_LITTLE | SF_FORMAT_PAF        },
+       {       "raw",          0,      SF_FORMAT_RAW   },
        {       "gsm",          0,      SF_FORMAT_RAW   },
+       {       "vox",          0,      SF_FORMAT_RAW   },
+       {       "paf",          0,      SF_FORMAT_PAF | SF_ENDIAN_BIG },
+       {       "fap",          0,      SF_FORMAT_PAF | SF_ENDIAN_LITTLE },
+       {       "svx",          0,      SF_FORMAT_SVX   },
        {       "nist",         0,      SF_FORMAT_NIST  },
-       {       "htk",          0,      SF_FORMAT_HTK   },
+       {       "sph",          0,      SF_FORMAT_NIST  },
+       {       "voc",          0,      SF_FORMAT_VOC   },
        {       "ircam",        0,      SF_FORMAT_IRCAM },
        {       "sf",           0,      SF_FORMAT_IRCAM },
-       {       "voc",          0,      SF_FORMAT_VOC   },
        {       "w64",          0,      SF_FORMAT_W64   },
-       {       "raw",          0,      SF_FORMAT_RAW   },
+       {       "mat",          0,      SF_FORMAT_MAT4  },
        {       "mat4",         0,      SF_FORMAT_MAT4  },
        {       "mat5",         0,      SF_FORMAT_MAT5  },
-       {       "mat",          0,      SF_FORMAT_MAT4  },
        {       "pvf",          0,      SF_FORMAT_PVF   },
+       {       "xi",           0,      SF_FORMAT_XI    },
+       {       "htk",          0,      SF_FORMAT_HTK   },
        {       "sds",          0,      SF_FORMAT_SDS   },
+       {       "avr",          0,      SF_FORMAT_AVR   },
+       {       "wavex",        0,      SF_FORMAT_WAVEX },
        {       "sd2",          0,      SF_FORMAT_SD2   },
-       {       "vox",          0,      SF_FORMAT_RAW   },
-       {       "xi",           0,      SF_FORMAT_XI    },
+       {       "flac",         0,      SF_FORMAT_FLAC  },
+       {       "caf",          0,      SF_FORMAT_CAF   },
        {       "wve",          0,      SF_FORMAT_WVE   },
+       {       "prc",          0,      SF_FORMAT_WVE   },
+       {       "ogg",          0,      SF_FORMAT_OGG   },
        {       "oga",          0,      SF_FORMAT_OGG   },
        {       "mpc",          0,      SF_FORMAT_MPC2K },
        {       "rf64",         0,      SF_FORMAT_RF64  },
@@ -368,12 +373,95 @@ program_name (const char * argv0)
        tmp = strrchr (argv0, '/') ;
        argv0 = tmp ? tmp + 1 : argv0 ;
 
-       tmp = strrchr (argv0, '/') ;
-       argv0 = tmp ? tmp + 1 : argv0 ;
-
        /* Remove leading libtool name mangling. */
        if (strstr (argv0, "lt-") == argv0)
                return argv0 + 3 ;
 
        return argv0 ;
 } /* program_name */
+
+const char *
+sfe_endian_name (int format)
+{
+       switch (format & SF_FORMAT_ENDMASK)
+       {       case SF_ENDIAN_FILE : return "file" ;
+               case SF_ENDIAN_LITTLE : return "little" ;
+               case SF_ENDIAN_BIG : return "big" ;
+               case SF_ENDIAN_CPU : return "cpu" ;
+               default : break ;
+               } ;
+
+       return "unknown" ;
+} /* sfe_endian_name */
+
+const char *
+sfe_container_name (int format)
+{
+       switch (format & SF_FORMAT_TYPEMASK)
+       {       case SF_FORMAT_WAV : return "WAV" ;
+               case SF_FORMAT_AIFF : return "AIFF" ;
+               case SF_FORMAT_AU : return "AU" ;
+               case SF_FORMAT_RAW : return "RAW" ;
+               case SF_FORMAT_PAF : return "PAF" ;
+               case SF_FORMAT_SVX : return "SVX" ;
+               case SF_FORMAT_NIST : return "NIST" ;
+               case SF_FORMAT_VOC : return "VOC" ;
+               case SF_FORMAT_IRCAM : return "IRCAM" ;
+               case SF_FORMAT_W64 : return "W64" ;
+               case SF_FORMAT_MAT4 : return "MAT4" ;
+               case SF_FORMAT_MAT5 : return "MAT5" ;
+               case SF_FORMAT_PVF : return "PVF" ;
+               case SF_FORMAT_XI : return "XI" ;
+               case SF_FORMAT_HTK : return "HTK" ;
+               case SF_FORMAT_SDS : return "SDS" ;
+               case SF_FORMAT_AVR : return "AVR" ;
+               case SF_FORMAT_WAVEX : return "WAVEX" ;
+               case SF_FORMAT_SD2 : return "SD2" ;
+               case SF_FORMAT_FLAC : return "FLAC" ;
+               case SF_FORMAT_CAF : return "CAF" ;
+               case SF_FORMAT_WVE : return "WVE" ;
+               case SF_FORMAT_OGG : return "OGG" ;
+               case SF_FORMAT_MPC2K : return "MPC2K" ;
+               case SF_FORMAT_RF64 : return "RF64" ;
+               default : break ;
+               } ;
+
+       return "unknown" ;
+} /* sfe_container_name */
+
+const char *
+sfe_codec_name (int format)
+{
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_PCM_S8 : return "signed 8 bit PCM" ;
+               case SF_FORMAT_PCM_16 : return "16 bit PCM" ;
+               case SF_FORMAT_PCM_24 : return "24 bit PCM" ;
+               case SF_FORMAT_PCM_32 : return "32 bit PCM" ;
+               case SF_FORMAT_PCM_U8 : return "unsigned 8 bit PCM" ;
+               case SF_FORMAT_FLOAT : return "32 bit float" ;
+               case SF_FORMAT_DOUBLE : return "64 bit double" ;
+               case SF_FORMAT_ULAW : return "u-law" ;
+               case SF_FORMAT_ALAW : return "a-law" ;
+               case SF_FORMAT_IMA_ADPCM : return "IMA ADPCM" ;
+               case SF_FORMAT_MS_ADPCM : return "MS ADPCM" ;
+               case SF_FORMAT_GSM610 : return "gsm610" ;
+               case SF_FORMAT_VOX_ADPCM : return "Vox ADPCM" ;
+               case SF_FORMAT_G721_32 : return "g721 32kbps" ;
+               case SF_FORMAT_G723_24 : return "g723 24kbps" ;
+               case SF_FORMAT_G723_40 : return "g723 40kbps" ;
+               case SF_FORMAT_DWVW_12 : return "12 bit DWVW" ;
+               case SF_FORMAT_DWVW_16 : return "16 bit DWVW" ;
+               case SF_FORMAT_DWVW_24 : return "14 bit DWVW" ;
+               case SF_FORMAT_DWVW_N : return "DWVW" ;
+               case SF_FORMAT_DPCM_8 : return "8 bit DPCM" ;
+               case SF_FORMAT_DPCM_16 : return "16 bit DPCM" ;
+               case SF_FORMAT_VORBIS : return "Vorbis" ;
+               case SF_FORMAT_ALAC_16 : return "16 bit ALAC" ;
+               case SF_FORMAT_ALAC_20 : return "20 bit ALAC" ;
+               case SF_FORMAT_ALAC_24 : return "24 bit ALAC" ;
+               case SF_FORMAT_ALAC_32 : return "32 bit ALAC" ;
+               default : break ;
+               } ;
+       return "unknown" ;
+} /* sfe_codec_name */
+
index 999690d..eda2d7d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -32,7 +32,7 @@
 
 
 #define        ARRAY_LEN(x)    ((int) (sizeof (x) / sizeof (x [0])))
-#define        MAX(a,b)                ((a) > (b) ? (a) : (b))
+#define        MAX(a, b)               ((a) > (b) ? (a) : (b))
 
 typedef struct
 {      const char * title ;
@@ -62,7 +62,7 @@ typedef SF_BROADCAST_INFO_VAR (2048) SF_BROADCAST_INFO_2K ;
 
 void sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info) ;
 
-void sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels) ;
+void sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize) ;
 
 void sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ;
 
@@ -71,3 +71,8 @@ int sfe_file_type_of_ext (const char *filename, int format) ;
 void sfe_dump_format_map (void) ;
 
 const char * program_name (const char * argv0) ;
+
+const char * sfe_endian_name (int format) ;
+const char * sfe_container_name (int format) ;
+const char * sfe_codec_name (int format) ;
+
index f550d13..26f6ac9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2008 Conrad Parker <conrad@metadecks.org>
 **
 ** All rights reserved.
@@ -97,7 +97,7 @@ compare (void)
        /* Calculate the framecount that will fit in our data buffers */
        items = BUFLEN / sfinfo1.channels ;
 
-       while ( (nread1 = sf_readf_double (sf1, buf1, items)) > 0)
+       while ((nread1 = sf_readf_double (sf1, buf1, items)) > 0)
        {       nread2 = sf_readf_double (sf2, buf2, nread1) ;
                if (nread2 != nread1)
                {       retval = comparison_error ("PCM data lengths", -1) ;
@@ -112,7 +112,7 @@ compare (void)
                offset += nread1 ;
                } ;
 
-       if ( (nread2 = sf_readf_double (sf2, buf2, nread1)) != 0)
+       if ((nread2 = sf_readf_double (sf2, buf2, items)) != 0)
        {       retval = comparison_error ("PCM data lengths", -1) ;
                goto out ;
                } ;
@@ -125,21 +125,12 @@ out :
 } /* compare */
 
 static void
-print_version (void)
-{      char buffer [256] ;
-
-       sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
-       printf ("\nVersion : %s\n\n", buffer) ;
-} /* print_version */
-
-static void
 usage_exit (void)
 {
-       print_version () ;
-
        printf ("Usage : %s <filename> <filename>\n", progname) ;
        printf ("       Compare the PCM data of two sound files.\n\n") ;
-       exit (0) ;
+       printf ("Using %s.\n\n", sf_version_string ()) ;
+       exit (1) ;
 } /* usage_exit */
 
 int
@@ -148,9 +139,7 @@ main (int argc, char *argv [])
        progname = program_name (argv [0]) ;
 
        if (argc != 3)
-       {       usage_exit () ;
-               return 1 ;
-               } ;
+               usage_exit () ;
 
        filename1 = argv [argc - 2] ;
        filename2 = argv [argc - 1] ;
@@ -158,7 +147,6 @@ main (int argc, char *argv [])
        if (strcmp (filename1, filename2) == 0)
        {       printf ("Error : Input filenames are the same.\n\n") ;
                usage_exit () ;
-               return 1 ;
                } ;
 
        return compare () ;
index cc24782..3a02a94 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -39,7 +39,7 @@
 
 #include       "common.h"
 
-#define                BUFFER_LEN      (1<<16)
+#define                BUFFER_LEN      (1 << 16)
 
 
 static void concat_data_fp (SNDFILE *wfile, SNDFILE *rofile, int channels) ;
@@ -61,14 +61,14 @@ usage_exit (const char *progname)
                "    number of channels.\n"
                ) ;
 
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
 int
 main (int argc, char *argv [])
 {      const char      *progname, *outfilename ;
-       SNDFILE         *outfile, **infiles ;
-       SF_INFO         sfinfo_out, sfinfo_in ;
+       SNDFILE         *outfile, **infiles ;
+       SF_INFO         sfinfo_out, sfinfo_in ;
        void            (*func) (SNDFILE*, SNDFILE*, int) ;
        int                     k ;
 
@@ -127,6 +127,7 @@ main (int argc, char *argv [])
                } ;
 
        sf_close (outfile) ;
+       free (infiles) ;
 
        return 0 ;
 } /* main */
index 0988982..547d01c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -54,27 +54,40 @@ usage_exit (const char *progname)
        puts ("\n"
                "    where [option] may be:\n\n"
                "        -override-sample-rate=X  : force sample rate of input to X\n"
+               "        -endian=little           : force output file to little endian data\n"
+               "        -endian=big              : force output file to big endian data\n"
+               "        -endian=cpu              : force output file same endian-ness as the CPU\n"
+               "        -normalize               : normalize the data in the output file\n"
                ) ;
 
        puts (
                "    where [encoding] may be one of the following:\n\n"
-               "        -pcms8     : force the output to signed 8 bit pcm\n"
-               "        -pcmu8     : force the output to unsigned 8 bit pcm\n"
-               "        -pcm16     : force the output to 16 bit pcm\n"
-               "        -pcm24     : force the output to 24 bit pcm\n"
-               "        -pcm32     : force the output to 32 bit pcm\n"
-               "        -float32   : force the output to 32 bit floating point"
+               "        -pcms8     : signed 8 bit pcm\n"
+               "        -pcmu8     : unsigned 8 bit pcm\n"
+               "        -pcm16     : 16 bit pcm\n"
+               "        -pcm24     : 24 bit pcm\n"
+               "        -pcm32     : 32 bit pcm\n"
+               "        -float32   : 32 bit floating point\n"
+               "        -ulaw      : ULAW\n"
+               "        -alaw      : ALAW\n"
+               "        -alac16    : 16 bit ALAC (CAF only)\n"
+               "        -alac20    : 20 bit ALAC (CAF only)\n"
+               "        -alac24    : 24 bit ALAC (CAF only)\n"
+               "        -alac32    : 32 bit ALAC (CAF only)\n"
+               "        -ima-adpcm : IMA ADPCM (WAV only)\n"
+               "        -ms-adpcm  : MS ADPCM (WAV only)\n"
+               "        -gsm610    : GSM6.10 (WAV only)\n"
+               "        -dwvw12    : 12 bit DWVW (AIFF only)\n"
+               "        -dwvw16    : 16 bit DWVW (AIFF only)\n"
+               "        -dwvw24    : 24 bit DWVW (AIFF only)\n"
+               "        -vorbis    : Vorbis (OGG only)\n"
                ) ;
+
        puts (
-               "        -ulaw      : force the output ULAW\n"
-               "        -alaw      : force the output ALAW\n"
-               "        -ima-adpcm : force the output to IMA ADPCM (WAV only)\n"
-               "        -ms-adpcm  : force the output to MS ADPCM (WAV only)\n"
-               "        -gsm610    : force the GSM6.10 (WAV only)\n"
-               "        -dwvw12    : force the output to 12 bit DWVW (AIFF only)\n"
-               "        -dwvw16    : force the output to 16 bit DWVW (AIFF only)\n"
-               "        -dwvw24    : force the output to 24 bit DWVW (AIFF only)\n"
-               "        -vorbis    : force the output to Vorbis (OGG only)\n"
+               "    If no encoding is specified, the program will try to use the encoding\n"
+               "    of the input file in the output file. This will not always work as\n"
+               "    most container formats (eg WAV, AIFF etc) only support a small subset\n"
+               "    of codec formats (eg 16 bit PCM, a-law, Vorbis etc).\n"
                ) ;
 
        puts (
@@ -85,23 +98,42 @@ usage_exit (const char *progname)
        sfe_dump_format_map () ;
 
        puts ("") ;
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
+static void
+report_format_error_exit (const char * argv0, SF_INFO * sfinfo)
+{      int old_format = sfinfo->format ;
+       int endian = sfinfo->format & SF_FORMAT_ENDMASK ;
+
+       sfinfo->format = old_format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ;
+
+       if (endian && sf_format_check (sfinfo))
+       {       printf ("Error : output file format does not support %s endian-ness.\n", sfe_endian_name (endian)) ;
+               exit (1) ;
+               } ;
+
+       printf ("\n"
+                       "Error : output file format is invalid.\n"
+                       "The '%s' container does not support '%s' codec data.\n"
+                       "Run '%s --help' for clues.\n\n",
+                       sfe_container_name (sfinfo->format), sfe_codec_name (sfinfo->format), program_name (argv0)) ;
+       exit (1) ;
+} /* report_format_error_exit */
+
 int
 main (int argc, char * argv [])
 {      const char      *progname, *infilename, *outfilename ;
-       SNDFILE         *infile = NULL, *outfile = NULL ;
-       SF_INFO         sfinfo ;
+       SNDFILE         *infile = NULL, *outfile = NULL ;
+       SF_INFO         sfinfo ;
        int                     k, outfilemajor, outfileminor = 0, infileminor ;
        int                     override_sample_rate = 0 ; /* assume no sample rate override. */
+       int                     endian = SF_ENDIAN_FILE, normalize = SF_FALSE ;
 
        progname = program_name (argv [0]) ;
 
        if (argc < 3 || argc > 5)
-       {       usage_exit (progname) ;
-               return 1 ;
-               } ;
+               usage_exit (progname) ;
 
        infilename = argv [argc-2] ;
        outfilename = argv [argc-1] ;
@@ -109,19 +141,16 @@ main (int argc, char * argv [])
        if (strcmp (infilename, outfilename) == 0)
        {       printf ("Error : Input and output filenames are the same.\n\n") ;
                usage_exit (progname) ;
-               return 1 ;
                } ;
 
        if (strlen (infilename) > 1 && infilename [0] == '-')
        {       printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ;
                usage_exit (progname) ;
-               return 1 ;
                } ;
 
        if (outfilename [0] == '-')
        {       printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ;
                usage_exit (progname) ;
-               return 1 ;
                } ;
 
        for (k = 1 ; k < argc - 2 ; k++)
@@ -157,6 +186,22 @@ main (int argc, char * argv [])
                {       outfileminor = SF_FORMAT_ALAW ;
                        continue ;
                        } ;
+               if (! strcmp (argv [k], "-alac16"))
+               {       outfileminor = SF_FORMAT_ALAC_16 ;
+                       continue ;
+                       } ;
+               if (! strcmp (argv [k], "-alac20"))
+               {       outfileminor = SF_FORMAT_ALAC_20 ;
+                       continue ;
+                       } ;
+               if (! strcmp (argv [k], "-alac24"))
+               {       outfileminor = SF_FORMAT_ALAC_24 ;
+                       continue ;
+                       } ;
+               if (! strcmp (argv [k], "-alac32"))
+               {       outfileminor = SF_FORMAT_ALAC_32 ;
+                       continue ;
+                       } ;
                if (! strcmp (argv [k], "-ima-adpcm"))
                {       outfileminor = SF_FORMAT_IMA_ADPCM ;
                        continue ;
@@ -194,6 +239,31 @@ main (int argc, char * argv [])
                        continue ;
                        } ;
 
+               if (! strcmp (argv [k], "-endian=little"))
+               {       endian = SF_ENDIAN_LITTLE ;
+                       continue ;
+                       } ;
+
+               if (! strcmp (argv [k], "-endian=big"))
+               {       endian = SF_ENDIAN_BIG ;
+                       continue ;
+                       } ;
+
+               if (! strcmp (argv [k], "-endian=cpu"))
+               {       endian = SF_ENDIAN_CPU ;
+                       continue ;
+                       } ;
+
+               if (! strcmp (argv [k], "-endian=file"))
+               {       endian = SF_ENDIAN_FILE ;
+                       continue ;
+                       } ;
+
+               if (! strcmp (argv [k], "-normalize"))
+               {       normalize = SF_TRUE ;
+                       continue ;
+                       } ;
+
                printf ("Error : Not able to decode argunment '%s'.\n", argv [k]) ;
                exit (1) ;
                } ;
@@ -227,6 +297,8 @@ main (int argc, char * argv [])
        else
                sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ;
 
+       sfinfo.format |= endian ;
+
        if ((sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI)
                switch (sfinfo.format & SF_FORMAT_SUBMASK)
                {       case SF_FORMAT_PCM_16 :
@@ -240,8 +312,14 @@ main (int argc, char * argv [])
                        } ;
 
        if (sf_format_check (&sfinfo) == 0)
-       {       printf ("Error : output file format is invalid (0x%08X).\n", sfinfo.format) ;
-               return 1 ;
+               report_format_error_exit (argv [0], &sfinfo) ;
+
+       if ((sfinfo.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610 && sfinfo.samplerate != 8000)
+       {       printf (
+                       "WARNING: GSM 6.10 data format only supports 8kHz sample rate. The converted\n"
+                       "ouput file will contain the input data converted to the GSM 6.10 data format\n"
+                       "but not re-sampled.\n"
+                       ) ;
                } ;
 
        /* Open the output file. */
@@ -253,10 +331,11 @@ main (int argc, char * argv [])
        /* Copy the metadata */
        copy_metadata (outfile, infile, sfinfo.channels) ;
 
-       if ((outfileminor == SF_FORMAT_DOUBLE) || (outfileminor == SF_FORMAT_FLOAT)
+       if (normalize
+                       || (outfileminor == SF_FORMAT_DOUBLE) || (outfileminor == SF_FORMAT_FLOAT)
                        || (infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT)
                        || (infileminor == SF_FORMAT_VORBIS) || (outfileminor == SF_FORMAT_VORBIS))
-               sfe_copy_data_fp (outfile, infile, sfinfo.channels) ;
+               sfe_copy_data_fp (outfile, infile, sfinfo.channels, normalize) ;
        else
                sfe_copy_data_int (outfile, infile, sfinfo.channels) ;
 
index df80b04..e27593e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2009-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -154,7 +154,7 @@ usage_exit (void)
                "a_00.wav, a_01.wav and so on.\n"
                ) ;
        printf ("Using %s.\n\n", sf_version_string ()) ;
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
 static void
index 5663044..87b3d42 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
 #include <windows.h>
 #endif
 
-static void print_version (void) ;
 static void usage_exit (const char *progname) ;
 
 static void info_dump (const char *filename) ;
 static int     instrument_dump (const char *filename) ;
 static int     broadcast_dump (const char *filename) ;
 static int     chanmap_dump (const char *filename) ;
+static int     cart_dump (const char *filename) ;
 static void total_dump (void) ;
 
 static double total_seconds = 0.0 ;
@@ -62,14 +62,10 @@ int
 main (int argc, char *argv [])
 {      int     k ;
 
-       print_version () ;
-
        if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0)
-       {       usage_exit (program_name (argv [0])) ;
-               return 1 ;
-               } ;
+               usage_exit (program_name (argv [0])) ;
 
-       if (strcmp (argv [1], "-i") == 0)
+       if (strcmp (argv [1], "--instrument") == 0)
        {       int error = 0 ;
 
                for (k = 2 ; k < argc ; k++)
@@ -77,7 +73,7 @@ main (int argc, char *argv [])
                return error ;
                } ;
 
-       if (strcmp (argv [1], "-b") == 0)
+       if (strcmp (argv [1], "--broadcast") == 0)
        {       int error = 0 ;
 
                for (k = 2 ; k < argc ; k++)
@@ -85,7 +81,7 @@ main (int argc, char *argv [])
                return error ;
                } ;
 
-       if (strcmp (argv [1], "-c") == 0)
+       if (strcmp (argv [1], "--channel-map") == 0)
        {       int error = 0 ;
 
                for (k = 2 ; k < argc ; k++)
@@ -93,6 +89,14 @@ main (int argc, char *argv [])
                return error ;
                } ;
 
+       if (strcmp (argv [1], "--cart") == 0)
+       {       int error = 0 ;
+
+               for (k = 2 ; k < argc ; k++)
+                       error += cart_dump (argv [k]) ;
+               return error ;
+               } ;
+
        for (k = 1 ; k < argc ; k++)
                info_dump (argv [k]) ;
 
@@ -109,37 +113,28 @@ main (int argc, char *argv [])
 static double  data [BUFFER_LEN] ;
 
 static void
-print_version (void)
-{      char buffer [256] ;
-
-       sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
-       printf ("\nVersion : %s\n\n", buffer) ;
-} /* print_version */
-
-
-static void
 usage_exit (const char *progname)
 {      printf ("Usage :\n  %s <file> ...\n", progname) ;
        printf ("    Prints out information about one or more sound files.\n\n") ;
-       printf ("  %s -i <file>\n", progname) ;
+       printf ("  %s --instrument <file>\n", progname) ;
        printf ("    Prints out the instrument data for the given file.\n\n") ;
-       printf ("  %s -b <file>\n", progname) ;
+       printf ("  %s --broadcast <file>\n", progname) ;
        printf ("    Prints out the broadcast WAV info for the given file.\n\n") ;
+       printf ("  %s --channel-map <file>\n", progname) ;
+       printf ("    Prints out the channel map for the given file.\n\n") ;
+       printf ("  %s --cart <file>\n", progname) ;
+       printf ("    Prints out the cart chunk WAV info for the given file.\n\n") ;
+
+       printf ("Using %s.\n\n", sf_version_string ()) ;
 #if (defined (_WIN32) || defined (WIN32))
                printf ("This is a Unix style command line application which\n"
                                "should be run in a MSDOS box or Command Shell window.\n\n") ;
                printf ("Sleeping for 5 seconds before exiting.\n\n") ;
                fflush (stdout) ;
 
-               /* This is the officially blessed by microsoft way but I can't get
-               ** it to link.
-               **     Sleep (15) ;
-               ** Instead, use this:
-               */
                Sleep (5 * 1000) ;
 #endif
-       printf ("Using %s.\n\n", sf_version_string ()) ;
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
 /*==============================================================================
@@ -149,15 +144,6 @@ usage_exit (const char *progname)
 static double  data [BUFFER_LEN] ;
 
 static double
-get_signal_max (SNDFILE *file)
-{      double  max ;
-
-       sf_command (file, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ;
-
-       return max ;
-} /* get_signal_max */
-
-static double
 calc_decibels (SF_INFO * sfinfo, double max)
 {      double decibels ;
 
@@ -231,8 +217,8 @@ generate_duration_str (SF_INFO *sfinfo)
 static void
 info_dump (const char *filename)
 {      static  char    strbuffer [BUFFER_LEN] ;
-       SNDFILE         *file ;
-       SF_INFO         sfinfo ;
+       SNDFILE         *file ;
+       SF_INFO         sfinfo ;
        double          signal_max, decibels ;
 
        memset (&sfinfo, 0, sizeof (sfinfo)) ;
@@ -267,7 +253,7 @@ info_dump (const char *filename)
 
        if (sfinfo.frames < 100 * 1024 * 1024)
        {       /* Do not use sf_signal_max because it doesn't work for non-seekable files . */
-               signal_max = get_signal_max (file) ;
+               sf_command (file, SFC_CALC_SIGNAL_MAX, &signal_max, sizeof (signal_max)) ;
                decibels = calc_decibels (&sfinfo, signal_max) ;
                printf ("Signal Max  : %g (%4.2f dB)\n", signal_max, decibels) ;
                } ;
@@ -296,8 +282,8 @@ str_of_type (int mode)
 
 static int
 instrument_dump (const char *filename)
-{      SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
        SF_INSTRUMENT inst ;
        int got_inst, k ;
 
@@ -335,8 +321,8 @@ instrument_dump (const char *filename)
 
 static int
 broadcast_dump (const char *filename)
-{      SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
        SF_BROADCAST_INFO_2K bext ;
        double time_ref_sec ;
        int got_bext ;
@@ -391,8 +377,8 @@ broadcast_dump (const char *filename)
 
 static int
 chanmap_dump (const char *filename)
-{      SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
        int * channel_map ;
        int got_chanmap, k ;
 
@@ -465,6 +451,60 @@ chanmap_dump (const char *filename)
        return 0 ;
 } /* chanmap_dump */
 
+static int
+cart_dump (const char *filename)
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
+       SF_CART_INFO_VAR (1024) cart ;
+       int got_cart, k ;
+
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+       memset (&cart, 0, sizeof (cart)) ;
+
+       if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
+       {       printf ("Error : Not able to open input file %s.\n", filename) ;
+               fflush (stdout) ;
+               memset (data, 0, sizeof (data)) ;
+               puts (sf_strerror (NULL)) ;
+               return 1 ;
+               } ;
+
+       got_cart = sf_command (file, SFC_GET_CART_INFO, &cart, sizeof (cart)) ;
+       sf_close (file) ;
+
+       if (got_cart == SF_FALSE)
+       {       printf ("Error : File '%s' does not contain cart information.\n\n", filename) ;
+               return 1 ;
+               } ;
+
+       printf ("Version        : %.*s\n", (int) sizeof (cart.version), cart.version) ;
+       printf ("Title          : %.*s\n", (int) sizeof (cart.title), cart.title) ;
+       printf ("Artist         : %.*s\n", (int) sizeof (cart.artist), cart.artist) ;
+       printf ("Cut id         : %.*s\n", (int) sizeof (cart.cut_id), cart.cut_id) ;
+       printf ("Category       : %.*s\n", (int) sizeof (cart.category), cart.category) ;
+       printf ("Classification : %.*s\n", (int) sizeof (cart.classification), cart.classification) ;
+       printf ("Out cue        : %.*s\n", (int) sizeof (cart.out_cue), cart.out_cue) ;
+       printf ("Start date     : %.*s\n", (int) sizeof (cart.start_date), cart.start_date) ;
+       printf ("Start time     : %.*s\n", (int) sizeof (cart.start_time), cart.start_time) ;
+       printf ("End date       : %.*s\n", (int) sizeof (cart.end_date), cart.end_date) ;
+       printf ("End time       : %.*s\n", (int) sizeof (cart.end_time), cart.end_time) ;
+       printf ("App id         : %.*s\n", (int) sizeof (cart.producer_app_id), cart.producer_app_id) ;
+       printf ("App version    : %.*s\n", (int) sizeof (cart.producer_app_version), cart.producer_app_version) ;
+       printf ("User defined   : %.*s\n", (int) sizeof (cart.user_def), cart.user_def) ;
+       printf ("Level ref.     : %d\n", cart.level_reference) ;
+       printf ("Post timers    :\n") ;
+
+       for (k = 0 ; k < ARRAY_LEN (cart.post_timers) ; k++)
+               if (cart.post_timers [k].usage [0])
+                       printf ("  %d   %.*s    %d\n", k, (int) sizeof (cart.post_timers [k].usage), cart.post_timers [k].usage, cart.post_timers [k].value) ;
+
+       printf ("Reserved       : %.*s\n", (int) sizeof (cart.reserved), cart.reserved) ;
+       printf ("Url            : %.*s\n", (int) sizeof (cart.url), cart.url) ;
+       printf ("Tag text       : %.*s\n", cart.tag_text_size, cart.tag_text) ;
+
+       return 0 ;
+} /* cart_dump */
+
 static void
 total_dump (void)
 {      printf ("========================================\n") ;
index 24d6b9d..4c04443 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2009-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -146,7 +146,7 @@ usage_exit (void)
 {      puts ("\nUsage : sndfile-interleave <input 1> <input 2> ... -o <output file>\n") ;
        puts ("Merge two or more mono files into a single multi-channel file.\n") ;
        printf ("Using %s.\n\n", sf_version_string ()) ;
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
 
@@ -163,7 +163,7 @@ interleave_int (STATE * state)
                        if (read_len < BUFFER_LEN)
                                memset (state->din.i + read_len, 0, sizeof (state->din.i [0]) * (BUFFER_LEN - read_len)) ;
 
-                       for (k = 0 ; k < read_len ; k++)
+                       for (k = 0 ; k < BUFFER_LEN ; k++)
                                state->dout.i [k * state->channels + ch] = state->din.i [k] ;
 
                        max_read_len = MAX (max_read_len, read_len) ;
@@ -189,7 +189,7 @@ interleave_double (STATE * state)
                        if (read_len < BUFFER_LEN)
                                memset (state->din.d + read_len, 0, sizeof (state->din.d [0]) * (BUFFER_LEN - read_len)) ;
 
-                       for (k = 0 ; k < read_len ; k++)
+                       for (k = 0 ; k < BUFFER_LEN ; k++)
                                state->dout.d [k * state->channels + ch] = state->din.d [k] ;
 
                        max_read_len = MAX (max_read_len, read_len) ;
index b77ef4f..fa1522e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2008-2010 George Blood Audio
 **
 ** All rights reserved.
@@ -61,7 +61,7 @@ main (int argc, char *argv [])
        progname = program_name (argv [0]) ;
 
        /* Check if we've been asked for help. */
-       if (argc <= 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0)
+       if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0)
                usage_exit (progname, 0) ;
 
        if (argv [argc - 1][0] != '-')
@@ -77,7 +77,6 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       /* Get the time in case we need it later. */
        memset (&sfinfo, 0, sizeof (sfinfo)) ;
        if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
        {       printf ("Error : Open of file '%s' failed : %s\n\n", filename, sf_strerror (file)) ;
@@ -104,7 +103,7 @@ usage_exit (const char *progname, int exit_code)
 
        puts (
                "    --bext-description    Print the 'bext' description.\n"
-               "    --bext-originator     Print the 'bext; originator info.\n"
+               "    --bext-originator     Print the 'bext' originator info.\n"
                "    --bext-orig-ref       Print the 'bext' origination reference.\n"
                "    --bext-umid           Print the 'bext' UMID.\n"
                "    --bext-orig-date      Print the 'bext' origination date.\n"
@@ -131,20 +130,25 @@ process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char
 {      const char * str ;
        int k, do_all = 0 ;
 
-#define HANDLE_BEXT_ARG(cmd,name,field) \
+#define HANDLE_BEXT_ARG(cmd, name, field) \
                if (do_all || strcmp (argv [k], cmd) == 0) \
                {       printf ("%-20s : %.*s\n", name, (int) sizeof (binfo->field), binfo->field) ; \
                        if (! do_all) \
                                continue ; \
                        } ;
 
-#define HANDLE_STR_ARG(cmd,name,id) \
+#define HANDLE_STR_ARG(cmd, name, id) \
                if (do_all || strcmp (argv [k], cmd) == 0) \
                {       str = sf_get_string (file, id) ; \
                        printf ("%-20s : %s\n", name, str ? str : "") ; \
                        if (! do_all) continue ; \
                        } ;
 
+       if (argc == 0)
+       {       do_all = 1 ;
+               argc = 1 ;
+               } ;
+
        for (k = 0 ; k < argc ; k++)
        {       if (do_all || strcmp (argv [k], "--all") == 0)
                        do_all = 1 ;
index cf0babf..2025638 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2008-2010 George Blood Audio
 **
 ** All rights reserved.
@@ -66,7 +66,7 @@ main (int argc, char *argv [])
        if (argc < 3 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0)
                usage_exit (progname, 0) ;
 
-       /* Clear set all fields of the struct to zero bytes. */
+       /* Set all fields of the struct to zero bytes. */
        memset (&info, 0, sizeof (info)) ;
 
        /* Get the time in case we need it later. */
@@ -87,7 +87,7 @@ main (int argc, char *argv [])
                        continue ;
                        } ;
 
-#define HANDLE_BEXT_ARG(cmd,field) \
+#define HANDLE_BEXT_ARG(cmd, field) \
                if (strcmp (argv [k], cmd) == 0) \
                {       k ++ ; \
                        if (k == argc) missing_param (argv [k - 1]) ; \
@@ -104,7 +104,7 @@ main (int argc, char *argv [])
                HANDLE_BEXT_ARG ("--bext-coding-hist", coding_history) ;
                HANDLE_BEXT_ARG ("--bext-time-ref", time_ref) ;
 
-#define HANDLE_STR_ARG(cmd,field) \
+#define HANDLE_STR_ARG(cmd, field) \
        if (strcmp (argv [k], cmd) == 0) \
        {       k ++ ; \
                if (k == argc) missing_param (argv [k - 1]) ; \
@@ -208,7 +208,7 @@ usage_exit (const char *progname, int exit_code)
                "    --bext-orig-date         Set the 'bext' origination date.\n"
                "    --bext-orig-time         Set the 'bext' origination time.\n"
                "    --bext-coding-hist       Set the 'bext' coding history.\n"
-               "    --bext-time-raf          Set the 'bext' Time ref.\n"
+               "    --bext-time-ref          Set the 'bext' Time ref.\n"
                "\n"
                "    --str-comment            Set the metadata comment.\n"
                "    --str-title              Set the metadata title.\n"
index f2a32d7..8822fc8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
        #include <sys/time.h>
 #endif
 
-#if defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
+#if defined (__ANDROID__)
+
+#elif defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
        #include        <fcntl.h>
        #include        <sys/ioctl.h>
        #include        <sys/soundcard.h>
 
 #elif (defined (__MACH__) && defined (__APPLE__))
-       #include <Carbon.h>
-       #include <CoreAudio/AudioHardware.h>
+       #include <AvailabilityMacros.h>
+       #include <Availability.h>
+
+       #if (OSX_DARWIN_VERSION > 11)
+               /* Includes go here. */
+       #elif (OSX_DARWIN_VERSION == 11)
+               #include <AudioToolbox/AudioToolbox.h>
+       #elif (OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10)
+               #include <Carbon.h>
+               #include <CoreAudio/AudioHardware.h>
+       #endif
 
-#elif defined (HAVE_SNDIO_H)
+#elif HAVE_SNDIO_H
        #include <sndio.h>
 
 #elif (defined (sun) && defined (unix))
@@ -353,7 +364,7 @@ alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels)
 **     Linux/OSS functions for playing a sound.
 */
 
-#if defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
+#if !defined (__ANDROID__) && (defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__))
 
 static int     opensoundsys_open_device (int channels, int srate) ;
 
@@ -444,7 +455,7 @@ opensoundsys_open_device (int channels, int srate)
        if (ioctl (fd, SNDCTL_DSP_SETFMT, &fmt) != 0)
        {       perror ("opensoundsys_open_device : set format ") ;
                exit (1) ;
-               } ;
+               } ;
 
        if (ioctl (fd, SNDCTL_DSP_CHANNELS, &channels) != 0)
        {       perror ("opensoundsys_open_device : channels ") ;
@@ -470,7 +481,174 @@ opensoundsys_open_device (int channels, int srate)
 **     Mac OS X functions for playing a sound.
 */
 
-#if (defined (__MACH__) && defined (__APPLE__)) /* MacOSX */
+#if (OSX_DARWIN_VERSION > 11)
+/* MacOSX 10.8 use a new Audio API. Someone needs to write some code for it. */
+#endif /* OSX_DARWIN_VERSION > 11 */
+
+#if (OSX_DARWIN_VERSION == 11)
+/* MacOSX 10.7 use AudioQueue API */
+
+#define kBytesPerAudioBuffer   (1024 * 8)
+#define kNumberOfAudioBuffers  4
+
+typedef struct
+{      AudioStreamBasicDescription             format ;
+
+       AudioQueueRef           queue ;
+       AudioQueueBufferRef     queueBuffer [kNumberOfAudioBuffers] ;
+
+       UInt32                  buf_size ;
+
+       SNDFILE                 *sndfile ;
+       SF_INFO                 sfinfo ;
+
+       int                             done_playing ;
+} MacOSXAudioData ;
+
+
+static void
+macosx_fill_buffer (MacOSXAudioData *audio_data, AudioQueueBufferRef audio_buffer)
+{      int             size, sample_count, read_count ;
+       short   *buffer ;
+
+       size = audio_buffer->mAudioDataBytesCapacity ;
+       sample_count = size / sizeof (short) ;
+
+       buffer = (short*) audio_buffer->mAudioData ;
+
+       read_count = sf_read_short (audio_data->sndfile, buffer, sample_count) ;
+
+       if (read_count > 0)
+       {       audio_buffer->mAudioDataByteSize = read_count * sizeof (short) ;
+               AudioQueueEnqueueBuffer (audio_data->queue, audio_buffer, 0, NULL) ;
+               }
+       else
+               AudioQueueStop (audio_data->queue, false) ;
+
+} /* macosx_fill_buffer */
+
+
+static void
+macosx_audio_out_callback (void *user_data, AudioQueueRef audio_queue, AudioQueueBufferRef audio_buffer)
+{      MacOSXAudioData *audio_data = (MacOSXAudioData *) user_data ;
+
+       if (audio_data->queue == audio_queue)
+               macosx_fill_buffer (audio_data, audio_buffer) ;
+
+} /* macosx_audio_out_callback */
+
+
+static void
+macosx_audio_out_property_callback (void *user_data, AudioQueueRef audio_queue, AudioQueuePropertyID prop)
+{      MacOSXAudioData *audio_data = (MacOSXAudioData *) user_data ;
+
+       if (prop == kAudioQueueProperty_IsRunning)
+       {       UInt32 is_running = 0 ;
+               UInt32 is_running_size = sizeof (is_running) ;
+
+               AudioQueueGetProperty (audio_queue, kAudioQueueProperty_IsRunning, &is_running, &is_running_size) ;
+
+               if (!is_running)
+               {       audio_data->done_playing = SF_TRUE ;
+                       CFRunLoopStop (CFRunLoopGetCurrent ()) ;
+                       } ;
+               } ;
+} /* macosx_audio_out_property_callback */
+
+
+
+static void
+macosx_play (int argc, char *argv [])
+{      MacOSXAudioData         audio_data ;
+       OSStatus        err ;
+       int             i ;
+       int             k ;
+
+       memset (&audio_data, 0x55, sizeof (audio_data)) ;
+
+       for (k = 1 ; k < argc ; k++)
+       {       memset (&(audio_data.sfinfo), 0, sizeof (audio_data.sfinfo)) ;
+
+               printf ("Playing %s\n", argv [k]) ;
+               if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo))))
+               {       puts (sf_strerror (NULL)) ;
+                       continue ;
+                       } ;
+
+               if (audio_data.sfinfo.channels < 1 || audio_data.sfinfo.channels > 2)
+               {       printf ("Error : channels = %d.\n", audio_data.sfinfo.channels) ;
+                       continue ;
+                       } ;
+
+               /*  fill ASBD */
+               audio_data.format.mSampleRate = audio_data.sfinfo.samplerate ;
+               audio_data.format.mChannelsPerFrame     = audio_data.sfinfo.channels ;
+               audio_data.format.mFormatID                     = kAudioFormatLinearPCM ;
+               audio_data.format.mFormatFlags          = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked ;
+               audio_data.format.mBytesPerPacket       = audio_data.format.mChannelsPerFrame * 2 ;
+               audio_data.format.mFramesPerPacket      = 1 ;
+               audio_data.format.mBytesPerFrame        = audio_data.format.mBytesPerPacket ;
+               audio_data.format.mBitsPerChannel       = 16 ;
+               audio_data.format.mReserved                     = 0 ;
+
+               /* create the queue */
+               if ((err = AudioQueueNewOutput (&(audio_data.format), macosx_audio_out_callback, &audio_data,
+                                       CFRunLoopGetCurrent (), kCFRunLoopCommonModes, 0, &(audio_data.queue))) != noErr)
+               {       printf ("AudioQueueNewOutput failed\n") ;
+                       return ;
+                       } ;
+
+               /*  add property listener */
+               if ((err = AudioQueueAddPropertyListener (audio_data.queue, kAudioQueueProperty_IsRunning, macosx_audio_out_property_callback, &audio_data)) != noErr)
+               {       printf ("AudioQueueAddPropertyListener failed\n") ;
+                       return ;
+                       } ;
+
+               /*  create the buffers */
+               for (i = 0 ; i < kNumberOfAudioBuffers ; i++)
+               {       if ((err = AudioQueueAllocateBuffer (audio_data.queue, kBytesPerAudioBuffer, &audio_data.queueBuffer [i])) != noErr)
+                       {       printf ("AudioQueueAllocateBuffer failed\n") ;
+                               return ;
+                               } ;
+
+                       macosx_fill_buffer (&audio_data, audio_data.queueBuffer [i]) ;
+                       } ;
+
+               audio_data.done_playing = SF_FALSE ;
+
+               /* start queue */
+               if ((err = AudioQueueStart (audio_data.queue, NULL)) != noErr)
+               {       printf ("AudioQueueStart failed\n") ;
+                       return ;
+               } ;
+
+               while (audio_data.done_playing == SF_FALSE)
+                       CFRunLoopRun () ;
+
+               /*  free the buffers */
+               for (i = 0 ; i < kNumberOfAudioBuffers ; i++)
+               {       if ((err = AudioQueueFreeBuffer (audio_data.queue, audio_data.queueBuffer [i])) != noErr)
+                       {       printf ("AudioQueueFreeBuffer failed\n") ;
+                               return ;
+                               } ;
+                       } ;
+
+               /*  free the queue */
+               if ((err = AudioQueueDispose (audio_data.queue, true)) != noErr)
+               {       printf ("AudioQueueDispose failed\n") ;
+                       return ;
+                       } ;
+
+               sf_close (audio_data.sndfile) ;
+               } ;
+
+       return ;
+} /* macosx_play, AudioQueue implementation */
+
+#endif /* OSX_DARWIN_VERSION == 11 */
+
+#if (OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10)
+/* MacOSX 10.6 or earlier, use Carbon and AudioHardware API */
 
 typedef struct
 {      AudioStreamBasicDescription             format ;
@@ -569,7 +747,9 @@ macosx_play (int argc, char *argv [])
 
        /* Base setup completed. Now play files. */
        for (k = 1 ; k < argc ; k++)
-       {       printf ("Playing %s\n", argv [k]) ;
+       {       memset (&(audio_data.sfinfo), 0, sizeof (audio_data.sfinfo)) ;
+
+               printf ("Playing %s\n", argv [k]) ;
                if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo))))
                {       puts (sf_strerror (NULL)) ;
                        continue ;
@@ -630,22 +810,21 @@ macosx_play (int argc, char *argv [])
                } ;
 
        return ;
-} /* macosx_play */
-
-#endif /* MacOSX */
+} /* macosx_play, AudioHardware implementation */
 
+#endif /* OSX_DARWIN_VERSION > 0 && OSX_DARWIN_VERSION <= 10 */
 
 /*------------------------------------------------------------------------------
 **     Win32 functions for playing a sound.
 **
 **     This API sucks. Its needlessly complicated and is *WAY* too loose with
-**     passing pointers arounf in integers and and using char* pointers to
+**     passing pointers around in integers and using char* pointers to
 **  point to data instead of short*. It plain sucks!
 */
 
 #if (OS_IS_WIN32 == 1)
 
-#define        WIN32_BUFFER_LEN        (1<<15)
+#define        WIN32_BUFFER_LEN        (1 << 15)
 
 typedef struct
 {      HWAVEOUT        hwave ;
@@ -701,8 +880,9 @@ win32_audio_out_callback (HWAVEOUT hwave, UINT msg, DWORD_PTR data, DWORD param1
 {      Win32_Audio_Data        *audio_data ;
 
        /* Prevent compiler warnings. */
-       hwave = hwave ;
-       param1 = param2 ;
+       (void) hwave ;
+       (void) param1 ;
+       (void) param2 ;
 
        if (data == 0)
                return ;
@@ -825,16 +1005,16 @@ win32_play (int argc, char *argv [])
 #endif /* Win32 */
 
 /*------------------------------------------------------------------------------
-**     OpenBDS's sndio.
+**     OpenBSD's sndio.
 */
 
-#if defined (HAVE_SNDIO_H)
+#if HAVE_SNDIO_H
 
 static void
 sndio_play (int argc, char *argv [])
 {      struct sio_hdl  *hdl ;
        struct sio_par  par ;
-       short           buffer [BUFFER_LEN] ;
+       short buffer [BUFFER_LEN] ;
        SNDFILE *sndfile ;
        SF_INFO sfinfo ;
        int             k, readcount ;
@@ -980,7 +1160,7 @@ main (int argc, char *argv [])
        if (argc < 2)
        {
                printf ("\nUsage : %s <input sound file>\n\n", program_name (argv [0])) ;
-               printf ("  Using %s.\n\n", sf_version_string ()) ;
+               printf ("Using %s.\n\n", sf_version_string ()) ;
 #if (OS_IS_WIN32 == 1)
                printf ("This is a Unix style command line application which\n"
                                "should be run in a MSDOS box or Command Shell window.\n\n") ;
@@ -991,7 +1171,11 @@ main (int argc, char *argv [])
                return 1 ;
                } ;
 
-#if defined (__linux__)
+#if defined (__ANDROID__)
+       puts ("*** Playing sound not yet supported on Android.") ;
+       puts ("*** Please feel free to submit a patch.") ;
+       return 1 ;
+#elif defined (__linux__)
        #if HAVE_ALSA_ASOUNDLIB_H
                if (access ("/proc/asound/cards", R_OK) == 0)
                        alsa_play (argc, argv) ;
@@ -1000,14 +1184,18 @@ main (int argc, char *argv [])
                opensoundsys_play (argc, argv) ;
 #elif defined (__FreeBSD_kernel__) || defined (__FreeBSD__)
        opensoundsys_play (argc, argv) ;
-#elif (defined (__MACH__) && defined (__APPLE__))
+#elif (defined (__MACH__) && defined (__APPLE__) && OSX_DARWIN_VERSION <= 11)
        macosx_play (argc, argv) ;
-#elif defined HAVE_SNDIO_H
+#elif HAVE_SNDIO_H
        sndio_play (argc, argv) ;
 #elif (defined (sun) && defined (unix))
        solaris_play (argc, argv) ;
 #elif (OS_IS_WIN32 == 1)
        win32_play (argc, argv) ;
+#elif (defined (__MACH__) && defined (__APPLE__) && OSX_DARWIN_VERSION > 11)
+       printf ("OS X 10.8 and later have a new Audio API.\n") ;
+       printf ("Someone needs to write code to use that API.\n") ;
+       return 1 ;
 #elif defined (__BEOS__)
        printf ("This program cannot be compiled on BeOS.\n") ;
        printf ("Instead, compile the file sfplay_beos.cpp.\n") ;
index a39a57a..d6200a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2010-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -79,7 +79,7 @@ usage_exit (const char *progname)
 {      printf ("Usage :\n\n  %s <broken wav file> <fixed w64 file>\n\n", progname) ;
        puts ("Salvages the audio data from WAV files which are more than 4G in length.\n") ;
        printf ("Using %s.\n\n", sf_version_string ()) ;
-       exit (0) ;
+       exit (1) ;
 } /* usage_exit */
 
 static void
@@ -240,7 +240,7 @@ find_data_offset (int fd, int format)
 
        cptr = memchr (buffer, target [0], rlen - slen) ;
        if (cptr && memcmp (cptr, target, slen) == 0)
-               offset = cptr - buffer  ;
+               offset = cptr - buffer ;
        else
        {       printf ("Error : Could not find data offset.\n") ;
                exit (1) ;
index 4d1ed4c..a87d0c4 100644 (file)
@@ -4,8 +4,9 @@ bin_PROGRAMS = sndfile-regtest
 
 noinst_HEADERS = regtest.h
 
-INCLUDES = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS)
+AM_CPPFLAGS = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS)
 
 sndfile_regtest_SOURCES = sndfile-regtest.c database.c checksum.c
 sndfile_regtest_LDADD = $(top_builddir)/src/libsndfile.la $(SQLITE3_LIBS)
 
+CLEANFILES = *~ *.exe
index 9d69251..6f3f969 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -38,22 +92,22 @@ host_triplet = @host@
 target_triplet = @target@
 bin_PROGRAMS = sndfile-regtest$(EXEEXT)
 subdir = regtest
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+       $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
@@ -66,9 +120,22 @@ sndfile_regtest_OBJECTS = $(am_sndfile_regtest_OBJECTS)
 am__DEPENDENCIES_1 =
 sndfile_regtest_DEPENDENCIES = $(top_builddir)/src/libsndfile.la \
        $(am__DEPENDENCIES_1)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
 depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
 am__depfiles_maybe = depfiles
@@ -79,30 +146,48 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(sndfile_regtest_SOURCES)
 DIST_SOURCES = $(sndfile_regtest_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Cfg/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -140,13 +225,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -210,7 +296,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -249,7 +337,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -261,9 +348,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -277,9 +366,10 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 noinst_HEADERS = regtest.h
-INCLUDES = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS)
+AM_CPPFLAGS = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS)
 sndfile_regtest_SOURCES = sndfile-regtest.c database.c checksum.c
 sndfile_regtest_LDADD = $(top_builddir)/src/libsndfile.la $(SQLITE3_LIBS)
+CLEANFILES = *~ *.exe
 all: all-am
 
 .SUFFIXES:
@@ -296,7 +386,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu regtest/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu regtest/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -316,14 +405,19 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
        for p in $$list; do echo "$$p $$p"; done | \
        sed 's/$(EXEEXT)$$//' | \
-       while read p p1; do if test -f $$p || test -f $$p1; \
-         then echo "$$p"; echo "$$p"; else :; fi; \
+       while read p p1; do if test -f $$p \
+        || test -f $$p1 \
+         ; then echo "$$p"; echo "$$p"; else :; fi; \
        done | \
-       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+       sed -e 'p;s,.*/,,;n;h' \
+           -e 's|.*|.|' \
            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
        sed 'N;N;N;s,\n, ,g' | \
        $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -344,7 +438,8 @@ uninstall-binPROGRAMS:
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
        files=`for p in $$list; do echo "$$p"; done | \
          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-             -e 's/$$/$(EXEEXT)/' `; \
+             -e 's/$$/$(EXEEXT)/' \
+       `; \
        test -n "$$list" || exit 0; \
        echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
        cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -357,7 +452,8 @@ clean-binPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-sndfile-regtest$(EXEEXT): $(sndfile_regtest_OBJECTS) $(sndfile_regtest_DEPENDENCIES) 
+
+sndfile-regtest$(EXEEXT): $(sndfile_regtest_OBJECTS) $(sndfile_regtest_DEPENDENCIES) $(EXTRA_sndfile_regtest_DEPENDENCIES) 
        @rm -f sndfile-regtest$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sndfile_regtest_OBJECTS) $(sndfile_regtest_LDADD) $(LIBS)
 
@@ -374,26 +470,23 @@ distclean-compile:
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -401,26 +494,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -432,15 +514,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -449,6 +527,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -500,13 +593,19 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -587,19 +686,21 @@ uninstall-am: uninstall-binPROGRAMS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-       clean-generic clean-libtool ctags distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-binPROGRAMS install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-       pdf pdf-am ps ps-am tags uninstall uninstall-am \
-       uninstall-binPROGRAMS
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+       clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-binPROGRAMS \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/src/ALAC/ALACAudioTypes.h b/src/ALAC/ALACAudioTypes.h
new file mode 100644 (file)
index 0000000..52d3f44
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           ALACAudioTypes.h
+*/
+
+#ifndef ALACAUDIOTYPES_H
+#define ALACAUDIOTYPES_H
+
+/* Force these Mac OS specific things to zero. */
+#define PRAGMA_STRUCT_ALIGN 0
+#define PRAGMA_STRUCT_PACKPUSH 0
+#define PRAGMA_STRUCT_PACK 0
+#define PRAGMA_ONCE 0
+#define PRAGMA_MARK 0
+
+
+#if PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include "sfendian.h"
+
+#if CPU_IS_BIG_ENDIAN == 1
+#define TARGET_RT_BIG_ENDIAN 1
+#else
+#define TARGET_RT_BIG_ENDIAN 0
+#endif
+
+#define kChannelAtomSize 12
+
+enum
+{
+       kALAC_UnimplementedError        = -4,
+       kALAC_FileNotFoundError         = -43,
+       kALAC_ParamError                        = -50,
+       kALAC_MemFullError                      = -108,
+       fALAC_FrameLengthError          = -666,
+
+       /* Add for libsndfile */
+       kALAC_BadBitWidth                       = -0x100000,
+       kALAC_IncompatibleVersion       = -0x100001,
+       kALAC_BadSpecificConfigSize     = -0x100002,
+       kALAC_ZeroChannelCount          = -0x100003,
+       kALAC_NumSamplesTooBig          = -0x100004,
+       kALAC_UnsupportedElement        = -0x100005,
+} ;
+
+enum
+{
+       kALACFormatAppleLossless = MAKE_MARKER ('a', 'l', 'a', 'c'),
+       kALACFormatLinearPCM = MAKE_MARKER ('l', 'p', 'c', 'm')
+} ;
+
+enum
+{
+       kALACMaxChannels                        = 8,
+       kALACMaxEscapeHeaderBytes       = 8,
+       kALACMaxSearches                        = 16,
+       kALACMaxCoefs                           = 16,
+       kALACDefaultFramesPerPacket = 4096
+} ;
+
+typedef uint32_t ALACChannelLayoutTag ;
+
+enum
+{
+       kALACFormatFlagIsFloat                                  = (1 << 0),     // 0x1
+       kALACFormatFlagIsBigEndian                              = (1 << 1),     // 0x2
+       kALACFormatFlagIsSignedInteger                  = (1 << 2),     // 0x4
+       kALACFormatFlagIsPacked                                 = (1 << 3),     // 0x8
+       kALACFormatFlagIsAlignedHigh                    = (1 << 4),     // 0x10
+} ;
+
+enum
+{
+#if TARGET_RT_BIG_ENDIAN
+       kALACFormatFlagsNativeEndian    = kALACFormatFlagIsBigEndian
+#else
+       kALACFormatFlagsNativeEndian    = 0
+#endif
+} ;
+
+// this is required to be an IEEE 64bit float
+typedef double alac_float64_t ;
+
+// These are the Channel Layout Tags used in the Channel Layout Info portion of the ALAC magic cookie
+enum
+{      kALACChannelLayoutTag_Mono                      = (100 << 16) | 1,      // C
+       kALACChannelLayoutTag_Stereo            = (101 << 16) | 2,      // L R
+       kALACChannelLayoutTag_MPEG_3_0_B        = (113 << 16) | 3,      // C L R
+       kALACChannelLayoutTag_MPEG_4_0_B        = (116 << 16) | 4,      // C L R Cs
+       kALACChannelLayoutTag_MPEG_5_0_D        = (120 << 16) | 5,      // C L R Ls Rs
+       kALACChannelLayoutTag_MPEG_5_1_D        = (124 << 16) | 6,      // C L R Ls Rs LFE
+       kALACChannelLayoutTag_AAC_6_1           = (142 << 16) | 7,      // C L R Ls Rs Cs LFE
+       kALACChannelLayoutTag_MPEG_7_1_B        = (127 << 16) | 8       // C Lc Rc L R Ls Rs LFE        (doc: IS-13818-7 MPEG2-AAC)
+} ;
+
+// ALAC currently only utilizes these channels layouts. There is a one for one correspondance between a
+// given number of channels and one of these layout tags
+static const ALACChannelLayoutTag      ALACChannelLayoutTags [kALACMaxChannels] =
+{
+       kALACChannelLayoutTag_Mono,                     // C
+       kALACChannelLayoutTag_Stereo,           // L R
+       kALACChannelLayoutTag_MPEG_3_0_B,       // C L R
+       kALACChannelLayoutTag_MPEG_4_0_B,       // C L R Cs
+       kALACChannelLayoutTag_MPEG_5_0_D,       // C L R Ls Rs
+       kALACChannelLayoutTag_MPEG_5_1_D,       // C L R Ls Rs LFE
+       kALACChannelLayoutTag_AAC_6_1,          // C L R Ls Rs Cs LFE
+       kALACChannelLayoutTag_MPEG_7_1_B        // C Lc Rc L R Ls Rs LFE        (doc: IS-13818-7 MPEG2-AAC)
+} ;
+
+// AudioChannelLayout from CoreAudioTypes.h. We never need the AudioChannelDescription so we remove it
+struct ALACAudioChannelLayout
+{      ALACChannelLayoutTag            mChannelLayoutTag ;
+       uint32_t                                        mChannelBitmap ;
+       uint32_t                                        mNumberChannelDescriptions ;
+} ;
+typedef struct ALACAudioChannelLayout ALACAudioChannelLayout ;
+
+struct AudioFormatDescription
+{
+       alac_float64_t mSampleRate ;
+       uint32_t mFormatID ;
+       uint32_t mFormatFlags ;
+       uint32_t mBytesPerPacket ;
+       uint32_t mFramesPerPacket ;
+       uint32_t mBytesPerFrame ;
+       uint32_t mChannelsPerFrame ;
+       uint32_t mBitsPerChannel ;
+       uint32_t mReserved ;
+} ;
+typedef struct AudioFormatDescription AudioFormatDescription ;
+
+/* Lossless Definitions */
+
+enum
+{
+       kALACCodecFormat                = MAKE_MARKER ('a', 'l', 'a', 'c'),
+       kALACVersion                    = 0,
+       kALACCompatibleVersion  = kALACVersion,
+       kALACDefaultFrameSize   = 4096
+} ;
+
+// note: this struct is wrapped in an 'alac' atom in the sample description extension area
+// note: in QT movies, it will be further wrapped in a 'wave' atom surrounded by 'frma' and 'term' atoms
+typedef struct ALACSpecificConfig
+{
+       uint32_t                                frameLength ;
+       uint8_t                                 compatibleVersion ;
+       uint8_t                                 bitDepth ;                                                      // max 32
+       uint8_t                                 pb ;                                                                    // 0 <= pb <= 255
+       uint8_t                                 mb ;
+       uint8_t                                 kb ;
+       uint8_t                                 numChannels ;
+       uint16_t                                maxRun ;
+       uint32_t                                maxFrameBytes ;
+       uint32_t                                avgBitRate ;
+       uint32_t                                sampleRate ;
+
+} ALACSpecificConfig ;
+
+
+// The AudioChannelLayout atom type is not exposed yet so define it here
+enum
+{
+       AudioChannelLayoutAID = MAKE_MARKER ('c', 'h', 'a', 'n')
+} ;
+
+#if PRAGMA_STRUCT_ALIGN
+       #pragma options align = reset
+#elif PRAGMA_STRUCT_PACKPUSH
+       #pragma pack (pop)
+#elif PRAGMA_STRUCT_PACK
+       #pragma pack ()
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ALACAUDIOTYPES_H */
diff --git a/src/ALAC/ALACBitUtilities.c b/src/ALAC/ALACBitUtilities.c
new file mode 100644 (file)
index 0000000..d861be4
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*=============================================================================
+       File:           ALACBitUtilities.c
+
+       $NoKeywords: $
+=============================================================================*/
+
+#include <stdio.h>
+#include "ALACBitUtilities.h"
+
+#define PRAGMA_MARK 0
+
+// BitBufferInit
+//
+void BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize)
+{
+       bits->cur               = buffer ;
+       bits->end               = bits->cur + byteSize ;
+       bits->bitIndex  = 0 ;
+       bits->byteSize  = byteSize ;
+}
+
+// BitBufferRead
+//
+uint32_t BitBufferRead (BitBuffer * bits, uint8_t numBits)
+{
+       uint32_t                returnBits ;
+
+       //Assert (numBits <= 16) ;
+
+       returnBits = ((uint32_t) bits->cur [0] << 16) | ((uint32_t) bits->cur [1] << 8) | ((uint32_t) bits->cur [2]) ;
+       returnBits = returnBits << bits->bitIndex ;
+       returnBits &= 0x00FFFFFF ;
+
+       bits->bitIndex += numBits ;
+
+       returnBits = returnBits >> (24 - numBits) ;
+
+       bits->cur               += (bits->bitIndex >> 3) ;
+       bits->bitIndex  &= 7 ;
+
+       //Assert (bits->cur <= bits->end) ;
+
+       return returnBits ;
+}
+
+// BitBufferReadSmall
+//
+// Reads up to 8 bits
+uint8_t BitBufferReadSmall (BitBuffer * bits, uint8_t numBits)
+{
+       uint16_t                returnBits ;
+
+       //Assert (numBits <= 8) ;
+
+       returnBits = (bits->cur [0] << 8) | bits->cur [1] ;
+       returnBits = returnBits << bits->bitIndex ;
+
+       bits->bitIndex += numBits ;
+
+       returnBits = returnBits >> (16 - numBits) ;
+
+       bits->cur               += (bits->bitIndex >> 3) ;
+       bits->bitIndex  &= 7 ;
+
+       //Assert (bits->cur <= bits->end) ;
+
+       return (uint8_t) returnBits ;
+}
+
+// BitBufferReadOne
+//
+// Reads one byte
+uint8_t BitBufferReadOne (BitBuffer * bits)
+{
+       uint8_t         returnBits ;
+
+       returnBits = (bits->cur [0] >> (7 - bits->bitIndex)) & 1 ;
+
+       bits->bitIndex++ ;
+
+       bits->cur               += (bits->bitIndex >> 3) ;
+       bits->bitIndex  &= 7 ;
+
+       //Assert (bits->cur <= bits->end) ;
+
+       return returnBits ;
+}
+
+// BitBufferPeek
+//
+uint32_t BitBufferPeek (BitBuffer * bits, uint8_t numBits)
+{
+       return ((((((uint32_t) bits->cur [0] << 16) | ((uint32_t) bits->cur [1] << 8) |
+                       ((uint32_t) bits->cur [2])) << bits->bitIndex) & 0x00FFFFFF) >> (24 - numBits)) ;
+}
+
+// BitBufferPeekOne
+//
+uint32_t BitBufferPeekOne (BitBuffer * bits)
+{
+       return ((bits->cur [0] >> (7 - bits->bitIndex)) & 1) ;
+}
+
+// BitBufferUnpackBERSize
+//
+uint32_t BitBufferUnpackBERSize (BitBuffer * bits)
+{
+       uint32_t                size ;
+       uint8_t         tmp ;
+
+       for (size = 0, tmp = 0x80u ; tmp &= 0x80u ; size = (size << 7u) | (tmp & 0x7fu))
+               tmp = (uint8_t) BitBufferReadSmall (bits, 8) ;
+
+       return size ;
+}
+
+// BitBufferGetPosition
+//
+uint32_t BitBufferGetPosition (BitBuffer * bits)
+{
+       uint8_t *               begin ;
+
+       begin = bits->end - bits->byteSize ;
+
+       return ((uint32_t) (bits->cur - begin) * 8) + bits->bitIndex ;
+}
+
+// BitBufferByteAlign
+//
+void BitBufferByteAlign (BitBuffer * bits, int32_t addZeros)
+{
+       // align bit buffer to next byte boundary, writing zeros if requested
+       if (bits->bitIndex == 0)
+               return ;
+
+       if (addZeros)
+               BitBufferWrite (bits, 0, 8 - bits->bitIndex) ;
+       else
+               BitBufferAdvance (bits, 8 - bits->bitIndex) ;
+}
+
+// BitBufferAdvance
+//
+void BitBufferAdvance (BitBuffer * bits, uint32_t numBits)
+{
+       if (numBits)
+       {
+               bits->bitIndex += numBits ;
+               bits->cur += (bits->bitIndex >> 3) ;
+               bits->bitIndex &= 7 ;
+       }
+}
+
+// BitBufferRewind
+//
+void BitBufferRewind (BitBuffer * bits, uint32_t numBits)
+{
+       uint32_t        numBytes ;
+
+       if (numBits == 0)
+               return ;
+
+       if (bits->bitIndex >= numBits)
+       {
+               bits->bitIndex -= numBits ;
+               return ;
+       }
+
+       numBits -= bits->bitIndex ;
+       bits->bitIndex = 0 ;
+
+       numBytes        = numBits / 8 ;
+       numBits         = numBits % 8 ;
+
+       bits->cur -= numBytes ;
+
+       if (numBits > 0)
+       {
+               bits->bitIndex = 8 - numBits ;
+               bits->cur-- ;
+       }
+
+       if (bits->cur < (bits->end - bits->byteSize))
+       {
+               //DebugCMsg ("BitBufferRewind: Rewound too far.") ;
+
+               bits->cur               = (bits->end - bits->byteSize) ;
+               bits->bitIndex  = 0 ;
+       }
+}
+
+// BitBufferWrite
+//
+void BitBufferWrite (BitBuffer * bits, uint32_t bitValues, uint32_t numBits)
+{
+       uint32_t                                invBitIndex ;
+
+       RequireAction (bits != NULL, return ;) ;
+       RequireActionSilent (numBits > 0, return ;) ;
+
+       invBitIndex = 8 - bits->bitIndex ;
+
+       while (numBits > 0)
+       {
+               uint32_t                tmp ;
+               uint8_t         shift ;
+               uint8_t         mask ;
+               uint32_t                curNum ;
+
+               curNum = MIN (invBitIndex, numBits) ;
+
+               tmp = bitValues >> (numBits - curNum) ;
+
+               shift = (uint8_t) (invBitIndex - curNum) ;
+               mask = 0xffu >> (8 - curNum) ;          // must be done in two steps to avoid compiler sequencing ambiguity
+               mask <<= shift ;
+
+               bits->cur [0] = (bits->cur [0] & ~mask) | (((uint8_t) tmp << shift) & mask) ;
+               numBits -= curNum ;
+
+               // increment to next byte if need be
+               invBitIndex -= curNum ;
+               if (invBitIndex == 0)
+               {
+                       invBitIndex = 8 ;
+                       bits->cur++ ;
+               }
+       }
+
+       bits->bitIndex = 8 - invBitIndex ;
+}
+
+void   BitBufferReset (BitBuffer * bits)
+//void BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize)
+{
+       bits->cur = bits->end - bits->byteSize ;
+       bits->bitIndex = 0 ;
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
diff --git a/src/ALAC/ALACBitUtilities.h b/src/ALAC/ALACBitUtilities.h
new file mode 100644 (file)
index 0000000..97080cd
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*=============================================================================
+       File:           ALACBitUtilities.h
+
+       $NoKeywords: $
+=============================================================================*/
+
+#ifndef __ALACBITUTILITIES_H
+#define __ALACBITUTILITIES_H
+
+#include <stdint.h>
+
+#ifndef MIN
+#define MIN(x, y)                      ((x) < (y) ? (x) : (y))
+#endif // MIN
+#ifndef MAX
+#define MAX(x, y)                      ((x) > (y) ? (x) : (y))
+#endif // MAX
+
+#define RequireAction(condition, action)               if (! (condition)) { action }
+#define RequireActionSilent(condition, action) if (! (condition)) { action }
+#define RequireNoErr(condition, action)                        if (condition) { action }
+
+enum
+{
+       ALAC_noErr = 0
+} ;
+
+
+typedef enum
+{      ID_SCE = 0,                                             /* Single Channel Element   */
+       ID_CPE = 1,                                             /* Channel Pair Element  */
+       ID_CCE = 2,                                             /* Coupling Channel Element */
+       ID_LFE = 3,                                             /* LFE Channel Element    */
+       ID_DSE = 4,                                             /* not yet supported            */
+       ID_PCE = 5,
+       ID_FIL = 6,
+       ID_END = 7
+} ELEMENT_TYPE ;
+
+// types
+typedef struct BitBuffer
+{
+       uint8_t *               cur ;
+       uint8_t *               end ;
+       uint32_t                bitIndex ;
+       uint32_t                byteSize ;
+
+} BitBuffer ;
+
+/*
+       BitBuffer routines
+       - these routines take a fixed size buffer and read/write to it
+       - bounds checking must be done by the client
+*/
+void           BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize) ;
+uint32_t       BitBufferRead (BitBuffer * bits, uint8_t numBits) ;     // note: cannot read more than 16 bits at a time
+uint8_t                BitBufferReadSmall (BitBuffer * bits, uint8_t numBits) ;
+uint8_t                BitBufferReadOne (BitBuffer * bits) ;
+uint32_t       BitBufferPeek (BitBuffer * bits, uint8_t numBits) ;             // note: cannot read more than 16 bits at a time
+uint32_t       BitBufferPeekOne (BitBuffer * bits) ;
+uint32_t       BitBufferUnpackBERSize (BitBuffer * bits) ;
+uint32_t       BitBufferGetPosition (BitBuffer * bits) ;
+void           BitBufferByteAlign (BitBuffer * bits, int32_t addZeros) ;
+void           BitBufferAdvance (BitBuffer * bits, uint32_t numBits) ;
+void           BitBufferRewind (BitBuffer * bits, uint32_t numBits) ;
+void           BitBufferWrite (BitBuffer * bits, uint32_t value, uint32_t numBits) ;
+void           BitBufferReset (BitBuffer * bits) ;
+
+#endif /* __BITUTILITIES_H */
diff --git a/src/ALAC/EndianPortable.h b/src/ALAC/EndianPortable.h
new file mode 100644 (file)
index 0000000..aa1f449
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+** Copyright (C) 2013-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+//
+//  EndianPortable.h
+//
+//  Copyright 2011 Apple Inc. All rights reserved.
+//
+
+#ifndef _EndianPortable_h
+#define _EndianPortable_h
+
+#include <sfendian.h>
+
+#define Swap16NtoB(x)  H2BE_16 (x)
+#define Swap16BtoN(x)  BE2H_16 (x)
+
+#define Swap32NtoB(x)  H2BE_32 (x)
+#define Swap32BtoN(x)  BE2H_32 (x)
+
+#endif
diff --git a/src/ALAC/ag_dec.c b/src/ALAC/ag_dec.c
new file mode 100644 (file)
index 0000000..8fe9c12
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           ag_dec.c
+
+       Contains:   Adaptive Golomb decode routines.
+
+       Copyright:      (c) 2001-2011 Apple, Inc.
+*/
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "aglib.h"
+#include "ALACBitUtilities.h"
+#include "ALACAudioTypes.h"
+#include "shift.h"
+
+#define CODE_TO_LONG_MAXBITS   32
+#define N_MAX_MEAN_CLAMP               0xffff
+#define N_MEAN_CLAMP_VAL               0xffff
+#define REPORT_VAL                             40
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+/*     And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this
+       to help the compiler out.   In many cases this required manual inlining or a macro.  Sorry
+       if it is ugly but the performance gains are well worth it.
+       - WSK 5/19/04
+*/
+
+void set_standard_ag_params (AGParamRecPtr params, uint32_t fullwidth, uint32_t sectorwidth)
+{
+       /* Use
+               fullwidth = sectorwidth = numOfSamples, for analog 1-dimensional type-short data,
+               but use
+               fullwidth = full image width, sectorwidth = sector (patch) width
+               for such as image (2-dim.) data.
+       */
+       set_ag_params (params, MB0, PB0, KB0, fullwidth, sectorwidth, MAX_RUN_DEFAULT) ;
+}
+
+void set_ag_params (AGParamRecPtr params, uint32_t m, uint32_t p, uint32_t k, uint32_t f, uint32_t s, uint32_t maxrun)
+{
+       params->mb = params->mb0 = m ;
+       params->pb = p ;
+       params->kb = k ;
+       params->wb = (1u << params->kb) - 1 ;
+       params->qb = QB-params->pb ;
+       params->fw = f ;
+       params->sw = s ;
+       params->maxrun = maxrun ;
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+
+// note: implementing this with some kind of "count leading zeros" assembly is a big performance win
+static inline int32_t lead (int32_t m)
+{
+       long j ;
+       unsigned long c = (1ul << 31) ;
+
+       for (j = 0 ; j < 32 ; j++)
+       {
+               if ((c & m) != 0)
+                       break ;
+               c >>= 1 ;
+       }
+       return j ;
+}
+
+#define arithmin(a, b) ((a) < (b) ? (a) : (b))
+
+static inline int32_t ALWAYS_INLINE lg3a (int32_t x)
+{
+       int32_t result ;
+
+       x += 3 ;
+       result = lead (x) ;
+
+       return 31 - result ;
+}
+
+static inline uint32_t ALWAYS_INLINE read32bit (uint8_t * buffer)
+{
+       // embedded CPUs typically can't read unaligned 32-bit words so just read the bytes
+       uint32_t                value ;
+
+       value = ((uint32_t) buffer [0] << 24) | ((uint32_t) buffer [1] << 16) |
+                               ((uint32_t) buffer [2] << 8) | (uint32_t) buffer [3] ;
+       return value ;
+
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+#define get_next_fromlong(inlong, suff)                ((inlong) >> (32 - (suff)))
+
+
+static inline uint32_t ALWAYS_INLINE
+getstreambits (uint8_t *in, int32_t bitoffset, int32_t numbits)
+{
+       uint32_t        load1, load2 ;
+       uint32_t        byteoffset = bitoffset / 8 ;
+       uint32_t        result ;
+
+       //Assert (numbits <= 32) ;
+
+       load1 = read32bit (in + byteoffset) ;
+
+       if ((numbits + (bitoffset & 0x7)) > 32)
+       {
+               int32_t load2shift ;
+
+               result = load1 << (bitoffset & 0x7) ;
+               load2 = (uint32_t) in [byteoffset + 4] ;
+               load2shift = (8 - (numbits + (bitoffset & 0x7) - 32)) ;
+               load2 >>= load2shift ;
+               result >>= (32 - numbits) ;
+               result |= load2 ;
+       }
+       else
+       {
+               result = load1 >> (32 - numbits - (bitoffset & 7)) ;
+       }
+
+       // a shift of >= "the number of bits in the type of the value being shifted" results in undefined
+       // behavior so don't try to shift by 32
+       if (numbits != (sizeof (result) * 8))
+               result &= ~ (0xfffffffful << numbits) ;
+
+       return result ;
+}
+
+
+static inline int32_t dyn_get (unsigned char *in, uint32_t *bitPos, uint32_t m, uint32_t k)
+{
+       uint32_t        tempbits = *bitPos ;
+       uint32_t                result ;
+       uint32_t                pre = 0, v ;
+       uint32_t                streamlong ;
+
+       streamlong = read32bit (in + (tempbits >> 3)) ;
+       streamlong <<= (tempbits & 7) ;
+
+       /* find the number of bits in the prefix */
+       {
+               uint32_t        notI = ~streamlong ;
+               pre = lead (notI) ;
+       }
+
+       if (pre >= MAX_PREFIX_16)
+       {
+               pre = MAX_PREFIX_16 ;
+               tempbits += pre ;
+               streamlong <<= pre ;
+               result = get_next_fromlong (streamlong, MAX_DATATYPE_BITS_16) ;
+               tempbits += MAX_DATATYPE_BITS_16 ;
+
+       }
+       else
+       {
+               // all of the bits must fit within the long we have loaded
+               //Assert (pre+1+k <= 32) ;
+
+               tempbits += pre ;
+               tempbits += 1 ;
+               streamlong <<= pre + 1 ;
+               v = get_next_fromlong (streamlong, k) ;
+               tempbits += k ;
+
+               result = pre*m + v-1 ;
+
+               if (v < 2)
+               {
+                       result -= (v-1) ;
+                       tempbits -= 1 ;
+               }
+       }
+
+       *bitPos = tempbits ;
+       return result ;
+}
+
+
+static inline int32_t dyn_get_32bit (uint8_t * in, uint32_t * bitPos, int32_t m, int32_t k, int32_t maxbits)
+{
+       uint32_t        tempbits = *bitPos ;
+       uint32_t                v ;
+       uint32_t                streamlong ;
+       uint32_t                result ;
+
+       streamlong = read32bit (in + (tempbits >> 3)) ;
+       streamlong <<= (tempbits & 7) ;
+
+       /* find the number of bits in the prefix */
+       {
+               uint32_t notI = ~streamlong ;
+               result = lead (notI) ;
+       }
+
+       if (result >= MAX_PREFIX_32)
+       {
+               result = getstreambits (in, tempbits+MAX_PREFIX_32, maxbits) ;
+               tempbits += MAX_PREFIX_32 + maxbits ;
+       }
+       else
+       {
+               /* all of the bits must fit within the long we have loaded*/
+               //Assert (k<=14) ;
+               //Assert (result<MAX_PREFIX_32) ;
+               //Assert (result+1+k <= 32) ;
+
+               tempbits += result ;
+               tempbits += 1 ;
+
+               if (k != 1)
+               {
+                       streamlong <<= result + 1 ;
+                       v = get_next_fromlong (streamlong, k) ;
+                       tempbits += k ;
+                       tempbits -= 1 ;
+                       result = result*m ;
+
+                       if (v >= 2)
+                       {
+                               result += (v-1) ;
+                               tempbits += 1 ;
+                       }
+               }
+       }
+
+       *bitPos = tempbits ;
+
+       return result ;
+}
+
+int32_t dyn_decomp (AGParamRecPtr params, BitBuffer * bitstream, int32_t * pc, int32_t numSamples, int32_t maxSize, uint32_t * outNumBits)
+{
+       uint8_t                 *in ;
+       int32_t                 *outPtr = pc ;
+       uint32_t        bitPos, startPos, maxPos ;
+       uint32_t                j, m, k, n, c, mz ;
+       int32_t                 del, zmode ;
+       uint32_t        mb ;
+       uint32_t        pb_local = params->pb ;
+       uint32_t        kb_local = params->kb ;
+       uint32_t        wb_local = params->wb ;
+       int32_t                         status ;
+
+       RequireAction ((bitstream != NULL) && (pc != NULL) && (outNumBits != NULL), return kALAC_ParamError ;) ;
+       *outNumBits = 0 ;
+
+       in = bitstream->cur ;
+       startPos = bitstream->bitIndex ;
+       maxPos = bitstream->byteSize * 8 ;
+       bitPos = startPos ;
+
+       mb = params->mb0 ;
+       zmode = 0 ;
+
+       c = 0 ;
+       status = ALAC_noErr ;
+
+       while (c < (uint32_t) numSamples)
+       {
+               // bail if we've run off the end of the buffer
+               RequireAction (bitPos < maxPos, status = kALAC_ParamError ; goto Exit ;) ;
+
+               m = (mb) >> QBSHIFT ;
+               k = lg3a (m) ;
+
+               k = arithmin (k, kb_local) ;
+               m = (1 << k) - 1 ;
+
+               n = dyn_get_32bit (in, &bitPos, m, k, maxSize) ;
+
+               // least significant bit is sign bit
+               {
+                       uint32_t        ndecode = n + zmode ;
+                       int32_t         multiplier = - (int) (ndecode & 1) ;
+
+                       multiplier |= 1 ;
+                       del = ((ndecode+1) >> 1) * (multiplier) ;
+               }
+
+               *outPtr++ = del ;
+
+               c++ ;
+
+               mb = pb_local * (n + zmode) + mb - ((pb_local * mb) >> QBSHIFT) ;
+
+               // update mean tracking
+               if (n > N_MAX_MEAN_CLAMP)
+                       mb = N_MEAN_CLAMP_VAL ;
+
+               zmode = 0 ;
+
+               if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples))
+               {
+                       zmode = 1 ;
+                       k = lead (mb) - BITOFF + ((mb + MOFF) >> MDENSHIFT) ;
+                       mz = ((1 << k) - 1) & wb_local ;
+
+                       n = dyn_get (in, &bitPos, mz, k) ;
+
+                       RequireAction (c+n <= (uint32_t) numSamples, status = kALAC_ParamError ; goto Exit ;) ;
+
+                       for (j = 0 ; j < n ; j++)
+                       {
+                               *outPtr++ = 0 ;
+                               ++c ;
+                       }
+
+                       if (n >= 65535)
+                               zmode = 0 ;
+
+                       mb = 0 ;
+               }
+       }
+
+Exit:
+       *outNumBits = (bitPos - startPos) ;
+       BitBufferAdvance (bitstream, *outNumBits) ;
+       RequireAction (bitstream->cur <= bitstream->end, status = kALAC_ParamError ;) ;
+
+       return status ;
+}
diff --git a/src/ALAC/ag_enc.c b/src/ALAC/ag_enc.c
new file mode 100644 (file)
index 0000000..00e947c
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           ag_enc.c
+
+       Contains:   Adaptive Golomb encode routines.
+
+       Copyright:      (c) 2001-2011 Apple, Inc.
+*/
+
+#include "aglib.h"
+#include "ALACBitUtilities.h"
+#include "EndianPortable.h"
+#include "ALACAudioTypes.h"
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define CODE_TO_LONG_MAXBITS   32
+#define N_MAX_MEAN_CLAMP               0xffff
+#define N_MEAN_CLAMP_VAL               0xffff
+#define REPORT_VAL                             40
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+
+/*     And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this
+       to help the compiler out.   In many cases this required manual inlining or a macro.  Sorry
+       if it is ugly but the performance gains are well worth it.
+       - WSK 5/19/04
+*/
+
+// note: implementing this with some kind of "count leading zeros" assembly is a big performance win
+static inline int32_t lead (int32_t m)
+{
+       long j ;
+       unsigned long c = (1ul << 31) ;
+
+       for (j = 0 ; j < 32 ; j++)
+       {
+               if ((c & m) != 0)
+                       break ;
+               c >>= 1 ;
+       }
+       return j ;
+}
+
+#define arithmin (a, b) ((a) < (b) ? (a) : (b))
+
+static inline int32_t ALWAYS_INLINE lg3a (int32_t x)
+{
+       int32_t result ;
+
+       x += 3 ;
+       result = lead (x) ;
+
+       return 31 - result ;
+}
+
+static inline int32_t ALWAYS_INLINE abs_func (int32_t a)
+{
+       // note: the CW PPC intrinsic __abs () turns into these instructions so no need to try and use it
+       int32_t isneg = a >> 31 ;
+       int32_t xorval = a ^ isneg ;
+       int32_t result = xorval-isneg ;
+
+       return result ;
+}
+
+static inline uint32_t ALWAYS_INLINE read32bit (uint8_t * buffer)
+{
+       // embedded CPUs typically can't read unaligned 32-bit words so just read the bytes
+       uint32_t                value ;
+
+       value = ((uint32_t) buffer [0] << 24) | ((uint32_t) buffer [1] << 16) |
+                               ((uint32_t) buffer [2] << 8) | (uint32_t) buffer [3] ;
+       return value ;
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+static inline int32_t dyn_code (int32_t m, int32_t k, int32_t n, uint32_t *outNumBits)
+{
+       uint32_t        divx, mod, de ;
+       uint32_t        numBits ;
+       uint32_t        value ;
+
+       // Assert (n >= 0) ;
+
+       divx = n / m ;
+
+       if (divx >= MAX_PREFIX_16)
+       {
+               numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16 ;
+               value = (((1 << MAX_PREFIX_16) - 1) << MAX_DATATYPE_BITS_16) + n ;
+       }
+       else
+       {
+               mod = n%m ;
+               de = (mod == 0) ;
+               numBits = divx + k + 1 - de ;
+               value = (((1 << divx) - 1) << (numBits - divx)) + mod + 1 - de ;
+
+               // if coding this way is bigger than doing escape, then do escape
+               if (numBits > MAX_PREFIX_16 + MAX_DATATYPE_BITS_16)
+               {
+                       numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16 ;
+                       value = (((1 << MAX_PREFIX_16) - 1) << MAX_DATATYPE_BITS_16) + n ;
+               }
+       }
+
+       *outNumBits = numBits ;
+
+       return (int32_t) value ;
+}
+
+
+static inline int32_t dyn_code_32bit (int32_t maxbits, uint32_t m, uint32_t k, uint32_t n, uint32_t *outNumBits, uint32_t *outValue, uint32_t *overflow, uint32_t *overflowbits)
+{
+       uint32_t        divx, mod, de ;
+       uint32_t        numBits ;
+       uint32_t        value ;
+       int32_t                 didOverflow = 0 ;
+
+       divx = n / m ;
+
+       if (divx < MAX_PREFIX_32)
+       {
+               mod = n - (m * divx) ;
+
+               de = (mod == 0) ;
+               numBits = divx + k + 1 - de ;
+               value = (((1 << divx) - 1) << (numBits - divx)) + mod + 1 - de ;
+               if (numBits > 25)
+                       goto codeasescape ;
+       }
+       else
+       {
+codeasescape:
+               numBits = MAX_PREFIX_32 ;
+               value = (((1 << MAX_PREFIX_32) - 1)) ;
+               *overflow = n ;
+               *overflowbits = maxbits ;
+               didOverflow = 1 ;
+       }
+
+       *outNumBits = numBits ;
+       *outValue = value ;
+
+       return didOverflow ;
+}
+
+
+static inline void ALWAYS_INLINE dyn_jam_noDeref (unsigned char *out, uint32_t bitPos, uint32_t numBits, uint32_t value)
+{
+       uint32_t        mask ;
+       uint32_t        curr ;
+       uint32_t        shift ;
+
+       //Assert (numBits <= 32) ;
+
+       curr = psf_get_be32 (out, bitPos >> 3) ;
+
+       shift = 32 - (bitPos & 7) - numBits ;
+
+       mask = ~0u >> (32 - numBits) ;          // mask must be created in two steps to avoid compiler sequencing ambiguity
+       mask <<= shift ;
+
+       value = (value << shift) & mask ;
+       value |= curr & ~mask ;
+
+       psf_put_be32 (out, bitPos >> 3, value) ;
+}
+
+
+static inline void ALWAYS_INLINE dyn_jam_noDeref_large (unsigned char *out, uint32_t bitPos, uint32_t numBits, uint32_t value)
+{
+       uint32_t        w ;
+       uint32_t        curr ;
+       uint32_t        mask ;
+       int32_t         shiftvalue = (32 - (bitPos & 7) - numBits) ;
+
+       //Assert (numBits <= 32) ;
+
+       curr = psf_get_be32 (out, bitPos >> 3) ;
+
+       if (shiftvalue < 0)
+       {
+               uint8_t         tailbyte ;
+               uint8_t         *tailptr ;
+
+               w = value >> -shiftvalue ;
+               mask = ~0u >> -shiftvalue ;
+               w |= (curr & ~mask) ;
+
+               tailptr = out + (bitPos >> 3) + 4 ;
+               tailbyte = (value << ((8+shiftvalue))) & 0xff ;
+               *tailptr = (uint8_t) tailbyte ;
+       }
+       else
+       {
+               mask = ~0u >> (32 - numBits) ;
+               mask <<= shiftvalue ;                   // mask must be created in two steps to avoid compiler sequencing ambiguity
+
+               w = (value << shiftvalue) & mask ;
+               w |= curr & ~mask ;
+       }
+
+       psf_put_be32 (out, bitPos >> 3, w) ;
+}
+
+
+int32_t dyn_comp (AGParamRecPtr params, int32_t * pc, BitBuffer * bitstream, int32_t numSamples, int32_t bitSize, uint32_t * outNumBits)
+{
+       unsigned char *         out ;
+       uint32_t                bitPos, startPos ;
+       uint32_t                        m, k, n, c, mz, nz ;
+       uint32_t                numBits ;
+       uint32_t                        value ;
+       int32_t                         del, zmode ;
+       uint32_t                overflow, overflowbits ;
+       int32_t                                 status ;
+
+       // shadow the variables in params so there's not the dereferencing overhead
+       uint32_t                mb, pb, kb, wb ;
+       int32_t                                 rowPos = 0 ;
+       int32_t                                 rowSize = params->sw ;
+       int32_t                                 rowJump = (params->fw) - rowSize ;
+       int32_t *                       inPtr = pc ;
+
+       *outNumBits = 0 ;
+       RequireAction ((bitSize >= 1) && (bitSize <= 32), return kALAC_ParamError ;) ;
+
+       out = bitstream->cur ;
+       startPos = bitstream->bitIndex ;
+       bitPos = startPos ;
+
+       mb = params->mb = params->mb0 ;
+       pb = params->pb ;
+       kb = params->kb ;
+       wb = params->wb ;
+       zmode = 0 ;
+
+       c = 0 ;
+       status = ALAC_noErr ;
+
+       while (c < (uint32_t) numSamples)
+       {
+               m = mb >> QBSHIFT ;
+               k = lg3a (m) ;
+               if (k > kb)
+               {
+                       k = kb ;
+               }
+               m = (1 << k) - 1 ;
+
+               del = *inPtr++ ;
+               rowPos++ ;
+
+               n = (abs_func (del) << 1) - ((del >> 31) & 1) - zmode ;
+               //Assert (32-lead (n) <= bitSize) ;
+
+               if (dyn_code_32bit (bitSize, m, k, n, &numBits, &value, &overflow, &overflowbits))
+               {
+                       dyn_jam_noDeref (out, bitPos, numBits, value) ;
+                       bitPos += numBits ;
+                       dyn_jam_noDeref_large (out, bitPos, overflowbits, overflow) ;
+                       bitPos += overflowbits ;
+               }
+               else
+               {
+                       dyn_jam_noDeref (out, bitPos, numBits, value) ;
+                       bitPos += numBits ;
+               }
+
+               c++ ;
+               if (rowPos >= rowSize)
+               {
+                       rowPos = 0 ;
+                       inPtr += rowJump ;
+               }
+
+               mb = pb * (n + zmode) + mb - ((pb * mb) >> QBSHIFT) ;
+
+               // update mean tracking if it's overflowed
+               if (n > N_MAX_MEAN_CLAMP)
+                       mb = N_MEAN_CLAMP_VAL ;
+
+               zmode = 0 ;
+
+               RequireAction (c <= (uint32_t) numSamples, status = kALAC_ParamError ; goto Exit ;) ;
+
+               if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples))
+               {
+                       zmode = 1 ;
+                       nz = 0 ;
+
+                       while (c < (uint32_t) numSamples && *inPtr == 0)
+                       {
+                               /* Take care of wrap-around globals. */
+                               ++inPtr ;
+                               ++nz ;
+                               ++c ;
+                               if (++rowPos >= rowSize)
+                               {
+                                       rowPos = 0 ;
+                                       inPtr += rowJump ;
+                               }
+
+                               if (nz >= 65535)
+                               {
+                                       zmode = 0 ;
+                                       break ;
+                               }
+                       }
+
+                       k = lead (mb) - BITOFF + ((mb + MOFF) >> MDENSHIFT) ;
+                       mz = ((1 << k) - 1) & wb ;
+
+                       value = dyn_code (mz, k, nz, &numBits) ;
+                       dyn_jam_noDeref (out, bitPos, numBits, value) ;
+                       bitPos += numBits ;
+
+                       mb = 0 ;
+               }
+       }
+
+       *outNumBits = (bitPos - startPos) ;
+       BitBufferAdvance (bitstream, *outNumBits) ;
+
+Exit:
+       return status ;
+}
diff --git a/src/ALAC/aglib.h b/src/ALAC/aglib.h
new file mode 100644 (file)
index 0000000..825c4bd
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           aglib.h
+
+       Copyright:      (C) 2001-2011 Apple, Inc.
+*/
+
+#ifndef AGLIB_H
+#define AGLIB_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define QBSHIFT                9
+#define QB                     (1 << QBSHIFT)
+#define PB0                    40
+#define MB0                    10
+#define KB0                    14
+#define MAX_RUN_DEFAULT 255
+
+#define MMULSHIFT      2
+#define MDENSHIFT      (QBSHIFT - MMULSHIFT - 1)
+#define MOFF           ((1 << (MDENSHIFT - 2)))
+
+#define BITOFF 24
+
+/* Max. prefix of 1's. */
+#define MAX_PREFIX_16                  9
+#define MAX_PREFIX_TOLONG_16   15
+#define MAX_PREFIX_32                  9
+
+/* Max. bits in 16-bit data type */
+#define MAX_DATATYPE_BITS_16   16
+
+typedef struct AGParamRec
+{
+       uint32_t mb, mb0, pb, kb, wb, qb ;
+       uint32_t fw, sw ;
+
+       uint32_t maxrun ;
+
+       // fw = 1, sw = 1 ;
+
+} AGParamRec, *AGParamRecPtr ;
+
+struct BitBuffer ;
+
+void   set_standard_ag_params (AGParamRecPtr params, uint32_t fullwidth, uint32_t sectorwidth) ;
+void   set_ag_params (AGParamRecPtr params, uint32_t m, uint32_t p, uint32_t k, uint32_t f, uint32_t s, uint32_t maxrun) ;
+
+int32_t        dyn_comp (AGParamRecPtr params, int32_t * pc, struct BitBuffer * bitstream, int32_t numSamples, int32_t bitSize, uint32_t * outNumBits) ;
+int32_t        dyn_decomp (AGParamRecPtr params, struct BitBuffer * bitstream, int32_t * pc, int32_t numSamples, int32_t maxSize, uint32_t * outNumBits) ;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //#ifndef AGLIB_H
diff --git a/src/ALAC/alac_codec.h b/src/ALAC/alac_codec.h
new file mode 100644 (file)
index 0000000..c73347d
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           alac_codec.h
+*/
+
+#ifndef ALAC_CODEC_H
+#define ALAC_CODEC_H
+
+#include <stdint.h>
+
+#include "ALACAudioTypes.h"
+
+#define                ALAC_FRAME_LENGTH       4096
+
+struct BitBuffer ;
+
+typedef struct alac_decoder_s
+{
+       // decoding parameters (public for use in the analyzer)
+       ALACSpecificConfig              mConfig ;
+
+       uint16_t                                mActiveElements ;
+
+       // decoding buffers
+       int32_t                         mMixBufferU [ALAC_FRAME_LENGTH] ;
+       int32_t                         mMixBufferV [ALAC_FRAME_LENGTH] ;
+       union
+       {
+               int32_t                 mPredictor [ALAC_FRAME_LENGTH] ;
+               uint16_t                mShiftBuffer [ALAC_FRAME_LENGTH] ;
+       } ;
+       uint32_t                        mNumChannels ;
+} ALAC_DECODER ;
+
+typedef struct alac_encoder_s
+{
+       // ALAC encoder parameters
+       int16_t                 mBitDepth ;
+
+       // encoding state
+       int16_t                 mLastMixRes [kALACMaxChannels] ;
+
+       int32_t                 mFastMode ;
+
+       // encoding buffers
+       int32_t                 mMixBufferU [ALAC_FRAME_LENGTH] ;
+       int32_t                 mMixBufferV [ALAC_FRAME_LENGTH] ;
+       int32_t                 mPredictorU [ALAC_FRAME_LENGTH] ;
+       int32_t                 mPredictorV [ALAC_FRAME_LENGTH] ;
+       uint16_t                mShiftBufferUV [2 * ALAC_FRAME_LENGTH] ;
+       uint8_t                 mWorkBuffer [4 * ALAC_FRAME_LENGTH] ;
+
+       // per-channel coefficients buffers
+       int16_t                 mCoefsU [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs] ;
+       int16_t                 mCoefsV [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs] ;
+
+       // encoding statistics
+       uint32_t                mTotalBytesGenerated ;
+       uint32_t                mAvgBitRate ;
+       uint32_t                mMaxFrameBytes ;
+       uint32_t                mFrameSize ;
+       uint32_t                mMaxOutputBytes ;
+       uint32_t                mNumChannels ;
+       uint32_t                mOutputSampleRate ;
+} ALAC_ENCODER ;
+
+
+int32_t        alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) ;
+int32_t alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize) ;
+
+int32_t        alac_decode (ALAC_DECODER *, struct BitBuffer * bits, int32_t * sampleBuffer,
+                                       uint32_t numSamples, uint32_t * outNumSamples) ;
+
+int32_t        alac_encode (ALAC_ENCODER *p, uint32_t numSamples,
+                                       const int32_t * theReadBuffer, unsigned char * theWriteBuffer,
+                                       uint32_t * ioNumBytes) ;
+
+void alac_set_fastmode (ALAC_ENCODER * p, int32_t fast) ;
+
+uint32_t alac_get_magic_cookie_size (uint32_t inNumChannels) ;
+void   alac_get_magic_cookie (ALAC_ENCODER *p, void * config, uint32_t * ioSize) ;
+void   alac_get_source_format (ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output) ;
+
+#endif
diff --git a/src/ALAC/alac_decoder.c b/src/ALAC/alac_decoder.c
new file mode 100644 (file)
index 0000000..6c124e6
--- /dev/null
@@ -0,0 +1,652 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           ALACDecoder.cpp
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "alac_codec.h"
+
+#include "dplib.h"
+#include "aglib.h"
+#include "matrixlib.h"
+#include "shift.h"
+
+#include "ALACBitUtilities.h"
+#include "EndianPortable.h"
+
+typedef enum
+{      false = 0,
+       true = 1
+} bool ;
+
+// constants/data
+const uint32_t kMaxBitDepth = 32 ;                     // max allowed bit depth is 32
+
+
+// prototypes
+static int32_t alac_fill_element (struct BitBuffer * bits) ;
+static int32_t alac_data_stream_element (struct BitBuffer * bits) ;
+
+static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride) ;
+
+
+/*
+       Init ()
+       - initialize the decoder with the given configuration
+*/
+int32_t
+alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize)
+{
+       int32_t         status = ALAC_noErr ;
+       ALACSpecificConfig theConfig ;
+       uint8_t * theActualCookie = (uint8_t *) inMagicCookie ;
+       uint32_t theCookieBytesRemaining = inMagicCookieSize ;
+
+       // For historical reasons the decoder needs to be resilient to magic cookies vended by older encoders.
+       // As specified in the ALACMagicCookieDescription.txt document, there may be additional data encapsulating
+       // the ALACSpecificConfig. This would consist of format ('frma') and 'alac' atoms which precede the
+       // ALACSpecificConfig.
+       // See ALACMagicCookieDescription.txt for additional documentation concerning the 'magic cookie'
+
+       // skip format ('frma') atom if present
+       if (theActualCookie [4] == 'f' && theActualCookie [5] == 'r' && theActualCookie [6] == 'm' && theActualCookie [7] == 'a')
+       {
+               theActualCookie += 12 ;
+               theCookieBytesRemaining -= 12 ;
+       }
+
+       // skip 'alac' atom header if present
+       if (theActualCookie [4] == 'a' && theActualCookie [5] == 'l' && theActualCookie [6] == 'a' && theActualCookie [7] == 'c')
+       {
+               theActualCookie += 12 ;
+               theCookieBytesRemaining -= 12 ;
+       }
+
+       // read the ALACSpecificConfig
+       if (theCookieBytesRemaining >= sizeof (ALACSpecificConfig))
+       {
+               theConfig.frameLength = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, frameLength)) ;
+
+               if (theConfig.frameLength > ALAC_FRAME_LENGTH)
+                       return fALAC_FrameLengthError ;
+
+               theConfig.compatibleVersion = theActualCookie [offsetof (ALACSpecificConfig, compatibleVersion)] ;
+               theConfig.bitDepth = theActualCookie [offsetof (ALACSpecificConfig, bitDepth)] ;
+               theConfig.pb = theActualCookie [offsetof (ALACSpecificConfig, pb)] ;
+               theConfig.mb = theActualCookie [offsetof (ALACSpecificConfig, mb)] ;
+               theConfig.kb = theActualCookie [offsetof (ALACSpecificConfig, kb)] ;
+               theConfig.numChannels = theActualCookie [offsetof (ALACSpecificConfig, numChannels)] ;
+               theConfig.maxRun = psf_get_be16 (theActualCookie, offsetof (ALACSpecificConfig, maxRun)) ;
+               theConfig.maxFrameBytes = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, maxFrameBytes)) ;
+               theConfig.avgBitRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, avgBitRate)) ;
+               theConfig.sampleRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, sampleRate)) ;
+
+               p->mConfig = theConfig ;
+               p->mNumChannels = theConfig.numChannels ;
+
+               RequireAction (p->mConfig.compatibleVersion <= kALACVersion, return kALAC_IncompatibleVersion ;) ;
+               RequireAction ((p->mConfig.bitDepth >= 8 && p->mConfig.bitDepth <= 32), return kALAC_BadBitWidth ;) ;
+               RequireAction ((p->mMixBufferU != NULL) && (p->mMixBufferV != NULL) && (p->mPredictor != NULL),
+                                               status = kALAC_MemFullError ; goto Exit ;) ;
+       }
+       else
+       {
+               status = kALAC_BadSpecificConfigSize ;
+       }
+
+       // skip to Channel Layout Info
+       // theActualCookie += sizeof (ALACSpecificConfig) ;
+
+       // Currently, the Channel Layout Info portion of the magic cookie (as defined in the
+       // ALACMagicCookieDescription.txt document) is unused by the decoder.
+
+Exit:
+       return status ;
+}
+
+/*
+       Decode ()
+       - the decoded samples are interleaved into the output buffer in the order they arrive in
+         the bitstream
+*/
+int32_t
+alac_decode (ALAC_DECODER *p, struct BitBuffer * bits, int32_t * sampleBuffer, uint32_t numSamples, uint32_t * outNumSamples)
+{
+       BitBuffer               shiftBits ;
+       uint32_t                bits1, bits2 ;
+       uint8_t                 tag ;
+       uint8_t                 elementInstanceTag ;
+       AGParamRec              agParams ;
+       uint32_t                channelIndex ;
+       int16_t                 coefsU [32] ;           // max possible size is 32 although NUMCOEPAIRS is the current limit
+       int16_t                 coefsV [32] ;
+       uint8_t                 numU, numV ;
+       uint8_t                 mixBits ;
+       int8_t                  mixRes ;
+       uint16_t                unusedHeader ;
+       uint8_t                 escapeFlag ;
+       uint32_t                chanBits ;
+       uint8_t                 bytesShifted ;
+       uint32_t                shift ;
+       uint8_t                 modeU, modeV ;
+       uint32_t                denShiftU, denShiftV ;
+       uint16_t                pbFactorU, pbFactorV ;
+       uint16_t                pb ;
+       int32_t *               out32 ;
+       uint8_t                 headerByte ;
+       uint8_t                 partialFrame ;
+       uint32_t                extraBits ;
+       int32_t                 val ;
+       uint32_t                i, j ;
+       int32_t                 status ;
+       uint32_t                numChannels = p->mNumChannels ;
+
+       RequireAction ((bits != NULL) && (sampleBuffer != NULL) && (outNumSamples != NULL), return kALAC_ParamError ;) ;
+       RequireAction (p->mNumChannels > 0, return kALAC_ZeroChannelCount ;) ;
+
+       p->mActiveElements = 0 ;
+       channelIndex    = 0 ;
+
+       status = ALAC_noErr ;
+       *outNumSamples = numSamples ;
+
+       while (status == ALAC_noErr)
+       {
+               // bail if we ran off the end of the buffer
+               RequireAction (bits->cur < bits->end, status = kALAC_ParamError ; goto Exit ;) ;
+
+               // copy global decode params for this element
+               pb = p->mConfig.pb ;
+
+               // read element tag
+               tag = BitBufferReadSmall (bits, 3) ;
+               switch (tag)
+               {
+                       case ID_SCE:
+                       case ID_LFE:
+                       {
+                               // mono/LFE channel
+                               elementInstanceTag = BitBufferReadSmall (bits, 4) ;
+                               p->mActiveElements |= (1u << elementInstanceTag) ;
+
+                               // read the 12 unused header bits
+                               unusedHeader = (uint16_t) BitBufferRead (bits, 12) ;
+                               RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ;
+
+                               // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag
+                               headerByte = (uint8_t) BitBufferRead (bits, 4) ;
+
+                               partialFrame = headerByte >> 3 ;
+
+                               bytesShifted = (headerByte >> 1) & 0x3u ;
+                               RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ;
+
+                               shift = bytesShifted * 8 ;
+
+                               escapeFlag = headerByte & 0x1 ;
+
+                               chanBits = p->mConfig.bitDepth - (bytesShifted * 8) ;
+
+                               // check for partial frame to override requested numSamples
+                               if (partialFrame != 0)
+                               {
+                                       numSamples = BitBufferRead (bits, 16) << 16 ;
+                                       numSamples |= BitBufferRead (bits, 16) ;
+
+                                       RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ;
+                               }
+
+                               if (escapeFlag == 0)
+                               {
+                                       // compressed frame, read rest of parameters
+                                       mixBits = (uint8_t) BitBufferRead (bits, 8) ;
+                                       mixRes  = (int8_t) BitBufferRead (bits, 8) ;
+                                       //Assert ((mixBits == 0) && (mixRes == 0)) ;            // no mixing for mono
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       modeU           = headerByte >> 4 ;
+                                       denShiftU       = headerByte & 0xfu ;
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       pbFactorU       = headerByte >> 5 ;
+                                       numU            = headerByte & 0x1fu ;
+
+                                       for (i = 0 ; i < numU ; i++)
+                                               coefsU [i] = (int16_t) BitBufferRead (bits, 16) ;
+
+                                       // if shift active, skip the shift buffer but remember where it starts
+                                       if (bytesShifted != 0)
+                                       {
+                                               shiftBits = *bits ;
+                                               BitBufferAdvance (bits, (bytesShifted * 8) * numSamples) ;
+                                       }
+
+                                       // decompress
+                                       set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
+                                       status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits1) ;
+                                       RequireNoErr (status, goto Exit ;) ;
+
+                                       if (modeU == 0)
+                                       {
+                                               unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
+                                       }
+                                       else
+                                       {
+                                               // the special "numActive == 31" mode can be done in-place
+                                               unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ;
+                                               unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
+                                       }
+                               }
+                               else
+                               {
+                                       //Assert (bytesShifted == 0) ;
+
+                                       // uncompressed frame, copy data into the mix buffer to use common output code
+                                       shift = 32 - chanBits ;
+                                       if (chanBits <= 16)
+                                       {
+                                               for (i = 0 ; i < numSamples ; i++)
+                                               {
+                                                       val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
+                                                       val = (val << shift) >> shift ;
+                                                       p->mMixBufferU [i] = val ;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               // BitBufferRead () can't read more than 16 bits at a time so break up the reads
+                                               extraBits = chanBits - 16 ;
+                                               for (i = 0 ; i < numSamples ; i++)
+                                               {
+                                                       val = (int32_t) BitBufferRead (bits, 16) ;
+                                                       val = arith_shift_left (val, 16) >> shift ;
+                                                       p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
+                                               }
+                                       }
+
+                                       mixBits = mixRes = 0 ;
+                                       bits1 = chanBits * numSamples ;
+                                       bytesShifted = 0 ;
+                               }
+
+                               // now read the shifted values into the shift buffer
+                               if (bytesShifted != 0)
+                               {
+                                       shift = bytesShifted * 8 ;
+                                       //Assert (shift <= 16) ;
+
+                                       for (i = 0 ; i < numSamples ; i++)
+                                               p->mShiftBuffer [i] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
+                               }
+
+                               // convert 32-bit integers into output buffer
+                               switch (p->mConfig.bitDepth)
+                               {
+                                       case 16:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               for (i = 0, j = 0 ; i < numSamples ; i++, j += numChannels)
+                                                       out32 [j] = arith_shift_left (p->mMixBufferU [i], 16) ;
+                                               break ;
+                                       case 20:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               copyPredictorTo20 (p->mMixBufferU, out32, numChannels, numSamples) ;
+                                               break ;
+                                       case 24:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               if (bytesShifted != 0)
+                                                       copyPredictorTo24Shift (p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ;
+                                               else
+                                                       copyPredictorTo24 (p->mMixBufferU, out32, numChannels, numSamples) ;
+                                               break ;
+                                       case 32:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               if (bytesShifted != 0)
+                                                       copyPredictorTo32Shift (p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ;
+                                               else
+                                                       copyPredictorTo32 (p->mMixBufferU, out32, numChannels, numSamples) ;
+                                               break ;
+                               }
+
+                               channelIndex += 1 ;
+                               *outNumSamples = numSamples ;
+                               break ;
+                       }
+
+                       case ID_CPE:
+                       {
+                               // if decoding this pair would take us over the max channels limit, bail
+                               if ((channelIndex + 2) > numChannels)
+                                       goto NoMoreChannels ;
+
+                               // stereo channel pair
+                               elementInstanceTag = BitBufferReadSmall (bits, 4) ;
+                               p->mActiveElements |= (1u << elementInstanceTag) ;
+
+                               // read the 12 unused header bits
+                               unusedHeader = (uint16_t) BitBufferRead (bits, 12) ;
+                               RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ;
+
+                               // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag
+                               headerByte = (uint8_t) BitBufferRead (bits, 4) ;
+
+                               partialFrame = headerByte >> 3 ;
+
+                               bytesShifted = (headerByte >> 1) & 0x3u ;
+                               RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ;
+
+                               shift = bytesShifted * 8 ;
+
+                               escapeFlag = headerByte & 0x1 ;
+
+                               chanBits = p->mConfig.bitDepth - (bytesShifted * 8) + 1 ;
+
+                               // check for partial frame length to override requested numSamples
+                               if (partialFrame != 0)
+                               {
+                                       numSamples = BitBufferRead (bits, 16) << 16 ;
+                                       numSamples |= BitBufferRead (bits, 16) ;
+
+                                       RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ;
+                               }
+
+                               if (escapeFlag == 0)
+                               {
+                                       // compressed frame, read rest of parameters
+                                       mixBits         = (uint8_t) BitBufferRead (bits, 8) ;
+                                       mixRes          = (int8_t) BitBufferRead (bits, 8) ;
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       modeU           = headerByte >> 4 ;
+                                       denShiftU       = headerByte & 0xfu ;
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       pbFactorU       = headerByte >> 5 ;
+                                       numU            = headerByte & 0x1fu ;
+                                       for (i = 0 ; i < numU ; i++)
+                                               coefsU [i] = (int16_t) BitBufferRead (bits, 16) ;
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       modeV           = headerByte >> 4 ;
+                                       denShiftV       = headerByte & 0xfu ;
+
+                                       headerByte      = (uint8_t) BitBufferRead (bits, 8) ;
+                                       pbFactorV       = headerByte >> 5 ;
+                                       numV            = headerByte & 0x1fu ;
+                                       for (i = 0 ; i < numV ; i++)
+                                               coefsV [i] = (int16_t) BitBufferRead (bits, 16) ;
+
+                                       // if shift active, skip the interleaved shifted values but remember where they start
+                                       if (bytesShifted != 0)
+                                       {
+                                               shiftBits = *bits ;
+                                               BitBufferAdvance (bits, (bytesShifted * 8) * 2 * numSamples) ;
+                                       }
+
+                                       // decompress and run predictor for "left" channel
+                                       set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
+                                       status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits1) ;
+                                       RequireNoErr (status, goto Exit ;) ;
+
+                                       if (modeU == 0)
+                                       {
+                                               unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
+                                       }
+                                       else
+                                       {
+                                               // the special "numActive == 31" mode can be done in-place
+                                               unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ;
+                                               unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ;
+                                       }
+
+                                       // decompress and run predictor for "right" channel
+                                       set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorV) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ;
+                                       status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits2) ;
+                                       RequireNoErr (status, goto Exit ;) ;
+
+                                       if (modeV == 0)
+                                       {
+                                               unpc_block (p->mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ;
+                                       }
+                                       else
+                                       {
+                                               // the special "numActive == 31" mode can be done in-place
+                                               unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ;
+                                               unpc_block (p->mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ;
+                                       }
+                               }
+                               else
+                               {
+                                       //Assert (bytesShifted == 0) ;
+
+                                       // uncompressed frame, copy data into the mix buffers to use common output code
+                                       chanBits = p->mConfig.bitDepth ;
+                                       shift = 32 - chanBits ;
+                                       if (chanBits <= 16)
+                                       {
+                                               for (i = 0 ; i < numSamples ; i++)
+                                               {
+                                                       val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
+                                                       val = (val << shift) >> shift ;
+                                                       p->mMixBufferU [i] = val ;
+
+                                                       val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ;
+                                                       val = (val << shift) >> shift ;
+                                                       p->mMixBufferV [i] = val ;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               // BitBufferRead () can't read more than 16 bits at a time so break up the reads
+                                               extraBits = chanBits - 16 ;
+                                               for (i = 0 ; i < numSamples ; i++)
+                                               {
+                                                       val = (int32_t) BitBufferRead (bits, 16) ;
+                                                       val = (((uint32_t) val) << 16) >> shift ;
+                                                       p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
+
+                                                       val = (int32_t) BitBufferRead (bits, 16) ;
+                                                       val = ((uint32_t) val) >> shift ;
+                                                       p->mMixBufferV [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ;
+                                               }
+                                       }
+
+                                       bits1 = chanBits * numSamples ;
+                                       bits2 = chanBits * numSamples ;
+                                       mixBits = mixRes = 0 ;
+                                       bytesShifted = 0 ;
+                               }
+
+                               // now read the shifted values into the shift buffer
+                               if (bytesShifted != 0)
+                               {
+                                       shift = bytesShifted * 8 ;
+                                       //Assert (shift <= 16) ;
+
+                                       for (i = 0 ; i < (numSamples * 2) ; i += 2)
+                                       {
+                                               p->mShiftBuffer [i + 0] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
+                                               p->mShiftBuffer [i + 1] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ;
+                                       }
+                               }
+
+                               // un-mix the data and convert to output format
+                               // - note that mixRes = 0 means just interleave so we use that path for uncompressed frames
+                               switch (p->mConfig.bitDepth)
+                               {
+                                       case 16:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               unmix16 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ;
+                                               break ;
+                                       case 20:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               unmix20 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ;
+                                               break ;
+                                       case 24:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               unmix24 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples,
+                                                                       mixBits, mixRes, p->mShiftBuffer, bytesShifted) ;
+                                               break ;
+                                       case 32:
+                                               out32 = sampleBuffer + channelIndex ;
+                                               unmix32 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples,
+                                                                       mixBits, mixRes, p->mShiftBuffer, bytesShifted) ;
+                                               break ;
+                               }
+
+                               channelIndex += 2 ;
+                               *outNumSamples = numSamples ;
+                               break ;
+                       }
+
+                       case ID_CCE:
+                       case ID_PCE:
+                       {
+                               // unsupported element, bail
+                               //AssertNoErr (tag) ;
+                               status = kALAC_UnsupportedElement ;
+                               break ;
+                       }
+
+                       case ID_DSE:
+                       {
+                               // data stream element -- parse but ignore
+                               status = alac_data_stream_element (bits) ;
+                               break ;
+                       }
+
+                       case ID_FIL:
+                       {
+                               // fill element -- parse but ignore
+                               status = alac_fill_element (bits) ;
+                               break ;
+                       }
+
+                       case ID_END:
+                       {
+                               // frame end, all done so byte align the frame and check for overruns
+                               BitBufferByteAlign (bits, false) ;
+                               //Assert (bits->cur == bits->end) ;
+                               goto Exit ;
+                       }
+               }
+
+#if 0 // ! DEBUG
+               // if we've decoded all of our channels, bail (but not in debug b/c we want to know if we're seeing bad bits)
+               // - this also protects us if the config does not match the bitstream or crap data bits follow the audio bits
+               if (channelIndex >= numChannels)
+                       break ;
+#endif
+       }
+
+NoMoreChannels:
+
+       // if we get here and haven't decoded all of the requested channels, fill the remaining channels with zeros
+       for ( ; channelIndex < numChannels ; channelIndex++)
+       {
+               int32_t *       fill32 = sampleBuffer + channelIndex ;
+               Zero32 (fill32, numSamples, numChannels) ;
+       }
+
+Exit:
+       return status ;
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+/*
+       FillElement ()
+       - they're just filler so we don't need 'em
+*/
+static int32_t
+alac_fill_element (struct BitBuffer * bits)
+{
+       int16_t         count ;
+
+       // 4-bit count or (4-bit + 8-bit count) if 4-bit count == 15
+       // - plus this weird -1 thing I still don't fully understand
+       count = BitBufferReadSmall (bits, 4) ;
+       if (count == 15)
+               count += (int16_t) BitBufferReadSmall (bits, 8) - 1 ;
+
+       BitBufferAdvance (bits, count * 8) ;
+
+       RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ;
+
+       return ALAC_noErr ;
+}
+
+/*
+       DataStreamElement ()
+       - we don't care about data stream elements so just skip them
+*/
+static int32_t
+alac_data_stream_element (struct BitBuffer * bits)
+{
+       int32_t         data_byte_align_flag ;
+       uint16_t                count ;
+
+       // the tag associates this data stream element with a given audio element
+
+       /* element_instance_tag = */ BitBufferReadSmall (bits, 4) ;
+
+       data_byte_align_flag = BitBufferReadOne (bits) ;
+
+       // 8-bit count or (8-bit + 8-bit count) if 8-bit count == 255
+       count = BitBufferReadSmall (bits, 8) ;
+       if (count == 255)
+               count += BitBufferReadSmall (bits, 8) ;
+
+       // the align flag means the bitstream should be byte-aligned before reading the following data bytes
+       if (data_byte_align_flag)
+               BitBufferByteAlign (bits, false) ;
+
+       // skip the data bytes
+       BitBufferAdvance (bits, count * 8) ;
+
+       RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ;
+
+       return ALAC_noErr ;
+}
+
+/*
+       ZeroN ()
+       - helper routines to clear out output channel buffers when decoding fewer channels than requested
+*/
+static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride)
+{
+       if (stride == 1)
+       {
+               memset (buffer, 0, numItems * sizeof (int32_t)) ;
+       }
+       else
+       {
+               for (uint32_t indx = 0 ; indx < (numItems * stride) ; indx += stride)
+                       buffer [indx] = 0 ;
+       }
+}
diff --git a/src/ALAC/alac_encoder.c b/src/ALAC/alac_encoder.c
new file mode 100644 (file)
index 0000000..830e346
--- /dev/null
@@ -0,0 +1,1339 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           ALACEncoder.cpp
+*/
+
+// build stuff
+#define VERBOSE_DEBUG          0
+#define DebugMsg                       printf
+
+// headers
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sfendian.h"
+
+#include "alac_codec.h"
+
+#include "aglib.h"
+#include "dplib.h"
+#include "matrixlib.h"
+
+#include "ALACBitUtilities.h"
+#include "ALACAudioTypes.h"
+#include "EndianPortable.h"
+
+typedef enum
+{
+       false = 0,
+       true = 1
+} bool ;
+
+static void    GetConfig (ALAC_ENCODER *p, ALACSpecificConfig * config) ;
+
+static int32_t EncodeStereo (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ;
+static int32_t EncodeStereoFast (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ;
+static int32_t EncodeStereoEscape (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t numSamples) ;
+static int32_t EncodeMono (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ;
+
+
+
+// Note: in C you can't typecast to a 2-dimensional array pointer but that's what we need when
+// picking which coefs to use so we declare this typedef b/c we *can* typecast to this type
+typedef int16_t (*SearchCoefs) [kALACMaxCoefs] ;
+
+// defines/constants
+const uint32_t kALACEncoderMagic       = MAKE_MARKER ('d', 'p', 'g', 'e') ;
+const uint32_t kMaxSampleSize          = 32 ;                  // max allowed bit width is 32
+const uint32_t kDefaultMixBits         = 2 ;
+const uint32_t kDefaultMixRes          = 0 ;
+const uint32_t kMaxRes                         = 4 ;
+const uint32_t kDefaultNumUV           = 8 ;
+const uint32_t kMinUV                          = 4 ;
+const uint32_t kMaxUV                          = 8 ;
+
+// static functions
+#if VERBOSE_DEBUG
+static void AddFiller (BitBuffer * bits, int32_t numBytes) ;
+#endif
+
+
+/*
+       Map Format: 3-bit field per channel which is the same as the "element tag" that should be placed
+                               at the beginning of the frame for that channel.  Indicates whether SCE, CPE, or LFE.
+                               Each particular field is accessed via the current channel indx.  Note that the channel
+                               indx increments by two for channel pairs.
+
+       For example:
+
+                       C L R 3-channel input           = (ID_CPE << 3) | (ID_SCE)
+                               indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3)
+                               indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3)
+
+                       C L R Ls Rs LFE 5.1-channel input = (ID_LFE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE)
+                               indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3)
+                               indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3)
+                               indx 3 value = (map & (0x7ul << (3 * 3))) >> (3 * 3)
+                               indx 5 value = (map & (0x7ul << (5 * 3))) >> (5 * 3)
+                               indx 7 value = (map & (0x7ul << (7 * 3))) >> (7 * 3)
+*/
+static const uint32_t  sChannelMaps [kALACMaxChannels] =
+{
+       ID_SCE,
+       ID_CPE,
+       (ID_CPE << 3) | (ID_SCE),
+       (ID_SCE << 9) | (ID_CPE << 3) | (ID_SCE),
+       (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE),
+       (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE),
+       (ID_SCE << 18) | (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE),
+       (ID_SCE << 21) | (ID_CPE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE)
+} ;
+
+static const uint32_t sSupportediPodSampleRates [] =
+{
+       8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
+} ;
+
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+void
+alac_set_fastmode (ALAC_ENCODER * p, int32_t fast)
+{
+       p->mFastMode = fast ;
+}
+
+
+/*
+       HEADER SPECIFICATION
+
+               For every segment we adopt the following header:
+
+                       1 byte reserved                 (always 0)
+                       1 byte flags                    (see below)
+                       [4 byte frame length]   (optional, see below)
+                                ---Next, the per-segment ALAC parameters---
+                       1 byte mixBits                  (middle-side parameter)
+                       1 byte mixRes                   (middle-side parameter, interpreted as signed char)
+
+                       1 byte shiftU                   (4 bits modeU, 4 bits denShiftU)
+                       1 byte filterU                  (3 bits pbFactorU, 5 bits numU)
+                       (numU) shorts                   (signed DP coefficients for V channel)
+                                ---Next, 2nd-channel ALAC parameters in case of stereo mode---
+                       1 byte shiftV                   (4 bits modeV, 4 bits denShiftV)
+                       1 byte filterV                  (3 bits pbFactorV, 5 bits numV)
+                       (numV) shorts                   (signed DP coefficients for V channel)
+                                ---After this come the shift-off bytes for (>= 24)-bit data (n-byte shift) if indicated---
+                                ---Then comes the AG-compressor bitstream---
+
+
+               FLAGS
+               -----
+
+               The presence of certain flag bits changes the header format such that the parameters might
+               not even be sent.  The currently defined flags format is:
+
+                       0000psse
+
+                       where           0       = reserved, must be 0
+                                               p       = 1-bit field "partial frame" flag indicating 32-bit frame length follows this byte
+                                               ss      = 2-bit field indicating "number of shift-off bytes ignored by compression"
+                                               e       = 1-bit field indicating "escape"
+
+               The "partial frame" flag means that the following segment is not equal to the frame length specified
+               in the out-of-band decoder configuration.  This allows the decoder to deal with end-of-file partial
+               segments without incurring the 32-bit overhead for each segment.
+
+               The "shift-off" field indicates the number of bytes at the bottom of the word that were passed through
+               uncompressed.  The reason for this is that the entropy inherent in the LS bytes of >= 24-bit words
+               quite often means that the frame would have to be "escaped" b/c the compressed size would be >= the
+               uncompressed size.  However, by shifting the input values down and running the remaining bits through
+               the normal compression algorithm, a net win can be achieved.  If this field is non-zero, it means that
+               the shifted-off bytes follow after the parameter section of the header and before the compressed
+               bitstream.  Note that doing this also allows us to use matrixing on 32-bit inputs after one or more
+               bytes are shifted off the bottom which helps the eventual compression ratio.  For stereo channels,
+               the shifted off bytes are interleaved.
+
+               The "escape" flag means that this segment was not compressed b/c the compressed size would be
+               >= uncompressed size.  In that case, the audio data was passed through uncompressed after the header.
+               The other header parameter bytes will not be sent.
+
+
+               PARAMETERS
+               ----------
+
+               If the segment is not a partial or escape segment, the total header size (in bytes) is given exactly by:
+
+                       4 + (2 + 2 * numU)                                 (mono mode)
+                       4 + (2 + 2 * numV) + (2 + 2 * numV)  (stereo mode)
+
+               where the ALAC filter-lengths numU, numV are bounded by a
+               constant (in the current source, numU, numV <= NUMCOEPAIRS), and
+               this forces an absolute upper bound on header size.
+
+               Each segment-decode process loads up these bytes from the front of the
+               local stream, in the above order, then follows with the entropy-encoded
+               bits for the given segment.
+
+               To generalize middle-side, there are various mixing modes including middle-side, each lossless,
+               as embodied in the mix () and unmix () functions.  These functions exploit a generalized middle-side
+               transformation:
+
+               u := [(rL + (m-r)R)/m] ;
+               v := L - R ;
+
+               where [ ] denotes integer floor.  The (lossless) inverse is
+
+               L = u + v - [rV/m] ;
+               R = L - v ;
+
+               In the segment header, m and r are encoded in mixBits and mixRes.
+               Classical "middle-side" is obtained with m = 2, r = 1, but now
+               we have more generalized mixes.
+
+               NOTES
+               -----
+               The relevance of the ALAC coefficients is explained in detail
+               in patent documents.
+*/
+
+/*
+       EncodeStereo ()
+       - encode a channel pair
+*/
+static int32_t
+EncodeStereo (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples)
+{
+       BitBuffer               workBits ;
+       BitBuffer               startBits = *bitstream ;                        // squirrel away copy of current state in case we need to go back and do an escape packet
+       AGParamRec              agParams ;
+       uint32_t                bits1, bits2 ;
+       uint32_t                dilate ;
+       int32_t                 mixBits, mixRes, maxRes ;
+       uint32_t                minBits, minBits1, minBits2 ;
+       uint32_t                numU, numV ;
+       uint32_t                mode ;
+       uint32_t                pbFactor ;
+       uint32_t                chanBits ;
+       uint8_t                 bytesShifted ;
+       SearchCoefs             coefsU ;
+       SearchCoefs             coefsV ;
+       uint32_t                indx ;
+       uint8_t                 partialFrame ;
+       uint32_t                escapeBits ;
+       bool                    doEscape ;
+       int32_t                 status = ALAC_noErr ;
+       int32_t                 bestRes ;
+
+       // make sure we handle this bit-depth before we get going
+       RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ;
+
+       // reload coefs pointers for this channel pair
+       // - note that, while you might think they should be re-initialized per block, retaining state across blocks
+       //       actually results in better overall compression
+       // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using
+       //       different coefs for the different passes of "mixRes" results in even better compression
+       coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ;
+       coefsV = (SearchCoefs) p->mCoefsV [channelIndex] ;
+
+       // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many
+       // so enable 16-bit "shift off" and encode in 17-bit mode
+       // - in addition, 24-bit mode really improves with one byte shifted off
+       if (p->mBitDepth == 32)
+               bytesShifted = 2 ;
+       else if (p->mBitDepth >= 24)
+               bytesShifted = 1 ;
+       else
+               bytesShifted = 0 ;
+
+       chanBits = p->mBitDepth - (bytesShifted * 8) + 1 ;
+
+       // flag whether or not this is a partial frame
+       partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ;
+
+       // brute-force encode optimization loop
+       // - run over variations of the encoding params to find the best choice
+       mixBits         = kDefaultMixBits ;
+       maxRes          = kMaxRes ;
+       numU = numV = kDefaultNumUV ;
+       mode            = 0 ;
+       pbFactor        = 4 ;
+       dilate          = 8 ;
+
+       minBits = minBits1 = minBits2 = 1ul << 31 ;
+
+       bestRes = p->mLastMixRes [channelIndex] ;
+
+       for (mixRes = 0 ; mixRes <= maxRes ; mixRes++)
+       {
+               // mix the stereo inputs
+               switch (p->mBitDepth)
+               {
+                       case 16:
+                               mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, mixBits, mixRes) ;
+                               break ;
+                       case 20:
+                               mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, mixBits, mixRes) ;
+                               break ;
+                       case 24:
+                               // includes extraction of shifted-off bytes
+                               mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate,
+                                               mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                               break ;
+                       case 32:
+                               // includes extraction of shifted-off bytes
+                               mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate,
+                                               mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                               break ;
+               }
+
+               BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ;
+
+               // run the dynamic predictors
+               pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+               pc_block (p->mMixBufferV, p->mPredictorV, numSamples / dilate, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ;
+
+               // run the lossless compressor on each channel
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ;
+               RequireNoErr (status, goto Exit ;) ;
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorV, &workBits, numSamples / dilate, chanBits, &bits2) ;
+               RequireNoErr (status, goto Exit ;) ;
+
+               // look for best match
+               if ((bits1 + bits2) < minBits1)
+               {
+                       minBits1 = bits1 + bits2 ;
+                       bestRes = mixRes ;
+               }
+       }
+
+       p->mLastMixRes [channelIndex] = (int16_t) bestRes ;
+
+       // mix the stereo inputs with the current best mixRes
+       mixRes = p->mLastMixRes [channelIndex] ;
+       switch (p->mBitDepth)
+       {
+               case 16:
+                       mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ;
+                       break ;
+               case 20:
+                       mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ;
+                       break ;
+               case 24:
+                       // also extracts the shifted off bytes into the shift buffers
+                       mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples,
+                                       mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                       break ;
+               case 32:
+                       // also extracts the shifted off bytes into the shift buffers
+                       mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples,
+                                       mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                       break ;
+       }
+
+       // now it's time for the predictor coefficient search loop
+       numU = numV = kMinUV ;
+       minBits1 = minBits2 = 1ul << 31 ;
+
+       for (uint32_t numUV = kMinUV ; numUV <= kMaxUV ; numUV += 4)
+       {
+               BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ;
+
+               dilate = 32 ;
+
+               // run the predictor over the same data multiple times to help it converge
+               for (uint32_t converge = 0 ; converge < 8 ; converge++)
+               {
+                       pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numUV-1], numUV, chanBits, DENSHIFT_DEFAULT) ;
+                       pc_block (p->mMixBufferV, p->mPredictorV, numSamples / dilate, coefsV [numUV-1], numUV, chanBits, DENSHIFT_DEFAULT) ;
+               }
+
+               dilate = 8 ;
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ;
+
+               if ((bits1 * dilate + 16 * numUV) < minBits1)
+               {
+                       minBits1 = bits1 * dilate + 16 * numUV ;
+                       numU = numUV ;
+               }
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorV, &workBits, numSamples / dilate, chanBits, &bits2) ;
+
+               if ((bits2 * dilate + 16 * numUV) < minBits2)
+               {
+                       minBits2 = bits2 * dilate + 16 * numUV ;
+                       numV = numUV ;
+               }
+       }
+
+       // test for escape hatch if best calculated compressed size turns out to be more than the input size
+       minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ;
+       if (bytesShifted != 0)
+               minBits += (numSamples * (bytesShifted * 8) * 2) ;
+
+       escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ;    /* 2 common header bytes */
+
+       doEscape = (minBits >= escapeBits) ? true : false ;
+
+       if (doEscape == false)
+       {
+               // write bitstream header and coefs
+               BitBufferWrite (bitstream, 0, 12) ;
+               BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ;
+               if (partialFrame)
+                       BitBufferWrite (bitstream, numSamples, 32) ;
+               BitBufferWrite (bitstream, mixBits, 8) ;
+               BitBufferWrite (bitstream, mixRes, 8) ;
+
+               //Assert ((mode < 16) && (DENSHIFT_DEFAULT < 16)) ;
+               //Assert ((pbFactor < 8) && (numU < 32)) ;
+               //Assert ((pbFactor < 8) && (numV < 32)) ;
+
+               BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ;
+               BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ;
+               for (indx = 0 ; indx < numU ; indx++)
+                       BitBufferWrite (bitstream, coefsU [numU - 1][indx], 16) ;
+
+               BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ;
+               BitBufferWrite (bitstream, (pbFactor << 5) | numV, 8) ;
+               for (indx = 0 ; indx < numV ; indx++)
+                       BitBufferWrite (bitstream, coefsV [numV - 1][indx], 16) ;
+
+               // if shift active, write the interleaved shift buffers
+               if (bytesShifted != 0)
+               {
+                       uint32_t                bitShift = bytesShifted * 8 ;
+
+                       //Assert (bitShift <= 16) ;
+
+                       for (indx = 0 ; indx < (numSamples * 2) ; indx += 2)
+                       {
+                               uint32_t                        shiftedVal ;
+
+                               shiftedVal = ((uint32_t) p->mShiftBufferUV [indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV [indx + 1] ;
+                               BitBufferWrite (bitstream, shiftedVal, bitShift * 2) ;
+                       }
+               }
+
+               // run the dynamic predictor and lossless compression for the "left" channel
+               // - note: to avoid allocating more buffers, we're mixing and matching between the available buffers instead
+               //                 of only using "U" buffers for the U-channel and "V" buffers for the V-channel
+               if (mode == 0)
+               {
+                       pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+               }
+               else
+               {
+                       pc_block (p->mMixBufferU, p->mPredictorV, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+                       pc_block (p->mPredictorV, p->mPredictorU, numSamples, NULL, 31, chanBits, 0) ;
+               }
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ;
+               RequireNoErr (status, goto Exit ;) ;
+
+               // run the dynamic predictor and lossless compression for the "right" channel
+               if (mode == 0)
+               {
+                       pc_block (p->mMixBufferV, p->mPredictorV, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ;
+               }
+               else
+               {
+                       pc_block (p->mMixBufferV, p->mPredictorU, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ;
+                       pc_block (p->mPredictorU, p->mPredictorV, numSamples, NULL, 31, chanBits, 0) ;
+               }
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2) ;
+               RequireNoErr (status, goto Exit ;) ;
+
+               /*      if we happened to create a compressed packet that was actually bigger than an escape packet would be,
+                       chuck it and do an escape packet
+               */
+               minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ;
+               if (minBits >= escapeBits)
+               {
+                       *bitstream = startBits ;                // reset bitstream state
+                       doEscape = true ;
+                       printf ("compressed frame too big: %u vs. %u \n", minBits, escapeBits) ;
+               }
+       }
+
+       if (doEscape == true)
+       {
+               /* escape */
+               status = EncodeStereoEscape (p, bitstream, inputBuffer, stride, numSamples) ;
+
+#if VERBOSE_DEBUG
+               DebugMsg ("escape!: %u vs %u\n", minBits, escapeBits) ;
+#endif
+       }
+
+Exit:
+       return status ;
+}
+
+/*
+       EncodeStereoFast ()
+       - encode a channel pair without the search loop for maximum possible speed
+*/
+static int32_t
+EncodeStereoFast (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples)
+{
+       BitBuffer               startBits = *bitstream ;                        // squirrel away current bit position in case we decide to use escape hatch
+       AGParamRec              agParams ;
+       uint32_t                bits1, bits2 ;
+       int32_t                 mixBits, mixRes ;
+       uint32_t                minBits, minBits1, minBits2 ;
+       uint32_t                numU, numV ;
+       uint32_t                mode ;
+       uint32_t                pbFactor ;
+       uint32_t                chanBits ;
+       uint8_t                 bytesShifted ;
+       SearchCoefs             coefsU ;
+       SearchCoefs             coefsV ;
+       uint32_t                indx ;
+       uint8_t                 partialFrame ;
+       uint32_t                escapeBits ;
+       bool                    doEscape ;
+       int32_t                 status ;
+
+       // make sure we handle this bit-depth before we get going
+       RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ;
+
+       // reload coefs pointers for this channel pair
+       // - note that, while you might think they should be re-initialized per block, retaining state across blocks
+       //       actually results in better overall compression
+       // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using
+       //       different coefs for the different passes of "mixRes" results in even better compression
+       coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ;
+       coefsV = (SearchCoefs) p->mCoefsV [channelIndex] ;
+
+       // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many
+       // so enable 16-bit "shift off" and encode in 17-bit mode
+       // - in addition, 24-bit mode really improves with one byte shifted off
+       if (p->mBitDepth == 32)
+               bytesShifted = 2 ;
+       else if (p->mBitDepth >= 24)
+               bytesShifted = 1 ;
+       else
+               bytesShifted = 0 ;
+
+       chanBits = p->mBitDepth - (bytesShifted * 8) + 1 ;
+
+       // flag whether or not this is a partial frame
+       partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ;
+
+       // set up default encoding parameters for "fast" mode
+       mixBits         = kDefaultMixBits ;
+       mixRes          = kDefaultMixRes ;
+       numU = numV = kDefaultNumUV ;
+       mode            = 0 ;
+       pbFactor        = 4 ;
+
+       minBits = minBits1 = minBits2 = 1ul << 31 ;
+
+       // mix the stereo inputs with default mixBits/mixRes
+       switch (p->mBitDepth)
+       {
+               case 16:
+                       mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ;
+                       break ;
+               case 20:
+                       mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ;
+                       break ;
+               case 24:
+                       // also extracts the shifted off bytes into the shift buffers
+                       mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples,
+                                       mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                       break ;
+               case 32:
+                       // also extracts the shifted off bytes into the shift buffers
+                       mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples,
+                                       mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ;
+                       break ;
+       }
+
+       /* speculatively write the bitstream assuming the compressed version will be smaller */
+
+       // write bitstream header and coefs
+       BitBufferWrite (bitstream, 0, 12) ;
+       BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ;
+       if (partialFrame)
+               BitBufferWrite (bitstream, numSamples, 32) ;
+       BitBufferWrite (bitstream, mixBits, 8) ;
+       BitBufferWrite (bitstream, mixRes, 8) ;
+
+       //Assert ((mode < 16) && (DENSHIFT_DEFAULT < 16)) ;
+       //Assert ((pbFactor < 8) && (numU < 32)) ;
+       //Assert ((pbFactor < 8) && (numV < 32)) ;
+
+       BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ;
+       BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ;
+       for (indx = 0 ; indx < numU ; indx++)
+               BitBufferWrite (bitstream, coefsU [numU - 1][indx], 16) ;
+
+       BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ;
+       BitBufferWrite (bitstream, (pbFactor << 5) | numV, 8) ;
+       for (indx = 0 ; indx < numV ; indx++)
+               BitBufferWrite (bitstream, coefsV [numV - 1][indx], 16) ;
+
+       // if shift active, write the interleaved shift buffers
+       if (bytesShifted != 0)
+       {
+               uint32_t                bitShift = bytesShifted * 8 ;
+
+               //Assert (bitShift <= 16) ;
+
+               for (indx = 0 ; indx < (numSamples * 2) ; indx += 2)
+               {
+                       uint32_t                        shiftedVal ;
+
+                       shiftedVal = ((uint32_t) p->mShiftBufferUV [indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV [indx + 1] ;
+                       BitBufferWrite (bitstream, shiftedVal, bitShift * 2) ;
+               }
+       }
+
+       // run the dynamic predictor and lossless compression for the "left" channel
+       // - note: we always use mode 0 in the "fast" path so we don't need the code for mode != 0
+       pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+
+       set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ;
+       status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ;
+       RequireNoErr (status, goto Exit ;) ;
+
+       // run the dynamic predictor and lossless compression for the "right" channel
+       pc_block (p->mMixBufferV, p->mPredictorV, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ;
+
+       set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ;
+       status = dyn_comp (&agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2) ;
+       RequireNoErr (status, goto Exit ;) ;
+
+       // do bit requirement calculations
+       minBits1 = bits1 + (numU * sizeof (int16_t) * 8) ;
+       minBits2 = bits2 + (numV * sizeof (int16_t) * 8) ;
+
+       // test for escape hatch if best calculated compressed size turns out to be more than the input size
+       minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ;
+       if (bytesShifted != 0)
+               minBits += (numSamples * (bytesShifted * 8) * 2) ;
+
+       escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ;    /* 2 common header bytes */
+
+       doEscape = (minBits >= escapeBits) ? true : false ;
+
+       if (doEscape == false)
+       {
+               /*      if we happened to create a compressed packet that was actually bigger than an escape packet would be,
+                       chuck it and do an escape packet
+               */
+               minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ;
+               if (minBits >= escapeBits)
+               {
+                       doEscape = true ;
+                       printf ("compressed frame too big: %u vs. %u\n", minBits, escapeBits) ;
+               }
+
+       }
+
+       if (doEscape == true)
+       {
+               /* escape */
+
+               // reset bitstream position since we speculatively wrote the compressed version
+               *bitstream = startBits ;
+
+               // write escape frame
+               status = EncodeStereoEscape (p, bitstream, inputBuffer, stride, numSamples) ;
+
+#if VERBOSE_DEBUG
+               DebugMsg ("escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth * 2)) ;
+#endif
+       }
+
+Exit:
+       return status ;
+}
+
+/*
+       EncodeStereoEscape ()
+       - encode stereo escape frame
+*/
+static int32_t
+EncodeStereoEscape (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t numSamples)
+{
+       uint8_t                 partialFrame ;
+       uint32_t                indx ;
+
+       // flag whether or not this is a partial frame
+       partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ;
+
+       // write bitstream header
+       BitBufferWrite (bitstream, 0, 12) ;
+       BitBufferWrite (bitstream, (partialFrame << 3) | 1, 4) ;        // LSB = 1 means "frame not compressed"
+       if (partialFrame)
+               BitBufferWrite (bitstream, numSamples, 32) ;
+
+       // just copy the input data to the output buffer
+       switch (p->mBitDepth)
+       {
+               case 16:
+                       for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                       {
+                               BitBufferWrite (bitstream, inputBuffer [indx + 0] >> 16, 16) ;
+                               BitBufferWrite (bitstream, inputBuffer [indx + 1] >> 16, 16) ;
+                       }
+                       break ;
+               case 20:
+                       for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                       {
+                               BitBufferWrite (bitstream, inputBuffer [indx + 0] >> 12, 16) ;
+                               BitBufferWrite (bitstream, inputBuffer [indx + 1] >> 12, 16) ;
+                       }
+                       break ;
+               case 24:
+                       // mix24 () with mixres param = 0 means de-interleave so use it to simplify things
+                       mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, 0, 0, p->mShiftBufferUV, 0) ;
+                       for (indx = 0 ; indx < numSamples ; indx++)
+                       {
+                               BitBufferWrite (bitstream, p->mMixBufferU [indx] >> 8, 24) ;
+                               BitBufferWrite (bitstream, p->mMixBufferV [indx] >> 8, 24) ;
+                       }
+                       break ;
+               case 32:
+                       for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                       {
+                               BitBufferWrite (bitstream, inputBuffer [indx + 0], 32) ;
+                               BitBufferWrite (bitstream, inputBuffer [indx + 1], 32) ;
+                       }
+                       break ;
+       }
+
+       return ALAC_noErr ;
+}
+
+/*
+       EncodeMono ()
+       - encode a mono input buffer
+*/
+static int32_t
+EncodeMono (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples)
+{
+       BitBuffer               startBits = *bitstream ;                        // squirrel away copy of current state in case we need to go back and do an escape packet
+       AGParamRec              agParams ;
+       uint32_t                bits1 ;
+       uint32_t                numU ;
+       SearchCoefs             coefsU ;
+       uint32_t                dilate ;
+       uint32_t                minBits, bestU ;
+       uint32_t                minU, maxU ;
+       uint32_t                indx, indx2 ;
+       uint8_t                 bytesShifted ;
+       uint32_t                shift ;
+       uint32_t                mask ;
+       uint32_t                chanBits ;
+       uint8_t                 pbFactor ;
+       uint8_t                 partialFrame ;
+       uint32_t                escapeBits ;
+       bool                    doEscape ;
+       int32_t                 status = ALAC_noErr ;
+
+
+       // make sure we handle this bit-depth before we get going
+       RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ;
+
+       // reload coefs array from previous frame
+       coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ;
+
+       // pick bit depth for actual encoding
+       // - we lop off the lower byte (s) for 24-/32-bit encodings
+       if (p->mBitDepth == 32)
+               bytesShifted = 2 ;
+       else if (p->mBitDepth >= 24)
+               bytesShifted = 1 ;
+       else
+               bytesShifted = 0 ;
+
+       shift = bytesShifted * 8 ;
+       mask = (1ul << shift) - 1 ;
+       chanBits = p->mBitDepth - (bytesShifted * 8) ;
+
+       // flag whether or not this is a partial frame
+       partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ;
+
+       // convert N-bit data to 32-bit for predictor
+       switch (p->mBitDepth)
+       {
+               case 16:
+                       // convert 16-bit data to 32-bit for predictor
+                       for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride)
+                               p->mMixBufferU [indx] = inputBuffer [indx2] >> 16 ;
+                       break ;
+
+               case 20:
+                       // convert 20-bit data to 32-bit for predictor
+                       for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride)
+                               p->mMixBufferU [indx] = inputBuffer [indx2] >> 12 ;
+                       break ;
+               case 24:
+                       // convert 24-bit data to 32-bit for the predictor and extract the shifted off byte (s)
+                       for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride)
+                       {
+                               p->mMixBufferU [indx] = inputBuffer [indx2] >> 8 ;
+                               p->mShiftBufferUV [indx] = (uint16_t) (p->mMixBufferU [indx] & mask) ;
+                               p->mMixBufferU [indx] >>= shift ;
+                       }
+
+                       break ;
+               case 32:
+                       // just copy the 32-bit input data for the predictor and extract the shifted off byte (s)
+                       for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride)
+                       {
+                               p->mShiftBufferUV [indx] = (uint16_t) (inputBuffer [indx2] & mask) ;
+                               p->mMixBufferU [indx] = inputBuffer [indx2] >> shift ;
+                       }
+                       break ;
+       }
+
+       // brute-force encode optimization loop (implied "encode depth" of 0 if comparing to cmd line tool)
+       // - run over variations of the encoding params to find the best choice
+       minU            = 4 ;
+       maxU            = 8 ;
+       minBits         = 1ul << 31 ;
+       pbFactor        = 4 ;
+
+       bestU   = minU ;
+
+       for (numU = minU ; numU <= maxU ; numU += 4)
+       {
+               BitBuffer               workBits ;
+               uint32_t                numBits ;
+
+               BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ;
+
+               dilate = 32 ;
+               for (uint32_t converge = 0 ; converge < 7 ; converge++)
+                       pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+
+               dilate = 8 ;
+               pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ;
+
+               set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ;
+               status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ;
+               RequireNoErr (status, goto Exit ;) ;
+
+               numBits = (dilate * bits1) + (16 * numU) ;
+               if (numBits < minBits)
+               {
+                       bestU   = numU ;
+                       minBits = numBits ;
+               }
+       }
+
+       // test for escape hatch if best calculated compressed size turns out to be more than the input size
+       // - first, add bits for the header bytes mixRes/maxRes/shiftU/filterU
+       minBits += (4 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ;
+       if (bytesShifted != 0)
+               minBits += (numSamples * (bytesShifted * 8)) ;
+
+       escapeBits = (numSamples * p->mBitDepth) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ;        /* 2 common header bytes */
+
+       doEscape = (minBits >= escapeBits) ? true : false ;
+
+       if (doEscape == false)
+       {
+               // write bitstream header
+               BitBufferWrite (bitstream, 0, 12) ;
+               BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ;
+               if (partialFrame)
+                       BitBufferWrite (bitstream, numSamples, 32) ;
+               BitBufferWrite (bitstream, 0, 16) ;                                                             // mixBits = mixRes = 0
+
+               // write the params and predictor coefs
+               numU = bestU ;
+               BitBufferWrite (bitstream, (0 << 4) | DENSHIFT_DEFAULT, 8) ;    // modeU = 0
+               BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ;
+               for (indx = 0 ; indx < numU ; indx++)
+                       BitBufferWrite (bitstream, coefsU [numU-1][indx], 16) ;
+
+               // if shift active, write the interleaved shift buffers
+               if (bytesShifted != 0)
+               {
+                       for (indx = 0 ; indx < numSamples ; indx++)
+                               BitBufferWrite (bitstream, p->mShiftBufferUV [indx], shift) ;
+               }
+
+               // run the dynamic predictor with the best result
+               pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU-1], numU, chanBits, DENSHIFT_DEFAULT) ;
+
+               // do lossless compression
+               set_standard_ag_params (&agParams, numSamples, numSamples) ;
+               status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ;
+               //AssertNoErr (status) ;
+
+
+               /*      if we happened to create a compressed packet that was actually bigger than an escape packet would be,
+                       chuck it and do an escape packet
+               */
+               minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ;
+               if (minBits >= escapeBits)
+               {
+                       *bitstream = startBits ;                // reset bitstream state
+                       doEscape = true ;
+                       printf ("compressed frame too big: %u vs. %u\n", minBits, escapeBits) ;
+               }
+       }
+
+       if (doEscape == true)
+       {
+               // write bitstream header and coefs
+               BitBufferWrite (bitstream, 0, 12) ;
+               BitBufferWrite (bitstream, (partialFrame << 3) | 1, 4) ;        // LSB = 1 means "frame not compressed"
+               if (partialFrame)
+                       BitBufferWrite (bitstream, numSamples, 32) ;
+
+               // just copy the input data to the output buffer
+               switch (p->mBitDepth)
+               {
+                       case 16:
+                               for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                                       BitBufferWrite (bitstream, inputBuffer [indx] >> 16, 16) ;
+                               break ;
+                       case 20:
+                               // convert 20-bit data to 32-bit for simplicity
+                               for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                                       BitBufferWrite (bitstream, inputBuffer [indx] >> 12, 20) ;
+                               break ;
+                       case 24:
+                               // convert 24-bit data to 32-bit for simplicity
+                               for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride)
+                               {
+                                       p->mMixBufferU [indx] = inputBuffer [indx2] >> 8 ;
+                                       BitBufferWrite (bitstream, p->mMixBufferU [indx], 24) ;
+                               }
+                               break ;
+                       case 32:
+                               for (indx = 0 ; indx < (numSamples * stride) ; indx += stride)
+                                       BitBufferWrite (bitstream, inputBuffer [indx], 32) ;
+                               break ;
+               }
+#if VERBOSE_DEBUG
+               DebugMsg ("escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth)) ;
+#endif
+       }
+
+Exit:
+       return status ;
+}
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+/*
+       Encode ()
+       - encode the next block of samples
+*/
+int32_t
+alac_encode (ALAC_ENCODER *p, uint32_t numSamples,
+                       const int32_t * theReadBuffer, unsigned char * theWriteBuffer, uint32_t * ioNumBytes)
+{
+       uint32_t                outputSize ;
+       BitBuffer               bitstream ;
+       int32_t                 status ;
+       uint32_t                numChannels = p->mNumChannels ;
+
+       // make sure we handle this bit-depth before we get going
+       RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ;
+
+       // create a bit buffer structure pointing to our output buffer
+       BitBufferInit (&bitstream, theWriteBuffer, p->mMaxOutputBytes) ;
+
+       if (numChannels == 2)
+       {
+               // add 3-bit frame start tag ID_CPE = channel pair & 4-bit element instance tag = 0
+               BitBufferWrite (&bitstream, ID_CPE, 3) ;
+               BitBufferWrite (&bitstream, 0, 4) ;
+
+               // encode stereo input buffer
+               if (p->mFastMode == false)
+                       status = EncodeStereo (p, &bitstream, theReadBuffer, 2, 0, numSamples) ;
+               else
+                       status = EncodeStereoFast (p, &bitstream, theReadBuffer, 2, 0, numSamples) ;
+               RequireNoErr (status, goto Exit ;) ;
+       }
+       else if (numChannels == 1)
+       {
+               // add 3-bit frame start tag ID_SCE = mono channel & 4-bit element instance tag = 0
+               BitBufferWrite (&bitstream, ID_SCE, 3) ;
+               BitBufferWrite (&bitstream, 0, 4) ;
+
+               // encode mono input buffer
+               status = EncodeMono (p, &bitstream, theReadBuffer, 1, 0, numSamples) ;
+               RequireNoErr (status, goto Exit ;) ;
+       }
+       else
+       {
+               const int32_t *         inputBuffer ;
+               uint32_t                        tag ;
+               uint32_t                        channelIndex ;
+               uint8_t                         stereoElementTag ;
+               uint8_t                         monoElementTag ;
+               uint8_t                         lfeElementTag ;
+
+               inputBuffer             = theReadBuffer ;
+
+               stereoElementTag        = 0 ;
+               monoElementTag          = 0 ;
+               lfeElementTag           = 0 ;
+
+               for (channelIndex = 0 ; channelIndex < numChannels ;)
+               {
+                       tag = (sChannelMaps [numChannels - 1] & (0x7ul << (channelIndex * 3))) >> (channelIndex * 3) ;
+
+                       BitBufferWrite (&bitstream, tag, 3) ;
+                       switch (tag)
+                       {
+                               case ID_SCE:
+                                       // mono
+                                       BitBufferWrite (&bitstream, monoElementTag, 4) ;
+
+                                       status = EncodeMono (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ;
+
+                                       inputBuffer += 1 ;
+                                       channelIndex++ ;
+                                       monoElementTag++ ;
+                                       break ;
+
+                               case ID_CPE:
+                                       // stereo
+                                       BitBufferWrite (&bitstream, stereoElementTag, 4) ;
+
+                                       status = EncodeStereo (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ;
+
+                                       inputBuffer += 2 ;
+                                       channelIndex += 2 ;
+                                       stereoElementTag++ ;
+                                       break ;
+
+                               case ID_LFE:
+                                       // LFE channel (subwoofer)
+                                       BitBufferWrite (&bitstream, lfeElementTag, 4) ;
+
+                                       status = EncodeMono (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ;
+
+                                       inputBuffer += 1 ;
+                                       channelIndex++ ;
+                                       lfeElementTag++ ;
+                                       break ;
+
+                               default:
+                                       printf ("That ain't right! (%u)\n", tag) ;
+                                       status = kALAC_ParamError ;
+                                       goto Exit ;
+                       }
+
+                       RequireNoErr (status, goto Exit ;) ;
+               }
+       }
+
+#if VERBOSE_DEBUG
+{
+       // if there is room left in the output buffer, add some random fill data to test decoder
+       int32_t                 bitsLeft ;
+       int32_t                 bytesLeft ;
+
+       bitsLeft = BitBufferGetPosition (&bitstream) - 3 ;      // - 3 for ID_END tag
+       bytesLeft = bitstream.byteSize - ((bitsLeft + 7) / 8) ;
+
+       if ((bytesLeft > 20) && ((bytesLeft & 0x4u) != 0))
+               AddFiller (&bitstream, bytesLeft) ;
+}
+#endif
+
+       // add 3-bit frame end tag: ID_END
+       BitBufferWrite (&bitstream, ID_END, 3) ;
+
+       // byte-align the output data
+       BitBufferByteAlign (&bitstream, true) ;
+
+       outputSize = BitBufferGetPosition (&bitstream) / 8 ;
+       //Assert (outputSize <= mMaxOutputBytes) ;
+
+
+       // all good, let iTunes know what happened and remember the total number of input sample frames
+       *ioNumBytes = outputSize ;
+       //mEncodedFrames                           += encodeMsg->numInputSamples ;
+
+       // gather encoding stats
+       p->mTotalBytesGenerated += outputSize ;
+       p->mMaxFrameBytes = MAX (p->mMaxFrameBytes, outputSize) ;
+
+       status = ALAC_noErr ;
+
+Exit:
+       return status ;
+}
+
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+/*
+       GetConfig ()
+*/
+void
+GetConfig (ALAC_ENCODER *p, ALACSpecificConfig * config)
+{
+       config->frameLength                     = Swap32NtoB (p->mFrameSize) ;
+       config->compatibleVersion       = (uint8_t) kALACCompatibleVersion ;
+       config->bitDepth                        = (uint8_t) p->mBitDepth ;
+       config->pb                                      = (uint8_t) PB0 ;
+       config->kb                                      = (uint8_t) KB0 ;
+       config->mb                                      = (uint8_t) MB0 ;
+       config->numChannels                     = (uint8_t) p->mNumChannels ;
+       config->maxRun                          = Swap16NtoB ((uint16_t) MAX_RUN_DEFAULT) ;
+       config->maxFrameBytes           = Swap32NtoB (p->mMaxFrameBytes) ;
+       config->avgBitRate                      = Swap32NtoB (p->mAvgBitRate) ;
+       config->sampleRate                      = Swap32NtoB (p->mOutputSampleRate) ;
+}
+
+uint32_t
+alac_get_magic_cookie_size (uint32_t inNumChannels)
+{
+       if (inNumChannels > 2)
+       {
+               return sizeof (ALACSpecificConfig) + kChannelAtomSize + sizeof (ALACAudioChannelLayout) ;
+       }
+       else
+       {
+               return sizeof (ALACSpecificConfig) ;
+       }
+}
+
+void
+alac_get_magic_cookie (ALAC_ENCODER *p, void * outCookie, uint32_t * ioSize)
+{
+       ALACSpecificConfig theConfig = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ;
+       ALACAudioChannelLayout theChannelLayout = { 0, 0, 0 } ;
+       uint8_t theChannelAtom [kChannelAtomSize] = { 0, 0, 0, 0, 'c', 'h', 'a', 'n', 0, 0, 0, 0 } ;
+       uint32_t theCookieSize = sizeof (ALACSpecificConfig) ;
+       uint8_t * theCookiePointer = (uint8_t *) outCookie ;
+
+       GetConfig (p, &theConfig) ;
+       if (theConfig.numChannels > 2)
+       {
+               theChannelLayout.mChannelLayoutTag = Swap32NtoB (ALACChannelLayoutTags [theConfig.numChannels - 1]) ;
+               theCookieSize += (sizeof (ALACAudioChannelLayout) + kChannelAtomSize) ;
+       }
+       if (*ioSize >= theCookieSize)
+       {
+               memcpy (theCookiePointer, &theConfig, sizeof (ALACSpecificConfig)) ;
+               theChannelAtom [3] = (sizeof (ALACAudioChannelLayout) + kChannelAtomSize) ;
+               if (theConfig.numChannels > 2)
+               {
+                       theCookiePointer += sizeof (ALACSpecificConfig) ;
+                       memcpy (theCookiePointer, theChannelAtom, kChannelAtomSize) ;
+                       theCookiePointer += kChannelAtomSize ;
+                       memcpy (theCookiePointer, &theChannelLayout, sizeof (ALACAudioChannelLayout)) ;
+               }
+               *ioSize = theCookieSize ;
+       }
+       else
+       {
+               *ioSize = 0 ; // no incomplete cookies
+       }
+}
+
+/*
+       alac_encoder_init ()
+       - initialize the encoder component with the current config
+*/
+int32_t
+alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize)
+{
+       int32_t                 status ;
+
+       p->mFrameSize = (frameSize > 0 && frameSize <= ALAC_FRAME_LENGTH) ? frameSize : ALAC_FRAME_LENGTH ;
+
+       p->mOutputSampleRate = samplerate ;
+       p->mNumChannels = channels ;
+       switch (format_flags)
+       {
+               case 1:
+                       p->mBitDepth = 16 ;
+                       break ;
+               case 2:
+                       p->mBitDepth = 20 ;
+                       break ;
+               case 3:
+                       p->mBitDepth = 24 ;
+                       break ;
+               case 4:
+                       p->mBitDepth = 32 ;
+                       break ;
+               default:
+                       break ;
+       }
+
+       // set up default encoding parameters and state
+       // - note: mFrameSize is set in the constructor or via alac_set_frame_size () which must be called before this routine
+       for (uint32_t indx = 0 ; indx < kALACMaxChannels ; indx++)
+               p->mLastMixRes [indx] = kDefaultMixRes ;
+
+       // the maximum output frame size can be no bigger than (samplesPerBlock * numChannels * ((10 + sampleSize)/8) + 1)
+       // but note that this can be bigger than the input size!
+       // - since we don't yet know what our input format will be, use our max allowed sample size in the calculation
+       p->mMaxOutputBytes = p->mFrameSize * p->mNumChannels * ((10 + kMaxSampleSize) / 8) + 1 ;
+
+       status = ALAC_noErr ;
+
+       // initialize coefs arrays once b/c retaining state across blocks actually improves the encode ratio
+       for (int32_t channel = 0 ; channel < (int32_t) p->mNumChannels ; channel++)
+       {
+               for (int32_t search = 0 ; search < kALACMaxSearches ; search++)
+               {
+                       init_coefs (p->mCoefsU [channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs) ;
+                       init_coefs (p->mCoefsV [channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs) ;
+               }
+       }
+
+       return status ;
+}
+
+/*
+       alac_get_source_format ()
+       - given the input format, return one of our supported formats
+*/
+void
+alac_get_source_format (ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output)
+{
+       (void) output ;
+       // default is 16-bit native endian
+       // - note: for float input we assume that's coming from one of our decoders (mp3, aac) so it only makes sense
+       //                 to encode to 16-bit since the source was lossy in the first place
+       // - note: if not a supported bit depth, find the closest supported bit depth to the input one
+       if ((source->mFormatID != kALACFormatLinearPCM) || ((source->mFormatFlags & kALACFormatFlagIsFloat) != 0) || (source->mBitsPerChannel <= 16))
+               p->mBitDepth = 16 ;
+       else if (source->mBitsPerChannel <= 20)
+               p->mBitDepth = 20 ;
+       else if (source->mBitsPerChannel <= 24)
+               p->mBitDepth = 24 ;
+       else
+               p->mBitDepth = 32 ;
+
+       // we support 16/20/24/32-bit integer data at any sample rate and our target number of channels
+       // and sample rate were specified when we were configured
+       /*
+       MakeUncompressedAudioFormat (mNumChannels, (float) mOutputSampleRate, mBitDepth, kAudioFormatFlagsNativeIntegerPacked, output) ;
+       */
+}
+
+
+
+#if VERBOSE_DEBUG
+
+#if PRAGMA_MARK
+#pragma mark -
+#endif
+
+/*
+       AddFiller ()
+       - add fill and data stream elements to the bitstream to test the decoder
+*/
+static void AddFiller (BitBuffer * bits, int32_t numBytes)
+{
+       uint8_t         tag ;
+       int32_t         indx ;
+
+       // out of lameness, subtract 6 bytes to deal with header + alignment as required for fill/data elements
+       numBytes -= 6 ;
+       if (numBytes <= 0)
+               return ;
+
+       // randomly pick Fill or Data Stream Element based on numBytes requested
+       tag = (numBytes & 0x8) ? ID_FIL : ID_DSE ;
+
+       BitBufferWrite (bits, tag, 3) ;
+       if (tag == ID_FIL)
+       {
+               // can't write more than 269 bytes in a fill element
+               numBytes = (numBytes > 269) ? 269 : numBytes ;
+
+               // fill element = 4-bit size unless >= 15 then 4-bit size + 8-bit extension size
+               if (numBytes >= 15)
+               {
+                       uint16_t                        extensionSize ;
+
+                       BitBufferWrite (bits, 15, 4) ;
+
+                       // 8-bit extension count field is "extra + 1" which is weird but I didn't define the syntax
+                       // - otherwise, there's no way to represent 15
+                       // - for example, to really mean 15 bytes you must encode extensionSize = 1
+                       // - why it's not like data stream elements I have no idea
+                       extensionSize = (numBytes - 15) + 1 ;
+                       //Assert (extensionSize <= 255) ;
+                       BitBufferWrite (bits, extensionSize, 8) ;
+               }
+               else
+                       BitBufferWrite (bits, numBytes, 4) ;
+
+               BitBufferWrite (bits, 0x10, 8) ;                // extension_type = FILL_DATA = b0001 or'ed with fill_nibble = b0000
+               for (indx = 0 ; indx < (numBytes - 1) ; indx++)
+                       BitBufferWrite (bits, 0xa5, 8) ;        // fill_byte = b10100101 = 0xa5
+       }
+       else
+       {
+               // can't write more than 510 bytes in a data stream element
+               numBytes = (numBytes > 510) ? 510 : numBytes ;
+
+               BitBufferWrite (bits, 0, 4) ;                   // element instance tag
+               BitBufferWrite (bits, 1, 1) ;                   // byte-align flag = true
+
+               // data stream element = 8-bit size unless >= 255 then 8-bit size + 8-bit size
+               if (numBytes >= 255)
+               {
+                       BitBufferWrite (bits, 255, 8) ;
+                       BitBufferWrite (bits, numBytes - 255, 8) ;
+               }
+               else
+                       BitBufferWrite (bits, numBytes, 8) ;
+
+               BitBufferByteAlign (bits, true) ;               // byte-align with zeros
+
+               for (indx = 0 ; indx < numBytes ; indx++)
+                       BitBufferWrite (bits, 0x5a, 8) ;
+       }
+}
+
+#endif /* VERBOSE_DEBUG */
diff --git a/src/ALAC/dp_dec.c b/src/ALAC/dp_dec.c
new file mode 100644 (file)
index 0000000..4f5bc1d
--- /dev/null
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           dp_dec.c
+
+       Contains:       Dynamic Predictor decode routines
+
+       Copyright:      (c) 2001-2011 Apple, Inc.
+*/
+
+
+#include <string.h>
+
+#include "dplib.h"
+#include "shift.h"
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+#define LOOP_ALIGN
+
+static inline int32_t ALWAYS_INLINE
+sign_of_int (int32_t i)
+{
+       int32_t negishift ;
+
+       negishift = ((uint32_t) - i) >> 31 ;
+       return negishift | (i >> 31) ;
+}
+
+void
+unpc_block (const int32_t * pc1, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift)
+{
+       register int16_t        a0, a1, a2, a3 ;
+       register int32_t        b0, b1, b2, b3 ;
+       int32_t                                 j, k, lim ;
+       int32_t                         sum1, sg, sgn, top, dd ;
+       int32_t *                       pout ;
+       int32_t                         del, del0 ;
+       uint32_t                        chanshift = 32 - chanbits ;
+       int32_t                         denhalf = 1 << (denshift - 1) ;
+
+       out [0] = pc1 [0] ;
+       if (numactive == 0)
+       {
+               // just copy if numactive == 0 (but don't bother if in/out pointers the same)
+               if ((num > 1) && (pc1 != out))
+                       memcpy (&out [1], &pc1 [1], (num - 1) * sizeof (int32_t)) ;
+               return ;
+       }
+       if (numactive == 31)
+       {
+               // short-circuit if numactive == 31
+               int32_t         prev ;
+
+               /*      this code is written such that the in/out buffers can be the same
+                       to conserve buffer space on embedded devices like the iPod
+
+                       (original code)
+                       for (j = 1 ; j < num ; j++)
+                               del = pc1 [j] + out [j-1] ;
+                               out [j] = (del << chanshift) >> chanshift ;
+               */
+               prev = out [0] ;
+               for (j = 1 ; j < num ; j++)
+               {
+                       del = pc1 [j] + prev ;
+                       prev = (del << chanshift) >> chanshift ;
+                       out [j] = prev ;
+               }
+               return ;
+       }
+
+       for (j = 1 ; j <= numactive ; j++)
+       {
+               del = pc1 [j] + out [j-1] ;
+               out [j] = arith_shift_left (del, chanshift) >> chanshift ;
+       }
+
+       lim = numactive + 1 ;
+
+       if (numactive == 4)
+       {
+               // optimization for numactive == 4
+               register int16_t        ia0, ia1, ia2, ia3 ;
+               register int32_t        ib0, ib1, ib2, ib3 ;
+
+               ia0 = coefs [0] ;
+               ia1 = coefs [1] ;
+               ia2 = coefs [2] ;
+               ia3 = coefs [3] ;
+
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       top = out [j - lim] ;
+                       pout = out + j - 1 ;
+
+                       ib0 = top - pout [0] ;
+                       ib1 = top - pout [-1] ;
+                       ib2 = top - pout [-2] ;
+                       ib3 = top - pout [-3] ;
+
+                       sum1 = (denhalf - ia0 * ib0 - ia1 * ib1 - ia2 * ib2 - ia3 * ib3) >> denshift ;
+
+                       del = pc1 [j] ;
+                       del0 = del ;
+                       sg = sign_of_int (del) ;
+                       del += top + sum1 ;
+
+                       out [j] = arith_shift_left (del, chanshift) >> chanshift ;
+
+                       if (sg > 0)
+                       {
+                               sgn = sign_of_int (ib3) ;
+                               ia3 -= sgn ;
+                               del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (ib2) ;
+                               ia2 -= sgn ;
+                               del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (ib1) ;
+                               ia1 -= sgn ;
+                               del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               ia0 -= sign_of_int (ib0) ;
+                       }
+                       else if (sg < 0)
+                       {
+                               // note: to avoid unnecessary negations, we flip the value of "sgn"
+                               sgn = -sign_of_int (ib3) ;
+                               ia3 -= sgn ;
+                               del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (ib2) ;
+                               ia2 -= sgn ;
+                               del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (ib1) ;
+                               ia1 -= sgn ;
+                               del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               ia0 += sign_of_int (ib0) ;
+                       }
+               }
+
+               coefs [0] = ia0 ;
+               coefs [1] = ia1 ;
+               coefs [2] = ia2 ;
+               coefs [3] = ia3 ;
+       }
+       else if (numactive == 8)
+       {
+               register int16_t        a4, a5, a6, a7 ;
+               register int32_t        b4, b5, b6, b7 ;
+
+               // optimization for numactive == 8
+               a0 = coefs [0] ;
+               a1 = coefs [1] ;
+               a2 = coefs [2] ;
+               a3 = coefs [3] ;
+               a4 = coefs [4] ;
+               a5 = coefs [5] ;
+               a6 = coefs [6] ;
+               a7 = coefs [7] ;
+
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       top = out [j - lim] ;
+                       pout = out + j - 1 ;
+
+                       b0 = top - (*pout--) ;
+                       b1 = top - (*pout--) ;
+                       b2 = top - (*pout--) ;
+                       b3 = top - (*pout--) ;
+                       b4 = top - (*pout--) ;
+                       b5 = top - (*pout--) ;
+                       b6 = top - (*pout--) ;
+                       b7 = top - (*pout) ;
+                       pout += 8 ;
+
+                       sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3
+                                       - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift ;
+
+                       del = pc1 [j] ;
+                       del0 = del ;
+                       sg = sign_of_int (del) ;
+                       del += top + sum1 ;
+
+                       out [j] = arith_shift_left (del, chanshift) >> chanshift ;
+
+                       if (sg > 0)
+                       {
+                               sgn = sign_of_int (b7) ;
+                               a7 -= sgn ;
+                               del0 -= 1 * ((sgn * b7) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b6) ;
+                               a6 -= sgn ;
+                               del0 -= 2 * ((sgn * b6) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b5) ;
+                               a5 -= sgn ;
+                               del0 -= 3 * ((sgn * b5) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b4) ;
+                               a4 -= sgn ;
+                               del0 -= 4 * ((sgn * b4) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= 5 * ((sgn * b3) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= 6 * ((sgn * b2) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= 7 * ((sgn * b1) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               a0 -= sign_of_int (b0) ;
+                       }
+                       else if (sg < 0)
+                       {
+                               // note: to avoid unnecessary negations, we flip the value of "sgn"
+                               sgn = -sign_of_int (b7) ;
+                               a7 -= sgn ;
+                               del0 -= 1 * ((sgn * b7) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b6) ;
+                               a6 -= sgn ;
+                               del0 -= 2 * ((sgn * b6) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b5) ;
+                               a5 -= sgn ;
+                               del0 -= 3 * ((sgn * b5) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b4) ;
+                               a4 -= sgn ;
+                               del0 -= 4 * ((sgn * b4) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= 5 * ((sgn * b3) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= 6 * ((sgn * b2) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= 7 * ((sgn * b1) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               a0 += sign_of_int (b0) ;
+                       }
+               }
+
+               coefs [0] = a0 ;
+               coefs [1] = a1 ;
+               coefs [2] = a2 ;
+               coefs [3] = a3 ;
+               coefs [4] = a4 ;
+               coefs [5] = a5 ;
+               coefs [6] = a6 ;
+               coefs [7] = a7 ;
+       }
+       else
+       {
+               // general case
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       sum1 = 0 ;
+                       pout = out + j - 1 ;
+                       top = out [j-lim] ;
+
+                       for (k = 0 ; k < numactive ; k++)
+                               sum1 += coefs [k] * (pout [-k] - top) ;
+
+                       del = pc1 [j] ;
+                       del0 = del ;
+                       sg = sign_of_int (del) ;
+                       del += top + ((sum1 + denhalf) >> denshift) ;
+                       out [j] = (del << chanshift) >> chanshift ;
+
+                       if (sg > 0)
+                       {
+                               for (k = (numactive - 1) ; k >= 0 ; k--)
+                               {
+                                       dd = top - pout [-k] ;
+                                       sgn = sign_of_int (dd) ;
+                                       coefs [k] -= sgn ;
+                                       del0 -= (numactive - k) * ((sgn * dd) >> denshift) ;
+                                       if (del0 <= 0)
+                                               break ;
+                               }
+                       }
+                       else if (sg < 0)
+                       {
+                               for (k = (numactive - 1) ; k >= 0 ; k--)
+                               {
+                                       dd = top - pout [-k] ;
+                                       sgn = sign_of_int (dd) ;
+                                       coefs [k] += sgn ;
+                                       del0 -= (numactive - k) * ((-sgn * dd) >> denshift) ;
+                                       if (del0 >= 0)
+                                               break ;
+                               }
+                       }
+               }
+       }
+}
diff --git a/src/ALAC/dp_enc.c b/src/ALAC/dp_enc.c
new file mode 100644 (file)
index 0000000..ad098a4
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           dp_enc.c
+
+       Contains:       Dynamic Predictor encode routines
+
+       Copyright:      (c) 2001-2011 Apple, Inc.
+*/
+
+#include <string.h>
+
+#include "dplib.h"
+#include "shift.h"
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+#define LOOP_ALIGN
+
+void
+init_coefs (int16_t * coefs, uint32_t denshift, int32_t numPairs)
+{
+       int32_t         k ;
+       int32_t         den = 1 << denshift ;
+
+       coefs [0] = (AINIT * den) >> 4 ;
+       coefs [1] = (BINIT * den) >> 4 ;
+       coefs [2] = (CINIT * den) >> 4 ;
+       for (k = 3 ; k < numPairs ; k++)
+               coefs [k] = 0 ;
+}
+
+void
+copy_coefs (const int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs)
+{
+       int32_t k ;
+
+       for (k = 0 ; k < numPairs ; k++)
+               dstCoefs [k] = srcCoefs [k] ;
+}
+
+static inline int32_t ALWAYS_INLINE sign_of_int (int32_t i)
+{
+       int32_t negishift ;
+
+       negishift = ((uint32_t) - i) >> 31 ;
+       return negishift | (i >> 31) ;
+}
+
+void
+pc_block (int32_t * in, int32_t * pc1, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift)
+{
+       register int16_t        a0, a1, a2, a3 ;
+       register int32_t        b0, b1, b2, b3 ;
+       int32_t                                 j, k, lim ;
+       int32_t *                       pin ;
+       int32_t                         sum1, dd ;
+       int32_t                         sg, sgn ;
+       int32_t                         top ;
+       int32_t                         del, del0 ;
+       uint32_t                        chanshift = 32 - chanbits ;
+       int32_t                         denhalf = 1 << (denshift - 1) ;
+
+       pc1 [0] = in [0] ;
+       if (numactive == 0)
+       {
+               // just copy if numactive == 0 (but don't bother if in/out pointers the same)
+               if ((num > 1) && (in != pc1))
+                       memcpy (&pc1 [1], &in [1], (num - 1) * sizeof (int32_t)) ;
+               return ;
+       }
+       if (numactive == 31)
+       {
+               // short-circuit if numactive == 31
+               for (j = 1 ; j < num ; j++)
+               {
+                       del = in [j] - in [j-1] ;
+                       pc1 [j] = (del << chanshift) >> chanshift ;
+               }
+               return ;
+       }
+
+       for (j = 1 ; j <= numactive ; j++)
+       {
+               del = in [j] - in [j-1] ;
+               pc1 [j] = arith_shift_left (del, chanshift) >> chanshift ;
+       }
+
+       lim = numactive + 1 ;
+
+       if (numactive == 4)
+       {
+               // optimization for numactive == 4
+               a0 = coefs [0] ;
+               a1 = coefs [1] ;
+               a2 = coefs [2] ;
+               a3 = coefs [3] ;
+
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       top = in [j - lim] ;
+                       pin = in + j - 1 ;
+
+                       b0 = top - pin [0] ;
+                       b1 = top - pin [-1] ;
+                       b2 = top - pin [-2] ;
+                       b3 = top - pin [-3] ;
+
+                       sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3) >> denshift ;
+
+                       del = in [j] - top - sum1 ;
+                       del = arith_shift_left (del, chanshift) >> chanshift ;
+                       pc1 [j] = del ;
+                       del0 = del ;
+
+                       sg = sign_of_int (del) ;
+                       if (sg > 0)
+                       {
+                               sgn = sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= (4 - 3) * ((sgn * b3) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= (4 - 2) * ((sgn * b2) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= (4 - 1) * ((sgn * b1) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               a0 -= sign_of_int (b0) ;
+                       }
+                       else if (sg < 0)
+                       {
+                               // note: to avoid unnecessary negations, we flip the value of "sgn"
+                               sgn = -sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= (4 - 3) * ((sgn * b3) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= (4 - 2) * ((sgn * b2) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= (4 - 1) * ((sgn * b1) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               a0 += sign_of_int (b0) ;
+                       }
+               }
+
+               coefs [0] = a0 ;
+               coefs [1] = a1 ;
+               coefs [2] = a2 ;
+               coefs [3] = a3 ;
+       }
+       else if (numactive == 8)
+       {
+               // optimization for numactive == 8
+               register int16_t        a4, a5, a6, a7 ;
+               register int32_t        b4, b5, b6, b7 ;
+
+               a0 = coefs [0] ;
+               a1 = coefs [1] ;
+               a2 = coefs [2] ;
+               a3 = coefs [3] ;
+               a4 = coefs [4] ;
+               a5 = coefs [5] ;
+               a6 = coefs [6] ;
+               a7 = coefs [7] ;
+
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       top = in [j - lim] ;
+                       pin = in + j - 1 ;
+
+                       b0 = top - (*pin--) ;
+                       b1 = top - (*pin--) ;
+                       b2 = top - (*pin--) ;
+                       b3 = top - (*pin--) ;
+                       b4 = top - (*pin--) ;
+                       b5 = top - (*pin--) ;
+                       b6 = top - (*pin--) ;
+                       b7 = top - (*pin) ;
+                       pin += 8 ;
+
+                       sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3
+                                       - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift ;
+
+                       del = in [j] - top - sum1 ;
+                       del = arith_shift_left (del, chanshift) >> chanshift ;
+                       pc1 [j] = del ;
+                       del0 = del ;
+
+                       sg = sign_of_int (del) ;
+                       if (sg > 0)
+                       {
+                               sgn = sign_of_int (b7) ;
+                               a7 -= sgn ;
+                               del0 -= 1 * ((sgn * b7) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b6) ;
+                               a6 -= sgn ;
+                               del0 -= 2 * ((sgn * b6) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b5) ;
+                               a5 -= sgn ;
+                               del0 -= 3 * ((sgn * b5) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b4) ;
+                               a4 -= sgn ;
+                               del0 -= 4 * ((sgn * b4) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= 5 * ((sgn * b3) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= 6 * ((sgn * b2) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               sgn = sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= 7 * ((sgn * b1) >> denshift) ;
+                               if (del0 <= 0)
+                                       continue ;
+
+                               a0 -= sign_of_int (b0) ;
+                       }
+                       else if (sg < 0)
+                       {
+                               // note: to avoid unnecessary negations, we flip the value of "sgn"
+                               sgn = -sign_of_int (b7) ;
+                               a7 -= sgn ;
+                               del0 -= 1 * ((sgn * b7) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b6) ;
+                               a6 -= sgn ;
+                               del0 -= 2 * ((sgn * b6) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b5) ;
+                               a5 -= sgn ;
+                               del0 -= 3 * ((sgn * b5) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b4) ;
+                               a4 -= sgn ;
+                               del0 -= 4 * ((sgn * b4) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b3) ;
+                               a3 -= sgn ;
+                               del0 -= 5 * ((sgn * b3) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b2) ;
+                               a2 -= sgn ;
+                               del0 -= 6 * ((sgn * b2) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               sgn = -sign_of_int (b1) ;
+                               a1 -= sgn ;
+                               del0 -= 7 * ((sgn * b1) >> denshift) ;
+                               if (del0 >= 0)
+                                       continue ;
+
+                               a0 += sign_of_int (b0) ;
+                       }
+               }
+
+               coefs [0] = a0 ;
+               coefs [1] = a1 ;
+               coefs [2] = a2 ;
+               coefs [3] = a3 ;
+               coefs [4] = a4 ;
+               coefs [5] = a5 ;
+               coefs [6] = a6 ;
+               coefs [7] = a7 ;
+       }
+       else
+       {
+//pc_block_general:
+               // general case
+               for (j = lim ; j < num ; j++)
+               {
+                       LOOP_ALIGN
+
+                       top = in [j - lim] ;
+                       pin = in + j - 1 ;
+
+                       sum1 = 0 ;
+                       for (k = 0 ; k < numactive ; k++)
+                               sum1 -= coefs [k] * (top - pin [-k]) ;
+
+                       del = in [j] - top - ((sum1 + denhalf) >> denshift) ;
+                       del = (del << chanshift) >> chanshift ;
+                       pc1 [j] = del ;
+                       del0 = del ;
+
+                       sg = sign_of_int (del) ;
+                       if (sg > 0)
+                       {
+                               for (k = (numactive - 1) ; k >= 0 ; k--)
+                               {
+                                       dd = top - pin [-k] ;
+                                       sgn = sign_of_int (dd) ;
+                                       coefs [k] -= sgn ;
+                                       del0 -= (numactive - k) * ((sgn * dd) >> denshift) ;
+                                       if (del0 <= 0)
+                                               break ;
+                               }
+                       }
+                       else if (sg < 0)
+                       {
+                               for (k = (numactive - 1) ; k >= 0 ; k--)
+                               {
+                                       dd = top - pin [-k] ;
+                                       sgn = sign_of_int (dd) ;
+                                       coefs [k] += sgn ;
+                                       del0 -= (numactive - k) * ((-sgn * dd) >> denshift) ;
+                                       if (del0 >= 0)
+                                               break ;
+                               }
+                       }
+               }
+       }
+}
diff --git a/src/ALAC/dplib.h b/src/ALAC/dplib.h
new file mode 100644 (file)
index 0000000..43ae721
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           dplib.h
+
+       Contains:       Dynamic Predictor routines
+
+       Copyright:      Copyright (C) 2001-2011 Apple, Inc.
+*/
+
+#ifndef __DPLIB_H__
+#define __DPLIB_H__
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// defines
+
+#define DENSHIFT_MAX   15
+#define DENSHIFT_DEFAULT 9
+#define AINIT 38
+#define BINIT (-29)
+#define CINIT (-2)
+#define NUMCOEPAIRS 16
+
+// prototypes
+
+void init_coefs (int16_t * coefs, uint32_t denshift, int32_t numPairs) ;
+void copy_coefs (const int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs) ;
+
+// NOTE: these routines read at least "numactive" samples so the i/o buffers must be at least that big
+
+void pc_block (int32_t * in, int32_t * pc, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) ;
+void unpc_block (const int32_t * pc, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) ;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DPLIB_H__ */
diff --git a/src/ALAC/matrix_dec.c b/src/ALAC/matrix_dec.c
new file mode 100644 (file)
index 0000000..6d0b401
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           matrix_dec.c
+
+       Contains:       ALAC mixing/matrixing decode routines.
+
+       Copyright:      (c) 2004-2011 Apple, Inc.
+*/
+
+#include "matrixlib.h"
+#include "ALACAudioTypes.h"
+#include "shift.h"
+
+// up to 24-bit "offset" macros for the individual bytes of a 20/24-bit word
+#if TARGET_RT_BIG_ENDIAN
+       #define LBYTE   2
+       #define MBYTE   1
+       #define HBYTE   0
+#else
+       #define LBYTE   0
+       #define MBYTE   1
+       #define HBYTE   2
+#endif
+
+/*
+    There is no plain middle-side option ; instead there are various mixing
+    modes including middle-side, each lossless, as embodied in the mix ()
+    and unmix () functions.  These functions exploit a generalized middle-side
+    transformation:
+
+    u := [(rL + (m-r)R)/m] ;
+    v := L - R ;
+
+    where [ ] denotes integer floor.  The (lossless) inverse is
+
+    L = u + v - [rV/m] ;
+    R = L - v ;
+*/
+
+// 16-bit routines
+
+void
+unmix16 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres)
+{
+       int32_t         j ;
+
+       if (mixres != 0)
+       {
+               /* matrixed stereo */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       int32_t         l, r ;
+
+                       l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ;
+                       r = l - v [j] ;
+
+                       out [0] = arith_shift_left (l, 16) ;
+                       out [1] = arith_shift_left (r, 16) ;
+                       out += stride ;
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       out [0] = u [j] << 16 ;
+                       out [1] = v [j] << 16 ;
+                       out += stride ;
+               }
+       }
+}
+
+// 20-bit routines
+// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers
+
+void
+unmix20 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres)
+{
+       int32_t         j ;
+
+       if (mixres != 0)
+       {
+               /* matrixed stereo */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       int32_t         l, r ;
+
+                       l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ;
+                       r = l - v [j] ;
+
+                       out [0] = arith_shift_left (l, 12) ;
+                       out [1] = arith_shift_left (r, 12) ;
+                       out += stride ;
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       out [0] = arith_shift_left (u [j], 12) ;
+                       out [1] = arith_shift_left (v [j], 12) ;
+                       out += stride ;
+               }
+       }
+}
+
+// 24-bit routines
+// - the 24 bits of data are right-justified in the input/output predictor buffers
+
+void
+unmix24 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples,
+                               int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted)
+{
+       int32_t         shift = bytesShifted * 8 ;
+       int32_t         l, r ;
+       int32_t                 j, k ;
+
+       if (mixres != 0)
+       {
+               /* matrixed stereo */
+               if (bytesShifted != 0)
+               {
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ;
+                               r = l - v [j] ;
+
+                               l = arith_shift_left (l, shift) | (uint32_t) shiftUV [k + 0] ;
+                               r = arith_shift_left (r, shift) | (uint32_t) shiftUV [k + 1] ;
+
+                               out [0] = arith_shift_left (l, 8) ;
+                               out [1] = arith_shift_left (r, 8) ;
+                               out += stride ;
+                       }
+               }
+               else
+               {
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ;
+                               r = l - v [j] ;
+
+                               out [0] = l << 8 ;
+                               out [1] = r << 8 ;
+                               out += stride ;
+                       }
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               if (bytesShifted != 0)
+               {
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               l = u [j] ;
+                               r = v [j] ;
+
+                               l = (l << shift) | (uint32_t) shiftUV [k + 0] ;
+                               r = (r << shift) | (uint32_t) shiftUV [k + 1] ;
+
+                               out [0] = l << 8 ;
+                               out [1] = r << 8 ;
+                               out += stride ;
+                       }
+               }
+               else
+               {
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               out [0] = u [j] << 8 ;
+                               out [1] = v [j] << 8 ;
+                               out += stride ;
+                       }
+               }
+       }
+}
+
+// 32-bit routines
+// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit
+// - otherwise, the calculations might overflow into the 33rd bit and be lost
+// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers
+
+void
+unmix32 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples,
+                               int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted)
+{
+       int32_t         shift = bytesShifted * 8 ;
+       int32_t         l, r ;
+       int32_t         j, k ;
+
+       if (mixres != 0)
+       {
+               //Assert (bytesShifted != 0) ;
+
+               /* matrixed stereo with shift */
+               for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+               {
+                       int32_t         lt, rt ;
+
+                       lt = u [j] ;
+                       rt = v [j] ;
+
+                       l = lt + rt - ((mixres * rt) >> mixbits) ;
+                       r = l - rt ;
+
+                       out [0] = arith_shift_left (l, shift) | (uint32_t) shiftUV [k + 0] ;
+                       out [1] = arith_shift_left (r, shift) | (uint32_t) shiftUV [k + 1] ;
+                       out += stride ;
+               }
+       }
+       else
+       {
+               if (bytesShifted == 0)
+               {
+                       /* interleaving w/o shift */
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               out [0] = u [j] ;
+                               out [1] = v [j] ;
+                               out += stride ;
+                       }
+               }
+               else
+               {
+                       /* interleaving with shift */
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               out [0] = (u [j] << shift) | (uint32_t) shiftUV [k + 0] ;
+                               out [1] = (v [j] << shift) | (uint32_t) shiftUV [k + 1] ;
+                               out += stride ;
+                       }
+               }
+       }
+}
+
+// 20/24-bit <-> 32-bit helper routines (not really matrixing but convenient to put here)
+
+void
+copyPredictorTo24 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples)
+{
+       int32_t         j ;
+
+       for (j = 0 ; j < numSamples ; j++)
+       {
+               out [0] = in [j] << 8 ;
+               out += stride ;
+       }
+}
+
+void
+copyPredictorTo24Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted)
+{
+       int32_t         shiftVal = bytesShifted * 8 ;
+       int32_t         j ;
+
+       //Assert (bytesShifted != 0) ;
+
+       for (j = 0 ; j < numSamples ; j++)
+       {
+               int32_t         val = in [j] ;
+
+               val = arith_shift_left (val, shiftVal) | (uint32_t) shift [j] ;
+               out [0] = arith_shift_left (val, 8) ;
+               out += stride ;
+       }
+}
+
+void
+copyPredictorTo20 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples)
+{
+       int32_t         j ;
+
+       // 32-bit predictor values are right-aligned but 20-bit output values should be left-aligned
+       // in the 24-bit output buffer
+       for (j = 0 ; j < numSamples ; j++)
+       {
+               out [0] = arith_shift_left (in [j], 12) ;
+               out += stride ;
+       }
+}
+
+void
+copyPredictorTo32 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples)
+{
+       int32_t                 i, j ;
+
+       // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem
+       for (i = 0, j = 0 ; i < numSamples ; i++, j += stride)
+               out [j] = arith_shift_left (in [i], 8) ;
+}
+
+void
+copyPredictorTo32Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted)
+{
+       int32_t *               op = out ;
+       uint32_t                shiftVal = bytesShifted * 8 ;
+       int32_t                 j ;
+
+       //Assert (bytesShifted != 0) ;
+
+       // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem
+       for (j = 0 ; j < numSamples ; j++)
+       {
+               op [0] = arith_shift_left (in [j], shiftVal) | (uint32_t) shift [j] ;
+               op += stride ;
+       }
+}
diff --git a/src/ALAC/matrix_enc.c b/src/ALAC/matrix_enc.c
new file mode 100644 (file)
index 0000000..b50f83b
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           matrix_enc.c
+
+       Contains:       ALAC mixing/matrixing encode routines.
+
+       Copyright:      (c) 2004-2011 Apple, Inc.
+*/
+
+#include "matrixlib.h"
+#include "ALACAudioTypes.h"
+
+/*
+    There is no plain middle-side option ; instead there are various mixing
+    modes including middle-side, each lossless, as embodied in the mix ()
+    and unmix () functions.  These functions exploit a generalized middle-side
+    transformation:
+
+    u := [(rL + (m-r)R)/m] ;
+    v := L - R ;
+
+    where [ ] denotes integer floor.  The (lossless) inverse is
+
+    L = u + v - [rV/m] ;
+    R = L - v ;
+*/
+
+// 16-bit routines
+
+void
+mix16 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres)
+{
+       int32_t         j ;
+
+       if (mixres != 0)
+       {
+               int32_t         mod = 1 << mixbits ;
+               int32_t         m2 ;
+
+               /* matrixed stereo */
+               m2 = mod - mixres ;
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       int32_t         l, r ;
+
+                       l = in [0] >> 16 ;
+                       r = in [1] >> 16 ;
+                       in += stride ;
+                       u [j] = (mixres * l + m2 * r) >> mixbits ;
+                       v [j] = l - r ;
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       u [j] = in [0] >> 16 ;
+                       v [j] = in [1] >> 16 ;
+                       in += stride ;
+               }
+       }
+}
+
+// 20-bit routines
+// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers
+
+void
+mix20 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres)
+{
+       int32_t         l, r ;
+       int32_t         j ;
+
+       if (mixres != 0)
+       {
+               /* matrixed stereo */
+               int32_t         mod = 1 << mixbits ;
+               int32_t         m2 = mod - mixres ;
+
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       l = in [0] >> 12 ;
+                       r = in [1] >> 12 ;
+                       in += stride ;
+
+                       u [j] = (mixres * l + m2 * r) >> mixbits ;
+                       v [j] = l - r ;
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               for (j = 0 ; j < numSamples ; j++)
+               {
+                       u [j] = in [0] >> 12 ;
+                       v [j] = in [1] >> 12 ;
+                       in += stride ;
+               }
+       }
+}
+
+// 24-bit routines
+// - the 24 bits of data are right-justified in the input/output predictor buffers
+
+void
+mix24 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples,
+                       int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted)
+{
+       int32_t         l, r ;
+       int32_t         shift = bytesShifted * 8 ;
+       uint32_t        mask = (1ul << shift) - 1 ;
+       int32_t         j, k ;
+
+       if (mixres != 0)
+       {
+               /* matrixed stereo */
+               int32_t         mod = 1 << mixbits ;
+               int32_t         m2 = mod - mixres ;
+
+               if (bytesShifted != 0)
+               {
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               l = in [0] >> 8 ;
+                               r = in [1] >> 8 ;
+                               in += stride ;
+
+                               shiftUV [k + 0] = (uint16_t) (l & mask) ;
+                               shiftUV [k + 1] = (uint16_t) (r & mask) ;
+
+                               l >>= shift ;
+                               r >>= shift ;
+
+                               u [j] = (mixres * l + m2 * r) >> mixbits ;
+                               v [j] = l - r ;
+                       }
+               }
+               else
+               {
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               l = in [0] >> 8 ;
+                               r = in [1] >> 8 ;
+                               in += stride ;
+
+                               u [j] = (mixres * l + m2 * r) >> mixbits ;
+                               v [j] = l - r ;
+                       }
+               }
+       }
+       else
+       {
+               /* Conventional separated stereo. */
+               if (bytesShifted != 0)
+               {
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               l = in [0] >> 8 ;
+                               r = in [1] >> 8 ;
+                               in += stride ;
+
+                               shiftUV [k + 0] = (uint16_t) (l & mask) ;
+                               shiftUV [k + 1] = (uint16_t) (r & mask) ;
+
+                               l >>= shift ;
+                               r >>= shift ;
+
+                               u [j] = l ;
+                               v [j] = r ;
+                       }
+               }
+               else
+               {
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               l = in [0] >> 8 ;
+                               r = in [1] >> 8 ;
+                               in += stride ;
+                       }
+               }
+       }
+}
+
+// 32-bit routines
+// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit
+// - otherwise, the calculations might overflow into the 33rd bit and be lost
+// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers
+
+void
+mix32 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples,
+                       int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted)
+{
+       int32_t         shift = bytesShifted * 8 ;
+       uint32_t        mask = (1ul << shift) - 1 ;
+       int32_t         l, r ;
+       int32_t         j, k ;
+
+       if (mixres != 0)
+       {
+               int32_t         mod = 1 << mixbits ;
+               int32_t         m2 ;
+
+               //Assert (bytesShifted != 0) ;
+
+               /* matrixed stereo with shift */
+               m2 = mod - mixres ;
+               for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+               {
+                       l = in [0] ;
+                       r = in [1] ;
+                       in += stride ;
+
+                       shiftUV [k + 0] = (uint16_t) (l & mask) ;
+                       shiftUV [k + 1] = (uint16_t) (r & mask) ;
+
+                       l >>= shift ;
+                       r >>= shift ;
+
+                       u [j] = (mixres * l + m2 * r) >> mixbits ;
+                       v [j] = l - r ;
+               }
+       }
+       else
+       {
+               if (bytesShifted == 0)
+               {
+                       /* de-interleaving w/o shift */
+                       for (j = 0 ; j < numSamples ; j++)
+                       {
+                               u [j] = in [0] ;
+                               v [j] = in [1] ;
+                               in += stride ;
+                       }
+               }
+               else
+               {
+                       /* de-interleaving with shift */
+                       for (j = 0, k = 0 ; j < numSamples ; j++, k += 2)
+                       {
+                               l = in [0] ;
+                               r = in [1] ;
+                               in += stride ;
+
+                               shiftUV [k + 0] = (uint16_t) (l & mask) ;
+                               shiftUV [k + 1] = (uint16_t) (r & mask) ;
+
+                               l >>= shift ;
+                               r >>= shift ;
+
+                               u [j] = l ;
+                               v [j] = r ;
+                       }
+               }
+       }
+}
diff --git a/src/ALAC/matrixlib.h b/src/ALAC/matrixlib.h
new file mode 100644 (file)
index 0000000..d9be5fe
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License") ;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+       File:           matrixlib.h
+
+       Contains:       ALAC mixing/matrixing routines to/from 32-bit predictor buffers.
+
+       Copyright:      Copyright (C) 2004 to 2011 Apple, Inc.
+*/
+
+#ifndef __MATRIXLIB_H
+#define __MATRIXLIB_H
+
+#pragma once
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// 16-bit routines
+void   mix16 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) ;
+void   unmix16 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) ;
+
+// 20-bit routines
+void   mix20 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) ;
+void   unmix20 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) ;
+
+// 24-bit routines
+// - 24-bit data sometimes compresses better by shifting off the bottom byte so these routines deal with
+//      the specified "unused lower bytes" in the combined "shift" buffer
+void   mix24 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples,
+                               int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ;
+void   unmix24 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples,
+                                       int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ;
+
+// 32-bit routines
+// - note that these really expect the internal data width to be < 32-bit but the arrays are 32-bit
+// - otherwise, the calculations might overflow into the 33rd bit and be lost
+// - therefore, these routines deal with the specified "unused lower" bytes in the combined "shift" buffer
+void   mix32 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples,
+                               int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ;
+void   unmix32 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples,
+                               int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ;
+
+// 20/24/32-bit <-> 32-bit helper routines (not really matrixing but convenient to put here)
+void   copy20ToPredictor (const int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples) ;
+void   copy24ToPredictor (const int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples) ;
+
+void   copyPredictorTo24 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ;
+void   copyPredictorTo24Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) ;
+void   copyPredictorTo20 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ;
+
+void   copyPredictorTo32 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ;
+void   copyPredictorTo32Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) ;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MATRIXLIB_H */
diff --git a/src/ALAC/shift.h b/src/ALAC/shift.h
new file mode 100644 (file)
index 0000000..7c2d6f6
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+** Copyright (C) 2014 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+
+static inline int32_t ALWAYS_INLINE
+arith_shift_left (int32_t x, int shift)
+{      return (int32_t) (((uint32_t) x) << shift) ;
+} /* arith_shift_left */
index d305ba8..826d42c 100644 (file)
@@ -29,7 +29,7 @@
  *
  * Description:
  *
- * g721_encoder(), g721_decoder()
+ * g721_encoder (), g721_decoder ()
  *
  * These routines comprise an implementation of the CCITT G.721 ADPCM
  * coding algorithm.  Essentially, this implementation is identical to
 #include "g72x.h"
 #include "g72x_priv.h"
 
-static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
+static short qtab_721 [7] = { -124, 80, 178, 246, 300, 349, 400 } ;
 /*
  * Maps G.721 code word to reconstructed scale factor normalized log
  * magnitude values.
  */
-static short   _dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
-                               425, 373, 323, 273, 213, 135, 4, -2048};
+static short _dqlntab [16] = { -2048, 4, 135, 213, 273, 323, 373, 425,
+                                                       425, 373, 323, 273, 213, 135, 4, -2048 } ;
 
 /* Maps G.721 code word to log of scale factor multiplier. */
-static short   _witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
-                               1122, 355, 198, 112, 64, 41, 18, -12};
+static short _witab [16] = { -12, 18, 41, 64, 112, 198, 355, 1122,
+                                                       1122, 355, 198, 112, 64, 41, 18, -12 } ;
 /*
  * Maps G.721 code words to a set of values whose long and short
  * term averages are computed and then compared to give an indication
  * how stationary (steady state) the signal is.
  */
-static short   _fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
-                               0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
+static short _fitab [16] = { 0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
+                                                       0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0 } ;
 
 /*
- * g721_encoder()
+ * g721_encoder ()
  *
  * Encodes the input vale of linear PCM, A-law or u-law data sl and returns
  * the resulting code. -1 is returned for unknown input coding value.
  */
 int
-g721_encoder(
+g721_encoder (
        int             sl,
        G72x_STATE *state_ptr)
 {
-       short           sezi, se, sez         /* ACCUM */
-       short           d                     /* SUBTA */
-       short           sr                    /* ADDB */
-       short           y                     /* MIX */
-       short           dqsez                 /* ADDC */
-       short           dq, i;
+       short           sezi, se, sez ;         /* ACCUM */
+       short           d ;                     /* SUBTA */
+       short           sr ;                    /* ADDB */
+       short           y ;                     /* MIX */
+       short           dqsez ;                 /* ADDC */
+       short           dq, i ;
 
        /* linearize input sample to 14-bit PCM */
-       sl >>= 2                      /* 14-bit dynamic range */
+       sl >>= 2 ;                      /* 14-bit dynamic range */
 
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       se = (sezi + predictor_pole(state_ptr)) >> 1;   /* estimated signal */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       se = (sezi + predictor_pole (state_ptr)) >> 1 ; /* estimated signal */
 
-       d = sl - se                           /* estimation difference */
+       d = sl - se ;                           /* estimation difference */
 
        /* quantize the prediction difference */
-       y = step_size(state_ptr);               /* quantizer step size */
-       i = quantize(d, y, qtab_721, 7);        /* i = ADPCM code */
+       y = step_size (state_ptr) ;             /* quantizer step size */
+       i = quantize (d, y, qtab_721, 7) ;      /* i = ADPCM code */
 
-       dq = reconstruct(i & 8, _dqlntab[i], y);        /* quantized est diff */
+       dq = reconstruct (i & 8, _dqlntab [i], y) ;     /* quantized est diff */
 
-       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq  /* reconst. signal */
+       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ;  /* reconst. signal */
 
-       dqsez = sr + sez - se                 /* pole prediction diff. */
+       dqsez = sr + sez - se ;                 /* pole prediction diff. */
 
-       update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+       update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-       return (i);
+       return ;
 }
 
 /*
- * g721_decoder()
+ * g721_decoder ()
  *
  * Description:
  *
@@ -123,33 +123,33 @@ g721_encoder(
  * return -1 for unknown out_coding value.
  */
 int
-g721_decoder(
+g721_decoder (
        int             i,
        G72x_STATE *state_ptr)
 {
-       short           sezi, sei, sez, se    /* ACCUM */
-       short           y                     /* MIX */
-       short           sr                    /* ADDB */
-       short           dq;
-       short           dqsez;
+       short           sezi, sei, sez, se ;    /* ACCUM */
+       short           y ;                     /* MIX */
+       short           sr ;                    /* ADDB */
+       short           dq ;
+       short           dqsez ;
 
-       i &= 0x0f                     /* mask to get proper bits */
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1                 /* se = estimated signal */
+       i &= 0x0f ;                     /* mask to get proper bits */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;                 /* se = estimated signal */
 
-       y = step_size(state_ptr);       /* dynamic quantizer step size */
+       y = step_size (state_ptr) ;     /* dynamic quantizer step size */
 
-       dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */
+       dq = reconstruct (i & 0x08, _dqlntab [i], y) ; /* quantized diff. */
 
-       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq; /* reconst. signal */
+       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq ;        /* reconst. signal */
 
-       dqsez = sr - se + sez                 /* pole prediction diff. */
+       dqsez = sr - se + sez ;                 /* pole prediction diff. */
 
-       update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+       update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ;
 
        /* sr was 14-bit dynamic range */
-       return (sr << 2);       
+       return arith_shift_left (sr, 2) ;
 }
 
index ae90b6c..c377e63 100644 (file)
@@ -34,7 +34,7 @@
  *
  * Description:
  *
- * g723_16_encoder(), g723_16_decoder()
+ * g723_16_encoder (), g723_16_decoder ()
  *
  * These routines comprise an implementation of the CCITT G.726 16 Kbps
  * ADPCM coding algorithm.  Essentially, this implementation is identical to
  * Maps G.723_16 code word to reconstructed scale factor normalized log
  * magnitude values.  Comes from Table 11/G.726
  */
-static short   _dqlntab[4] = { 116, 365, 365, 116}; 
+static short _dqlntab [4] = { 116, 365, 365, 116 } ;
 
 /* Maps G.723_16 code word to log of scale factor multiplier.
  *
- * _witab[4] is actually {-22 , 439, 439, -22}, but FILTD wants it
- * as WI << 5  (multiplied by 32), so we'll do that here 
+ * _witab [4] is actually {-22 , 439, 439, -22}, but FILTD wants it
+ * as WI << 5  (multiplied by 32), so we'll do that here
  */
-static short   _witab[4] = {-704, 14048, 14048, -704};
+static short _witab [4] = { -704, 14048, 14048, -704 } ;
 
 /*
  * Maps G.723_16 code words to a set of values whose long and short
@@ -66,97 +66,97 @@ static short   _witab[4] = {-704, 14048, 14048, -704};
  */
 
 /* Comes from FUNCTF */
-static short   _fitab[4] = {0, 0xE00, 0xE00, 0};
+static short _fitab [4] = { 0, 0xE00, 0xE00, 0 } ;
 
 /* Comes from quantizer decision level tables (Table 7/G.726)
  */
-static short qtab_723_16[1] = {261};
+static short qtab_723_16 [1] = { 261 } ;
 
 
 /*
- * g723_16_encoder()
+ * g723_16_encoder ()
  *
  * Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code.
  * Returns -1 if invalid input coding value.
  */
 int
-g723_16_encoder(
-       int             sl,
-       G72x_STATE *state_ptr)
+g723_16_encoder (
+       int                     sl,
+       G72x_STATE *state_ptr)
 {
-       short           sei, sezi, se, sez;     /* ACCUM */
-       short           d;                      /* SUBTA */
-       short           y;                      /* MIX */
-       short           sr;                     /* ADDB */
-       short           dqsez;                  /* ADDC */
-       short           dq, i;
+       short sei, sezi, se, sez ;      /* ACCUM */
+       short d ;                                       /* SUBTA */
+       short y ;                                       /* MIX */
+       short sr ;                                      /* ADDB */
+       short dqsez ;                           /* ADDC */
+       short dq, i ;
 
-               /* linearize input sample to 14-bit PCM */
-               sl >>= 2;               /* sl of 14-bit dynamic range */
+       /* linearize input sample to 14-bit PCM */
+       sl >>= 2 ;      /* sl of 14-bit dynamic range */
 
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1;                  /* se = estimated signal */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ; /* se = estimated signal */
 
-       d = sl - se;                    /* d = estimation diff. */
+       d = sl - se ;   /* d = estimation diff. */
 
-       /* quantize prediction difference d */
-       y = step_size(state_ptr);       /* quantizer step size */
-       i = quantize(d, y, qtab_723_16, 1);  /* i = ADPCM code */
+       /* quantize prediction difference d */
+       y = step_size (state_ptr) ;                             /* quantizer step size */
+       i = quantize (d, y, qtab_723_16, 1) ;   /* i = ADPCM code */
 
-             /* Since quantize() only produces a three level output
-              * (1, 2, or 3), we must create the fourth one on our own
-              */
-       if (i == 3)                          /* i code for the zero region */
-         if ((d & 0x8000) == 0)             /* If d > 0, i=3 isn't right... */
-           i = 0;
-           
-       dq = reconstruct(i & 2, _dqlntab[i], y); /* quantized diff. */
+       /* Since quantize () only produces a three level output
+        * (1, 2, or 3), we must create the fourth one on our own
+        */
+       if (i == 3)                                     /* i code for the zero region */
+               if ((d & 0x8000) == 0)  /* If d > 0, i=3 isn't right... */
+                       i = 0 ;
 
-       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+       dq = reconstruct (i & 2, _dqlntab [i], y) ; /* quantized diff. */
 
-       dqsez = sr + sez - se;          /* pole prediction diff. */
+       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconstructed signal */
 
-       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       dqsez = sr + sez - se ;         /* pole prediction diff. */
 
-       return (i);
+       update (2, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
+
+       return i ;
 }
 
 /*
- * g723_16_decoder()
+ * g723_16_decoder ()
  *
  * Decodes a 2-bit CCITT G.723_16 ADPCM code and returns
  * the resulting 16-bit linear PCM, A-law or u-law sample value.
  * -1 is returned if the output coding is unknown.
  */
 int
-g723_16_decoder(
-       int             i,
-       G72x_STATE *state_ptr)
+g723_16_decoder (
+       int                     i,
+       G72x_STATE *state_ptr)
 {
-       short           sezi, sei, sez, se;     /* ACCUM */
-       short           y;                      /* MIX */
-       short           sr;                     /* ADDB */
-       short           dq;
-       short           dqsez;
+       short sezi, sei, sez, se ;      /* ACCUM */
+       short y ;                                       /* MIX */
+       short sr ;                                      /* ADDB */
+       short dq ;
+       short dqsez ;
 
-       i &= 0x03                     /* mask to get proper bits */
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1;                  /* se = estimated signal */
+       i &= 0x03 ;                     /* mask to get proper bits */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;         /* se = estimated signal */
 
-       y = step_size(state_ptr);       /* adaptive quantizer step size */
-       dq = reconstruct(i & 0x02, _dqlntab[i], y); /* unquantize pred diff */
+       y = step_size (state_ptr) ;     /* adaptive quantizer step size */
+       dq = reconstruct (i & 0x02, _dqlntab [i], y) ; /* unquantize pred diff */
 
-       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq) ; /* reconst. signal */
 
-       dqsez = sr - se + sez;                  /* pole prediction diff. */
+       dqsez = sr - se + sez ; /* pole prediction diff. */
 
-       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       update (2, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-               /* sr was of 14-bit dynamic range */
-               return (sr << 2);       
+       /* sr was of 14-bit dynamic range */
+       return (sr << 2) ;
 }
 
index 02b6c24..9cc2f6d 100644 (file)
@@ -29,7 +29,7 @@
  *
  * Description:
  *
- * g723_24_encoder(), g723_24_decoder()
+ * g723_24_encoder (), g723_24_decoder ()
  *
  * These routines comprise an implementation of the CCITT G.723 24 Kbps
  * ADPCM coding algorithm.  Essentially, this implementation is identical to
  * Maps G.723_24 code word to reconstructed scale factor normalized log
  * magnitude values.
  */
-static short   _dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048};
+static short _dqlntab [8] = { -2048, 135, 273, 373, 373, 273, 135, -2048 } ;
 
 /* Maps G.723_24 code word to log of scale factor multiplier. */
-static short   _witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128};
+static short _witab [8] = { -128, 960, 4384, 18624, 18624, 4384, 960, -128 } ;
 
 /*
  * Maps G.723_24 code words to a set of values whose long and short
  * term averages are computed and then compared to give an indication
  * how stationary (steady state) the signal is.
  */
-static short   _fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
+static short _fitab [8] = { 0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0 } ;
 
-static short qtab_723_24[3] = {8, 218, 331};
+static short qtab_723_24 [3] = { 8, 218, 331 } ;
 
 /*
- * g723_24_encoder()
+ * g723_24_encoder ()
  *
  * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
  * Returns -1 if invalid input coding value.
  */
 int
-g723_24_encoder(
+g723_24_encoder (
        int             sl,
        G72x_STATE *state_ptr)
 {
-       short           sei, sezi, se, sez    /* ACCUM */
-       short           d                     /* SUBTA */
-       short           y                     /* MIX */
-       short           sr                    /* ADDB */
-       short           dqsez                 /* ADDC */
-       short           dq, i;
+       short           sei, sezi, se, sez ;    /* ACCUM */
+       short           d ;                     /* SUBTA */
+       short           y ;                     /* MIX */
+       short           sr ;                    /* ADDB */
+       short           dqsez ;                 /* ADDC */
+       short           dq, i ;
 
        /* linearize input sample to 14-bit PCM */
-       sl >>= 2              /* sl of 14-bit dynamic range */
+       sl >>= 2 ;              /* sl of 14-bit dynamic range */
 
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1                 /* se = estimated signal */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;                 /* se = estimated signal */
 
-       d = sl - se                   /* d = estimation diff. */
+       d = sl - se ;                   /* d = estimation diff. */
 
        /* quantize prediction difference d */
-       y = step_size(state_ptr);       /* quantizer step size */
-       i = quantize(d, y, qtab_723_24, 3);     /* i = ADPCM code */
-       dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */
+       y = step_size (state_ptr) ;     /* quantizer step size */
+       i = quantize (d, y, qtab_723_24, 3) ;   /* i = ADPCM code */
+       dq = reconstruct (i & 4, _dqlntab [i], y) ; /* quantized diff. */
 
-       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconstructed signal */
 
-       dqsez = sr + sez - se         /* pole prediction diff. */
+       dqsez = sr + sez - se ;         /* pole prediction diff. */
 
-       update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       update (3, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-       return (i);
+       return ;
 }
 
 /*
- * g723_24_decoder()
+ * g723_24_decoder ()
  *
  * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
  * the resulting 16-bit linear PCM, A-law or u-law sample value.
  * -1 is returned if the output coding is unknown.
  */
 int
-g723_24_decoder(
+g723_24_decoder (
        int             i,
        G72x_STATE *state_ptr)
 {
-       short           sezi, sei, sez, se    /* ACCUM */
-       short           y                     /* MIX */
-       short           sr                    /* ADDB */
-       short           dq;
-       short           dqsez;
+       short           sezi, sei, sez, se ;    /* ACCUM */
+       short           y ;                     /* MIX */
+       short           sr ;                    /* ADDB */
+       short           dq ;
+       short           dqsez ;
 
-       i &= 0x07                     /* mask to get proper bits */
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1                 /* se = estimated signal */
+       i &= 0x07 ;                     /* mask to get proper bits */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;                 /* se = estimated signal */
 
-       y = step_size(state_ptr);       /* adaptive quantizer step size */
-       dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */
+       y = step_size (state_ptr) ;     /* adaptive quantizer step size */
+       dq = reconstruct (i & 0x04, _dqlntab [i], y) ; /* unquantize pred diff */
 
-       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq) ; /* reconst. signal */
 
-       dqsez = sr - se + sez                 /* pole prediction diff. */
+       dqsez = sr - se + sez ;                 /* pole prediction diff. */
 
-       update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       update (3, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-       return (sr << 2);       /* sr was of 14-bit dynamic range */
+       return arith_shift_left (sr, 2) ;       /* sr was of 14-bit dynamic range */
 }
 
index d520395..f7f8f74 100644 (file)
@@ -29,7 +29,7 @@
  *
  * Description:
  *
- * g723_40_encoder(), g723_40_decoder()
+ * g723_40_encoder (), g723_40_decoder ()
  *
  * These routines comprise an implementation of the CCITT G.723 40Kbps
  * ADPCM coding algorithm.  Essentially, this implementation is identical to
  * Maps G.723_40 code word to ructeconstructed scale factor normalized log
  * magnitude values.
  */
-static short   _dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318,
+static short   _dqlntab [32] = { -2048, -66, 28, 104, 169, 224, 274, 318,
                                358, 395, 429, 459, 488, 514, 539, 566,
                                566, 539, 514, 488, 459, 429, 395, 358,
-                               318, 274, 224, 169, 104, 28, -66, -2048};
+                               318, 274, 224, 169, 104, 28, -66, -2048 } ;
 
 /* Maps G.723_40 code word to log of scale factor multiplier. */
-static short   _witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200,
+static short   _witab [32] = { 448, 448, 768, 1248, 1280, 1312, 1856, 3200,
                        4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272,
                        22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512,
-                       3200, 1856, 1312, 1280, 1248, 768, 448, 448};
+                       3200, 1856, 1312, 1280, 1248, 768, 448, 448 } ;
 
 /*
  * Maps G.723_40 code words to a set of values whose long and short
  * term averages are computed and then compared to give an indication
  * how stationary (steady state) the signal is.
  */
-static short   _fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
+static short   _fitab [32] = { 0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
                        0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00,
                        0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200,
-                       0x200, 0x200, 0x200, 0, 0, 0, 0, 0};
+                       0x200, 0x200, 0x200, 0, 0, 0, 0, 0 } ;
 
-static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
-                               378, 413, 445, 475, 502, 528, 553};
+static short qtab_723_40 [15] = { -122, -16, 68, 139, 198, 250, 298, 339,
+                               378, 413, 445, 475, 502, 528, 553 } ;
 
 /*
- * g723_40_encoder()
+ * g723_40_encoder ()
  *
  * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens
  * the resulting 5-bit CCITT G.723 40Kbps code.
@@ -86,40 +86,40 @@ static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
  */
 int    g723_40_encoder (int sl, G72x_STATE *state_ptr)
 {
-       short           sei, sezi, se, sez    /* ACCUM */
-       short           d                     /* SUBTA */
-       short           y                     /* MIX */
-       short           sr                    /* ADDB */
-       short           dqsez                 /* ADDC */
-       short           dq, i;
+       short           sei, sezi, se, sez ;    /* ACCUM */
+       short           d ;                     /* SUBTA */
+       short           y ;                     /* MIX */
+       short           sr ;                    /* ADDB */
+       short           dqsez ;                 /* ADDC */
+       short           dq, i ;
 
        /* linearize input sample to 14-bit PCM */
-       sl >>= 2              /* sl of 14-bit dynamic range */
+       sl >>= 2 ;              /* sl of 14-bit dynamic range */
 
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1                 /* se = estimated signal */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;                 /* se = estimated signal */
 
-       d = sl - se                   /* d = estimation difference */
+       d = sl - se ;                   /* d = estimation difference */
 
        /* quantize prediction difference */
-       y = step_size(state_ptr);       /* adaptive quantizer step size */
-       i = quantize(d, y, qtab_723_40, 15);    /* i = ADPCM code */
+       y = step_size (state_ptr) ;     /* adaptive quantizer step size */
+       i = quantize (d, y, qtab_723_40, 15) ;  /* i = ADPCM code */
 
-       dq = reconstruct(i & 0x10, _dqlntab[i], y);     /* quantized diff */
+       dq = reconstruct (i & 0x10, _dqlntab [i], y) ;  /* quantized diff */
 
-       sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */
+       sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq ; /* reconstructed signal */
 
-       dqsez = sr + sez - se         /* dqsez = pole prediction diff. */
+       dqsez = sr + sez - se ;         /* dqsez = pole prediction diff. */
 
-       update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       update (5, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-       return (i);
+       return ;
 }
 
 /*
- * g723_40_decoder()
+ * g723_40_decoder ()
  *
  * Decodes a 5-bit CCITT G.723 40Kbps code and returns
  * the resulting 16-bit linear PCM, A-law or u-law sample value.
@@ -127,27 +127,27 @@ int       g723_40_encoder (int sl, G72x_STATE *state_ptr)
  */
 int    g723_40_decoder (int i, G72x_STATE *state_ptr)
 {
-       short           sezi, sei, sez, se    /* ACCUM */
+       short           sezi, sei, sez, se ;    /* ACCUM */
        short           y ;                     /* MIX */
-       short           sr                    /* ADDB */
-       short           dq;
-       short           dqsez;
+       short           sr ;                    /* ADDB */
+       short           dq ;
+       short           dqsez ;
 
-       i &= 0x1f                     /* mask to get proper bits */
-       sezi = predictor_zero(state_ptr);
-       sez = sezi >> 1;
-       sei = sezi + predictor_pole(state_ptr);
-       se = sei >> 1                 /* se = estimated signal */
+       i &= 0x1f ;                     /* mask to get proper bits */
+       sezi = predictor_zero (state_ptr) ;
+       sez = sezi >> 1 ;
+       sei = sezi + predictor_pole (state_ptr) ;
+       se = sei >> 1 ;                 /* se = estimated signal */
 
-       y = step_size(state_ptr);       /* adaptive quantizer step size */
-       dq = reconstruct(i & 0x10, _dqlntab[i], y);     /* estimation diff. */
+       y = step_size (state_ptr) ;     /* adaptive quantizer step size */
+       dq = reconstruct (i & 0x10, _dqlntab [i], y) ;  /* estimation diff. */
 
-       sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
+       sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq) ; /* reconst. signal */
 
-       dqsez = sr - se + sez         /* pole prediction diff. */
+       dqsez = sr - se + sez ;         /* pole prediction diff. */
 
-       update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+       update (5, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ;
 
-       return (sr << 2);       /* sr was of 14-bit dynamic range */
+       return arith_shift_left (sr, 2) ;       /* sr was of 14-bit dynamic range */
 }
 
index 3fae81a..2d6469c 100644 (file)
@@ -48,26 +48,26 @@ short power2 [15] =
 } ;
 
 /*
- * quan()
+ * quan ()
  *
  * quantizes the input val against the table of size short integers.
- * It returns i if table[i - 1] <= val < table[i].
+ * It returns i if table [i - 1] <= val < table [i].
  *
  * Using linear search for simple coding.
  */
 static
 int quan (int val, short *table, int size)
 {
-       int             i;
+       int             i ;
 
-       for (i = 0; i < size; i++)
+       for (i = 0 ; i < size ; i++)
                if (val < *table++)
-                       break;
-       return (i);
+                       break ;
+       return ;
 }
 
 /*
- * fmult()
+ * fmult ()
  *
  * returns the integer product of the 14-bit integer "an" and
  * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
@@ -75,15 +75,15 @@ int quan (int val, short *table, int size)
 static
 int fmult (int an, int srn)
 {
-       short           anmag, anexp, anmant;
-       short           wanexp, wanmant;
-       short           retval;
+       short           anmag, anexp, anmant ;
+       short           wanexp, wanmant ;
+       short           retval ;
 
-       anmag = (an > 0) ? an : ((-an) & 0x1FFF);
-       anexp = quan(anmag, power2, 15) - 6;
+       anmag = (an > 0) ? an : ((-an) & 0x1FFF) ;
+       anexp = quan (anmag, power2, 15) - 6 ;
        anmant = (anmag == 0) ? 32 :
-           (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
-       wanexp = anexp + ((srn >> 6) & 0xF) - 13;
+                               (anexp >= 0) ? anmag >> anexp : anmag << -anexp ;
+       wanexp = anexp + ((srn >> 6) & 0xF) - 13 ;
 
        /*
        ** The original was :
@@ -94,10 +94,9 @@ int fmult (int an, int srn)
 
        wanmant = (anmant * (srn & 0x3F)) >> 4 ;
 
-       retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
-           (wanmant >> -wanexp);
+       retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp) ;
 
-       return (((an ^ srn) < 0) ? -retval : retval);
+       return (((an ^ srn) < 0) ? -retval : retval) ;
 }
 
 static G72x_STATE * g72x_state_new (void)
@@ -105,7 +104,7 @@ static G72x_STATE * g72x_state_new (void)
 }
 
 /*
- * private_init_state()
+ * private_init_state ()
  *
  * This routine initializes and/or resets the G72x_PRIVATE structure
  * pointed to by 'state_ptr'.
@@ -113,23 +112,23 @@ static G72x_STATE * g72x_state_new (void)
  */
 void private_init_state (G72x_STATE *state_ptr)
 {
-       int             cnta;
-
-       state_ptr->yl = 34816;
-       state_ptr->yu = 544;
-       state_ptr->dms = 0;
-       state_ptr->dml = 0;
-       state_ptr->ap = 0;
-       for (cnta = 0; cnta < 2; cnta++) {
-               state_ptr->a[cnta] = 0;
-               state_ptr->pk[cnta] = 0;
-               state_ptr->sr[cnta] = 32;
-       }
-       for (cnta = 0; cnta < 6; cnta++) {
-               state_ptr->b[cnta] = 0;
-               state_ptr->dq[cnta] = 32;
-       }
-       state_ptr->td = 0;
+       int             cnta ;
+
+       state_ptr->yl = 34816 ;
+       state_ptr->yu = 544 ;
+       state_ptr->dms = 0 ;
+       state_ptr->dml = 0 ;
+       state_ptr->ap = 0 ;
+       for (cnta = 0 ; cnta < 2 ; cnta++)
+       {       state_ptr->a [cnta] = 0 ;
+               state_ptr->pk [cnta] = 0 ;
+               state_ptr->sr [cnta] = 32 ;
+               }
+       for (cnta = 0 ; cnta < 6 ; cnta++)
+       {       state_ptr->b [cnta] = 0 ;
+               state_ptr->dq [cnta] = 32 ;
+               }
+       state_ptr->td = 0 ;
 }      /* private_init_state */
 
 struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
@@ -264,60 +263,60 @@ int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block)
 }      /* g72x_encode_block */
 
 /*
- * predictor_zero()
+ * predictor_zero ()
  *
  * computes the estimated signal from 6-zero predictor.
  *
  */
-int  predictor_zero (G72x_STATE *state_ptr)
+int predictor_zero (G72x_STATE *state_ptr)
 {
-       int             i;
-       int             sezi;
+       int             i ;
+       int             sezi ;
 
-       sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
-       for (i = 1; i < 6; i++)                 /* ACCUM */
-               sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
-       return (sezi);
+       sezi = fmult (state_ptr->b [0] >> 2, state_ptr->dq [0]) ;
+       for (i = 1 ; i < 6 ; i++)                       /* ACCUM */
+               sezi += fmult (state_ptr->b [i] >> 2, state_ptr->dq [i]) ;
+       return sezi ;
 }
 /*
- * predictor_pole()
+ * predictor_pole ()
  *
  * computes the estimated signal from 2-pole predictor.
  *
  */
-int  predictor_pole(G72x_STATE *state_ptr)
+int predictor_pole (G72x_STATE *state_ptr)
 {
-       return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
-           fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
+       return (fmult (state_ptr->a [1] >> 2, state_ptr->sr [1]) +
+                       fmult (state_ptr->a [0] >> 2, state_ptr->sr [0])) ;
 }
 /*
- * step_size()
+ * step_size ()
  *
  * computes the quantization step size of the adaptive quantizer.
  *
  */
-int  step_size (G72x_STATE *state_ptr)
+int step_size (G72x_STATE *state_ptr)
 {
-       int             y;
-       int             dif;
-       int             al;
+       int             y ;
+       int             dif ;
+       int             al ;
 
        if (state_ptr->ap >= 256)
-               return (state_ptr->yu);
+               return (state_ptr->yu) ;
        else {
-               y = state_ptr->yl >> 6;
-               dif = state_ptr->yu - y;
-               al = state_ptr->ap >> 2;
+               y = state_ptr->yl >> 6 ;
+               dif = state_ptr->yu - y ;
+               al = state_ptr->ap >> 2 ;
                if (dif > 0)
-                       y += (dif * al) >> 6;
+                       y += (dif * al) >> 6 ;
                else if (dif < 0)
-                       y += (dif * al + 0x3F) >> 6;
-               return (y);
+                       y += (dif * al + 0x3F) >> 6 ;
+               return ;
        }
 }
 
 /*
- * quantize()
+ * quantize ()
  *
  * Given a raw sample, 'd', of the difference signal and a
  * quantization step size scale factor, 'y', this routine returns the
@@ -325,87 +324,87 @@ int  step_size (G72x_STATE *state_ptr)
  * size scale factor division operation is done in the log base 2 domain
  * as a subtraction.
  */
-int quantize(
+int quantize (
        int             d,      /* Raw difference signal sample */
        int             y,      /* Step size multiplier */
        short   *table, /* quantization table */
        int             size)   /* table size of short integers */
 {
-       short           dqm   /* Magnitude of 'd' */
-       short           expon /* Integer part of base 2 log of 'd' */
-       short           mant  /* Fractional part of base 2 log */
-       short           dl    /* Log of magnitude of 'd' */
-       short           dln   /* Step size scale factor normalized log */
-       int             i;
+       short           dqm ;   /* Magnitude of 'd' */
+       short           expon ; /* Integer part of base 2 log of 'd' */
+       short           mant ;  /* Fractional part of base 2 log */
+       short           dl ;    /* Log of magnitude of 'd' */
+       short           dln ;   /* Step size scale factor normalized log */
+       int             i ;
 
        /*
         * LOG
         *
         * Compute base 2 log of 'd', and store in 'dl'.
         */
-       dqm = abs(d);
-       expon = quan(dqm >> 1, power2, 15);
-       mant = ((dqm << 7) >> expon) & 0x7F   /* Fractional portion. */
-       dl = (expon << 7) + mant;
+       dqm = abs (d) ;
+       expon = quan (dqm >> 1, power2, 15) ;
+       mant = ((dqm << 7) >> expon) & 0x7F ;   /* Fractional portion. */
+       dl = (expon << 7) + mant ;
 
        /*
         * SUBTB
         *
         * "Divide" by step size multiplier.
         */
-       dln = dl - (y >> 2);
+       dln = dl - (y >> 2) ;
 
        /*
         * QUAN
         *
         * Obtain codword i for 'd'.
         */
-       i = quan(dln, table, size);
+       i = quan (dln, table, size) ;
        if (d < 0)                      /* take 1's complement of i */
-               return ((size << 1) + 1 - i);
+               return ((size << 1) + 1 - i) ;
        else if (i == 0)                /* take 1's complement of 0 */
-               return ((size << 1) + 1); /* new in 1988 */
-       else
-               return (i);
+               return ((size << 1) + 1) ; /* new in 1988 */
+
+       return i ;
 }
 /*
- * reconstruct()
+ * reconstruct ()
  *
  * Returns reconstructed difference signal 'dq' obtained from
  * codeword 'i' and quantization step size scale factor 'y'.
  * Multiplication is performed in log base 2 domain as addition.
  */
 int
-reconstruct(
+reconstruct (
        int             sign,   /* 0 for non-negative value */
        int             dqln,   /* G.72x codeword */
        int             y)      /* Step size multiplier */
 {
-       short           dql   /* Log of 'dq' magnitude */
-       short           dex   /* Integer part of log */
-       short           dqt;
-       short           dq    /* Reconstructed difference signal sample */
-
-       dql = dqln + (y >> 2) /* ADDA */
-
-       if (dql < 0) {
-               return ((sign) ? -0x8000 : 0);
-       } else {                /* ANTILOG */
-               dex = (dql >> 7) & 15;
-               dqt = 128 + (dql & 127);
-               dq = (dqt << 7) >> (14 - dex);
-               return ((sign) ? (dq - 0x8000) : dq);
-       }
+       short           dql ;   /* Log of 'dq' magnitude */
+       short           dex ;   /* Integer part of log */
+       short           dqt ;
+       short           dq ;    /* Reconstructed difference signal sample */
+
+       dql = dqln + (y >> 2) ; /* ADDA */
+
+       if (dql < 0)
+               return ((sign) ? -0x8000 : 0) ;
+       else            /* ANTILOG */
+       {       dex = (dql >> 7) & 15 ;
+               dqt = 128 + (dql & 127) ;
+               dq = (dqt << 7) >> (14 - dex) ;
+               return ((sign) ? (dq - 0x8000) : dq) ;
+               }
 }
 
 
 /*
- * update()
+ * update ()
  *
  * updates the state variables for each output code
  */
 void
-update(
+update (
        int             code_size,      /* distinguish 723_40 with others */
        int             y,              /* quantizer step size */
        int             wi,             /* scale factor multiplier */
@@ -415,32 +414,32 @@ update(
        int             dqsez,          /* difference from 2-pole predictor */
        G72x_STATE *state_ptr)  /* coder state pointer */
 {
-       int             cnt;
-       short           mag, expon    /* Adaptive predictor, FLOAT A */
-       short           a2p = 0       /* LIMC */
-       short           a1ul          /* UPA1 */
-       short           pks1          /* UPA2 */
-       short           fa1;
-       char            tr            /* tone/transition detector */
-       short           ylint, thr2, dqthr;
-       short           ylfrac, thr1;
-       short           pk0;
-
-       pk0 = (dqsez < 0) ? 1 : 0     /* needed in updating predictor poles */
-
-       mag = dq & 0x7FFF             /* prediction difference magnitude */
+       int             cnt ;
+       short           mag, expon ;    /* Adaptive predictor, FLOAT A */
+       short           a2p = 0 ;       /* LIMC */
+       short           a1ul ;          /* UPA1 */
+       short           pks1 ;          /* UPA2 */
+       short           fa1 ;
+       char            tr ;            /* tone/transition detector */
+       short           ylint, thr2, dqthr ;
+       short           ylfrac, thr1 ;
+       short           pk0 ;
+
+       pk0 = (dqsez < 0) ? 1 : 0 ;     /* needed in updating predictor poles */
+
+       mag = dq & 0x7FFF ;             /* prediction difference magnitude */
        /* TRANS */
-       ylint = state_ptr->yl >> 15   /* exponent part of yl */
-       ylfrac = (state_ptr->yl >> 10) & 0x1F /* fractional part of yl */
-       thr1 = (32 + ylfrac) << ylint         /* threshold */
-       thr2 = (ylint > 9) ? 31 << 10 : thr1  /* limit thr2 to 31 << 10 */
-       dqthr = (thr2 + (thr2 >> 1)) >> 1     /* dqthr = 0.75 * thr2 */
+       ylint = state_ptr->yl >> 15 ;   /* exponent part of yl */
+       ylfrac = (state_ptr->yl >> 10) & 0x1F ; /* fractional part of yl */
+       thr1 = (32 + ylfrac) << ylint ;         /* threshold */
+       thr2 = (ylint > 9) ? 31 << 10 : thr1 ;  /* limit thr2 to 31 << 10 */
+       dqthr = (thr2 + (thr2 >> 1)) >> 1 ;     /* dqthr = 0.75 * thr2 */
        if (state_ptr->td == 0)         /* signal supposed voice */
-               tr = 0;
+               tr = 0 ;
        else if (mag <= dqthr)          /* supposed data, but small mag */
-               tr = 0;                 /* treated as voice */
+               tr = 0 ;                        /* treated as voice */
        else                            /* signal is data (modem) */
-               tr = 1;
+               tr = 1 ;
 
        /*
         * Quantizer scale factor adaptation.
@@ -448,151 +447,153 @@ update(
 
        /* FUNCTW & FILTD & DELAY */
        /* update non-steady state step size multiplier */
-       state_ptr->yu = y + ((wi - y) >> 5);
+       state_ptr->yu = y + ((wi - y) >> 5) ;
 
        /* LIMB */
        if (state_ptr->yu < 544)        /* 544 <= yu <= 5120 */
-               state_ptr->yu = 544;
+               state_ptr->yu = 544 ;
        else if (state_ptr->yu > 5120)
-               state_ptr->yu = 5120;
+               state_ptr->yu = 5120 ;
 
        /* FILTE & DELAY */
        /* update steady state step size multiplier */
-       state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
+       state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6) ;
 
        /*
         * Adaptive predictor coefficients.
         */
        if (tr == 1) {                  /* reset a's and b's for modem signal */
-               state_ptr->a[0] = 0;
-               state_ptr->a[1] = 0;
-               state_ptr->b[0] = 0;
-               state_ptr->b[1] = 0;
-               state_ptr->b[2] = 0;
-               state_ptr->b[3] = 0;
-               state_ptr->b[4] = 0;
-               state_ptr->b[5] = 0;
-       } else {                        /* update a's and b's */
-               pks1 = pk0 ^ state_ptr->pk[0];          /* UPA2 */
-
-               /* update predictor pole a[1] */
-               a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
-               if (dqsez != 0) {
-                       fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
+               state_ptr->a [0] = 0 ;
+               state_ptr->a [1] = 0 ;
+               state_ptr->b [0] = 0 ;
+               state_ptr->b [1] = 0 ;
+               state_ptr->b [2] = 0 ;
+               state_ptr->b [3] = 0 ;
+               state_ptr->b [4] = 0 ;
+               state_ptr->b [5] = 0 ;
+               }
+       else                    /* update a's and b's */
+       {       pks1 = pk0 ^ state_ptr->pk [0] ;                /* UPA2 */
+
+               /* update predictor pole a [1] */
+               a2p = state_ptr->a [1] - (state_ptr->a [1] >> 7) ;
+               if (dqsez != 0)
+               {       fa1 = (pks1) ? state_ptr->a [0] : -state_ptr->a [0] ;
                        if (fa1 < -8191)        /* a2p = function of fa1 */
-                               a2p -= 0x100;
+                               a2p -= 0x100 ;
                        else if (fa1 > 8191)
-                               a2p += 0xFF;
+                               a2p += 0xFF ;
                        else
-                               a2p += fa1 >> 5;
+                               a2p += fa1 >> 5 ;
 
-                       if (pk0 ^ state_ptr->pk[1])
+                       if (pk0 ^ state_ptr->pk [1])
                        {       /* LIMC */
                                if (a2p <= -12160)
-                                       a2p = -12288;
+                                       a2p = -12288 ;
                                else if (a2p >= 12416)
-                                       a2p = 12288;
+                                       a2p = 12288 ;
                                else
-                                       a2p -= 0x80;
+                                       a2p -= 0x80 ;
                                }
                        else if (a2p <= -12416)
-                               a2p = -12288;
+                               a2p = -12288 ;
                        else if (a2p >= 12160)
-                               a2p = 12288;
+                               a2p = 12288 ;
                        else
-                               a2p += 0x80;
+                               a2p += 0x80 ;
                }
 
                /* TRIGB & DELAY */
-               state_ptr->a[1] = a2p;
+               state_ptr->a [1] = a2p ;
 
                /* UPA1 */
-               /* update predictor pole a[0] */
-               state_ptr->a[0] -= state_ptr->a[0] >> 8;
+               /* update predictor pole a [0] */
+               state_ptr->a [0] -= state_ptr->a [0] >> 8 ;
                if (dqsez != 0)
                {       if (pks1 == 0)
-                               state_ptr->a[0] += 192;
+                               state_ptr->a [0] += 192 ;
                        else
-                               state_ptr->a[0] -= 192;
+                               state_ptr->a [0] -= 192 ;
                        } ;
 
                /* LIMD */
-               a1ul = 15360 - a2p;
-               if (state_ptr->a[0] < -a1ul)
-                       state_ptr->a[0] = -a1ul;
-               else if (state_ptr->a[0] > a1ul)
-                       state_ptr->a[0] = a1ul;
-
-               /* UPB : update predictor zeros b[6] */
-               for (cnt = 0; cnt < 6; cnt++) {
-                       if (code_size == 5)             /* for 40Kbps G.723 */
-                               state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
+               a1ul = 15360 - a2p ;
+               if (state_ptr->a [0] < -a1ul)
+                       state_ptr->a [0] = -a1ul ;
+               else if (state_ptr->a [0] > a1ul)
+                       state_ptr->a [0] = a1ul ;
+
+               /* UPB : update predictor zeros b [6] */
+               for (cnt = 0 ; cnt < 6 ; cnt++)
+               {       if (code_size == 5)             /* for 40Kbps G.723 */
+                               state_ptr->b [cnt] -= state_ptr->b [cnt] >> 9 ;
                        else                    /* for G.721 and 24Kbps G.723 */
-                               state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
-                       if (dq & 0x7FFF) {                      /* XOR */
-                               if ((dq ^ state_ptr->dq[cnt]) >= 0)
-                                       state_ptr->b[cnt] += 128;
+                               state_ptr->b [cnt] -= state_ptr->b [cnt] >> 8 ;
+                       if (dq & 0x7FFF)                        /* XOR */
+                       {       if ((dq ^ state_ptr->dq [cnt]) >= 0)
+                                       state_ptr->b [cnt] += 128 ;
                                else
-                                       state_ptr->b[cnt] -= 128;
+                                       state_ptr->b [cnt] -= 128 ;
+                               }
                        }
                }
-       }
 
-       for (cnt = 5; cnt > 0; cnt--)
-               state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
-       /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
-       if (mag == 0) {
-               state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
-       } else {
-               expon = quan(mag, power2, 15);
-               state_ptr->dq[0] = (dq >= 0) ?
-                   (expon << 6) + ((mag << 6) >> expon) :
-                   (expon << 6) + ((mag << 6) >> expon) - 0x400;
-       }
+       for (cnt = 5 ; cnt > 0 ; cnt--)
+               state_ptr->dq [cnt] = state_ptr->dq [cnt - 1] ;
+       /* FLOAT A : convert dq [0] to 4-bit exp, 6-bit mantissa f.p. */
+       if (mag == 0)
+               state_ptr->dq [0] = (dq >= 0) ? 0x20 : 0xFC20 ;
+       else
+       {       expon = quan (mag, power2, 15) ;
+               state_ptr->dq [0] = (dq >= 0) ?
+                       (expon << 6) + ((mag << 6) >> expon) :
+                       (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
+               }
 
-       state_ptr->sr[1] = state_ptr->sr[0];
+       state_ptr->sr [1] = state_ptr->sr [0] ;
        /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
-       if (sr == 0) {
-               state_ptr->sr[0] = 0x20;
-       } else if (sr > 0) {
-               expon = quan(sr, power2, 15);
-               state_ptr->sr[0] = (expon << 6) + ((sr << 6) >> expon);
-       } else if (sr > -32768) {
-               mag = -sr;
-               expon = quan(mag, power2, 15);
-               state_ptr->sr[0] =  (expon << 6) + ((mag << 6) >> expon) - 0x400;
-       } else
-               state_ptr->sr[0] = (short) 0xFC20;
+       if (sr == 0)
+               state_ptr->sr [0] = 0x20 ;
+       else if (sr > 0)
+       {       expon = quan (sr, power2, 15) ;
+               state_ptr->sr [0] = (expon << 6) + ((sr << 6) >> expon) ;
+               }
+       else if (sr > -32768)
+       {       mag = -sr ;
+               expon = quan (mag, power2, 15) ;
+               state_ptr->sr [0] = (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
+               }
+       else
+               state_ptr->sr [0] = (short) 0xFC20 ;
 
        /* DELAY A */
-       state_ptr->pk[1] = state_ptr->pk[0];
-       state_ptr->pk[0] = pk0;
+       state_ptr->pk [1] = state_ptr->pk [0] ;
+       state_ptr->pk [0] = pk0 ;
 
        /* TONE */
        if (tr == 1)            /* this sample has been treated as data */
-               state_ptr->td = 0     /* next one will be treated as voice */
+               state_ptr->td = 0 ;     /* next one will be treated as voice */
        else if (a2p < -11776)  /* small sample-to-sample correlation */
-               state_ptr->td = 1     /* signal may be data */
+               state_ptr->td = 1 ;     /* signal may be data */
        else                            /* signal is voice */
-               state_ptr->td = 0;
+               state_ptr->td = 0 ;
 
        /*
         * Adaptation speed control.
         */
-       state_ptr->dms += (fi - state_ptr->dms) >> 5          /* FILTA */
-       state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7) /* FILTB */
+       state_ptr->dms += (fi - state_ptr->dms) >> 5 ;          /* FILTA */
+       state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7) ; /* FILTB */
 
        if (tr == 1)
-               state_ptr->ap = 256;
+               state_ptr->ap = 256 ;
        else if (y < 1536)                                      /* SUBTC */
-               state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+               state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
        else if (state_ptr->td == 1)
-               state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
-       else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
-           (state_ptr->dml >> 3))
-               state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+               state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
+       else if (abs ((state_ptr->dms << 2) - state_ptr->dml) >= (state_ptr->dml >> 3))
+               state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
        else
-               state_ptr->ap += (-state_ptr->ap) >> 4;
+               state_ptr->ap += (-state_ptr->ap) >> 4 ;
 
        return ;
 } /* update */
@@ -602,7 +603,7 @@ update(
 
 static int
 unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
-{      unsigned int    in_buffer = 0 ;
+{      unsigned int    in_buffer = 0 ;
        unsigned char   in_byte ;
        int                             k, in_bits = 0, bindex = 0 ;
 
@@ -610,12 +611,12 @@ unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samp
        {       if (in_bits < bits)
                {       in_byte = block [bindex++] ;
 
-                       in_buffer |= (in_byte << in_bits);
-                       in_bits += 8;
+                       in_buffer |= (in_byte << in_bits) ;
+                       in_bits += 8 ;
                        }
-               samples [k] = in_buffer & ((1 << bits) - 1);
-               in_buffer >>= bits;
-               in_bits -= bits;
+               samples [k] = in_buffer & ((1 << bits) - 1) ;
+               in_buffer >>= bits ;
+               in_bits -= bits ;
                } ;
 
        return k ;
index 867c64b..e418fb7 100644 (file)
 */
 
 struct g72x_state
-{      long  yl;       /* Locked or steady state step size multiplier. */
-       short yu      /* Unlocked or non-steady state step size multiplier. */
-       short dms     /* Short term energy estimate. */
-       short dml     /* Long term energy estimate. */
-       short ap      /* Linear weighting coefficient of 'yl' and 'yu'. */
-
-       short a[2];     /* Coefficients of pole portion of prediction filter. */
-       short b[6];     /* Coefficients of zero portion of prediction filter. */
-       short pk[2];    /*
+{      long yl ;       /* Locked or steady state step size multiplier. */
+       short yu ;      /* Unlocked or non-steady state step size multiplier. */
+       short dms ;     /* Short term energy estimate. */
+       short dml ;     /* Long term energy estimate. */
+       short ap ;      /* Linear weighting coefficient of 'yl' and 'yu'. */
+
+       short a [2] ;   /* Coefficients of pole portion of prediction filter. */
+       short b [6] ;   /* Coefficients of zero portion of prediction filter. */
+       short pk [2] ;  /*
                                        ** Signs of previous two samples of a partially
                                        ** reconstructed signal.
                                        **/
-       short dq[6];    /*
+       short dq [6] ;  /*
                                        ** Previous 6 samples of the quantized difference
                                        ** signal represented in an internal floating point
                                        ** format.
                                        **/
-       short sr[2];    /*
+       short sr [2] ;  /*
                                        ** Previous 2 samples of the quantized difference
                                        ** signal represented in an internal floating point
                                        ** format.
                                        */
-       char td       /* delayed tone detect, new in 1988 version */
+       char td ;       /* delayed tone detect, new in 1988 version */
 
        /*      The following struct members were added for libsndfile. The original
        **      code worked by calling a set of functions on a sample by sample basis
@@ -80,30 +80,48 @@ struct g72x_state
 
 typedef struct g72x_state G72x_STATE ;
 
-int    predictor_zero (G72x_STATE *state_ptr);
+int    predictor_zero (G72x_STATE *state_ptr) ;
 
-int    predictor_pole (G72x_STATE *state_ptr);
+int    predictor_pole (G72x_STATE *state_ptr) ;
 
-int    step_size (G72x_STATE *state_ptr);
+int    step_size (G72x_STATE *state_ptr) ;
 
-int    quantize (int d, int    y, short *table, int size);
+int    quantize (int d, int    y, short *table, int size) ;
 
-int    reconstruct (int sign, int dqln,        int y);
+int    reconstruct (int sign, int dqln,        int y) ;
 
-void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr);
+void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr) ;
 
-int g721_encoder       (int sample, G72x_STATE *state_ptr);
-int g721_decoder       (int code, G72x_STATE *state_ptr);
+int g721_encoder       (int sample, G72x_STATE *state_ptr) ;
+int g721_decoder       (int code, G72x_STATE *state_ptr) ;
 
-int g723_16_encoder    (int sample, G72x_STATE *state_ptr);
-int g723_16_decoder    (int code, G72x_STATE *state_ptr);
+int g723_16_encoder    (int sample, G72x_STATE *state_ptr) ;
+int g723_16_decoder    (int code, G72x_STATE *state_ptr) ;
 
-int g723_24_encoder    (int sample, G72x_STATE *state_ptr);
-int g723_24_decoder    (int code, G72x_STATE *state_ptr);
+int g723_24_encoder    (int sample, G72x_STATE *state_ptr) ;
+int g723_24_decoder    (int code, G72x_STATE *state_ptr) ;
 
-int g723_40_encoder    (int sample, G72x_STATE *state_ptr);
-int g723_40_decoder    (int code, G72x_STATE *state_ptr);
+int g723_40_encoder    (int sample, G72x_STATE *state_ptr) ;
+int g723_40_decoder    (int code, G72x_STATE *state_ptr) ;
 
 void private_init_state (G72x_STATE *state_ptr) ;
 
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+static inline int ALWAYS_INLINE
+arith_shift_left (int x, int shift)
+{      return (int) (((unsigned int) x) << shift) ;
+} /* arith_shift_left */
+
+static inline int ALWAYS_INLINE
+arith_shift_right (int x, int shift)
+{      if (x >= 0)
+               return x << shift ;
+       return ~ ((~x) << shift) ;
+} /* arith_shift_right */
+
 #endif /* G72X_PRIVATE_H */
index 79cabce..de91be3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
 #define                M_PI            3.14159265358979323846264338
 #endif
 
-#define                BUFFER_SIZE             (1<<14) /* Should be (1<<14) */
+#define                BUFFER_SIZE             (1 << 14)
 #define                SAMPLE_RATE             11025
 
 
@@ -55,7 +55,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       bDoAll=!strcmp (argv [1], "all");
+       bDoAll = !strcmp (argv [1], "all") ;
 
        if (bDoAll || ! strcmp (argv [1], "g721"))
        {       g721_test       () ;
@@ -169,7 +169,7 @@ error_function (double data, double orig, double margin)
 {      double error ;
 
        if (fabs (orig) <= 500.0)
-               error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
+               error = fabs (fabs (data) - fabs (orig)) / 2000.0 ;
        else if (fabs (orig) <= 1000.0)
                error = fabs (data - orig) / 3000.0 ;
        else
index 6f4eb5c..c943eec 100644 (file)
 #define        saturate(x)     \
        ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
 
-word gsm_add ( word a, word b)
+int16_t gsm_add (int16_t a, int16_t b)
 {
-       longword sum = (longword)a + (longword)b;
-       return saturate(sum);
+       int32_t sum = (int32_t) a + (int32_t) b ;
+       return saturate (sum) ;
 }
 
-word gsm_sub ( word a, word b)
+int16_t gsm_sub (int16_t a, int16_t b)
 {
-       longword diff = (longword)a - (longword)b;
-       return saturate(diff);
+       int32_t diff = (int32_t) a - (int32_t) b ;
+       return saturate (diff) ;
 }
 
-word gsm_mult ( word a, word b)
+int16_t gsm_mult (int16_t a, int16_t b)
 {
        if (a == MIN_WORD && b == MIN_WORD)
-               return MAX_WORD;
-       
-       return SASR_L( (longword)a * (longword)b, 15 );
+               return MAX_WORD ;
+
+       return SASR_L ((int32_t) a * (int32_t) b, 15) ;
 }
 
-word gsm_mult_r ( word a, word b)
+int16_t gsm_mult_r (int16_t a, int16_t b)
 {
-       if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
-       else {
-               longword prod = (longword)a * (longword)b + 16384;
-               prod >>= 15;
-               return prod & 0xFFFF;
-       }
+       if (b == MIN_WORD && a == MIN_WORD)
+               return MAX_WORD ;
+       else
+       {       int32_t prod = (int32_t) a * (int32_t) b + 16384 ;
+               prod >>= 15 ;
+               return prod & 0xFFFF ;
+               }
 }
 
-word gsm_abs (word a)
+int16_t gsm_abs (int16_t a)
 {
-       return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+       return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a ;
 }
 
-longword gsm_L_mult (word a, word b)
+int32_t gsm_L_mult (int16_t a, int16_t b)
 {
-       assert( a != MIN_WORD || b != MIN_WORD );
-       return ((longword)a * (longword)b) << 1;
+       assert (a != MIN_WORD || b != MIN_WORD) ;
+       return ((int32_t) a * (int32_t) b) << 1 ;
 }
 
-longword gsm_L_add ( longword a, longword b)
+int32_t gsm_L_add (int32_t a, int32_t b)
 {
-       if (a < 0) {
-               if (b >= 0) return a + b;
-               else {
-                       ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
-                       return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+       if (a < 0)
+       {       if (b >= 0)
+                       return a + b ;
+               else
+               {       uint32_t A = (uint32_t) - (a + 1) + (uint32_t) - (b + 1) ;
+                       return A >= MAX_LONGWORD ? MIN_LONGWORD : - (int32_t) A - 2 ;
+                       }
+               }
+       else if (b <= 0)
+               return a + b ;
+       else
+       {       uint32_t A = (uint32_t) a + (uint32_t) b ;
+               return A > MAX_LONGWORD ? MAX_LONGWORD : A ;
                }
-       }
-       else if (b <= 0) return a + b;
-       else {
-               ulongword A = (ulongword)a + (ulongword)b;
-               return A > MAX_LONGWORD ? MAX_LONGWORD : A;
-       }
 }
 
-longword gsm_L_sub ( longword a, longword b)
+int32_t gsm_L_sub (int32_t a, int32_t b)
 {
-       if (a >= 0) {
-               if (b >= 0) return a - b;
-               else {
-                       /* a>=0, b<0 */
-
-                       ulongword A = (ulongword)a + -(b + 1);
-                       return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+       if (a >= 0)
+       {       if (b >= 0)
+                       return a - b ;
+               else
+               {       /* a>=0, b<0 */
+                       uint32_t A = (uint32_t) a + - (b + 1) ;
+                       return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1) ;
+                       }
+               }
+       else if (b <= 0)
+               return a - b ;
+       else
+       {       /* a<0, b>0 */
+               uint32_t A = (uint32_t) - (a + 1) + b ;
+               return A >= MAX_LONGWORD ? MIN_LONGWORD : - (int32_t) A - 1 ;
                }
-       }
-       else if (b <= 0) return a - b;
-       else {
-               /* a<0, b>0 */  
-
-               ulongword A = (ulongword)-(a + 1) + b;
-               return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
-       }
 }
 
-static unsigned char const bitoff[ 256 ] = {
-        8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
-        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-word gsm_norm (longword a )
+static unsigned char const bitoff [256] = {
+       8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+} ;
+
+int16_t gsm_norm (int32_t a)
 /*
  * the number of left shifts needed to normalize the 32 bit
  * variable L_var1 for positive values on the interval
  *
  * with minimum of
- * minimum of 1073741824  (01000000000000000000000000000000) and 
+ * minimum of 1073741824  (01000000000000000000000000000000) and
  * maximum of 2147483647  (01111111111111111111111111111111)
  *
  *
  * and for negative values on the interval with
  * minimum of -2147483648 (-10000000000000000000000000000000) and
- * maximum of -1073741824 ( -1000000000000000000000000000000).
+ * maximum of -1073741824 (-1000000000000000000000000000000).
  *
  * in order to normalize the result, the following
- * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ * operation must be done: L_norm_var1 = L_var1 << norm (L_var1) ;
  *
  * (That's 'ffs', only from the left, not the right..)
  */
 {
-       assert(a != 0);
-
-       if (a < 0) {
-               if (a <= -1073741824) return 0;
-               a = ~a;
-       }
-
-       return    a & 0xffff0000 
-               ? ( a & 0xff000000
-                 ?  -1 + bitoff[ 0xFF & (a >> 24) ]
-                 :   7 + bitoff[ 0xFF & (a >> 16) ] )
-               : ( a & 0xff00
-                 ?  15 + bitoff[ 0xFF & (a >> 8) ]
-                 :  23 + bitoff[ 0xFF & a ] );
+       assert (a != 0) ;
+
+       if (a < 0)
+       {       if (a <= -1073741824) return 0 ;
+               a = ~a ;
+               }
+
+       return a & 0xffff0000
+               ? (a & 0xff000000
+                       ? -1 + bitoff [0xFF & (a >> 24)]
+                       : 7 + bitoff [0xFF & (a >> 16)])
+               : (a & 0xff00
+                       ? 15 + bitoff [0xFF & (a >> 8)]
+                       : 23 + bitoff [0xFF & a]) ;
 }
 
-longword gsm_L_asl (longword a, int n)
+int32_t gsm_L_asl (int32_t a, int n)
 {
-       if (n >= 32) return 0;
-       if (n <= -32) return -(a < 0);
-       if (n < 0) return gsm_L_asr(a, -n);
-       return a << n;
+       if (n >= 32) return 0 ;
+       if (n <= -32) return - (a < 0) ;
+       if (n < 0) return gsm_L_asr (a, -n) ;
+       return a << n ;
 }
 
-word gsm_asr (word a, int n)
+int16_t gsm_asr (int16_t a, int n)
 {
-       if (n >= 16) return -(a < 0);
-       if (n <= -16) return 0;
-       if (n < 0) return a << -n;
+       if (n >= 16) return - (a < 0) ;
+       if (n <= -16) return 0 ;
+       if (n < 0) return a << -n ;
 
-       return SASR_W (a, (word) n);
+       return SASR_W (a, (int16_t) n) ;
 }
 
-word gsm_asl (word a, int n)
+int16_t gsm_asl (int16_t a, int n)
 {
-       if (n >= 16) return 0;
-       if (n <= -16) return -(a < 0);
-       if (n < 0) return gsm_asr(a, -n);
-       return a << n;
+       if (n >= 16) return 0 ;
+       if (n <= -16) return - (a < 0) ;
+       if (n < 0) return gsm_asr (a, -n) ;
+       return a << n ;
 }
 
-longword gsm_L_asr (longword a, int n)
+int32_t gsm_L_asr (int32_t a, int n)
 {
-       if (n >= 32) return -(a < 0);
-       if (n <= -32) return 0;
-       if (n < 0) return a << -n;
+       if (n >= 32) return - (a < 0) ;
+       if (n <= -32) return 0 ;
+       if (n < 0) return a << -n ;
 
-       return SASR_L (a, (word) n);
+       return SASR_L (a, (int16_t) n) ;
 }
 
 /*
-**     word gsm_asr (word a, int n)
+**     int16_t gsm_asr (int16_t a, int n)
 **     {
-**             if (n >= 16) return -(a < 0);
-**             if (n <= -16) return 0;
-**             if (n < 0) return a << -n;
-**     
+**             if (n >= 16) return - (a < 0) ;
+**             if (n <= -16) return 0 ;
+**             if (n < 0) return a << -n ;
+**
 **     #       ifdef   SASR_W
-**                     return a >> n;
+**                     return a >> n ;
 **     #       else
-**                     if (a >= 0) return a >> n;
-**                     else return -(word)( -(uword)a >> n );
+**                     if (a >= 0) return a >> n ;
+**                     else return - (int16_t) (- (uint16_t)a >> n) ;
 **     #       endif
 **     }
-**     
+**
 */
-/* 
+/*
  *  (From p. 46, end of section 4.2.5)
  *
  *  NOTE: The following lines gives [sic] one correct implementation
- *       of the div(num, denum) arithmetic operation.  Compute div
+ *      of the div (num, denum) arithmetic operation.  Compute div
  *        which is the integer division of num by denum: with denum
- *       >= num > 0
+ *      >= num > 0
  */
 
-word gsm_div (word num, word denum)
+int16_t gsm_div (int16_t num, int16_t denum)
 {
-       longword        L_num   = num;
-       longword        L_denum = denum;
-       word            div     = 0;
-       int             k       = 15;
+       int32_t L_num = num ;
+       int32_t L_denum = denum ;
+       int16_t         div = 0 ;
+       int                     k = 15 ;
 
        /* The parameter num sometimes becomes zero.
-        * Although this is explicitly guarded against in 4.2.5,
-        * we assume that the result should then be zero as well.
-        */
+       * Although this is explicitly guarded against in 4.2.5,
+       * we assume that the result should then be zero as well.
+       */
 
-       /* assert(num != 0); */
+       /* assert (num != 0) ; */
 
-       assert(num >= 0 && denum >= num);
+       assert (num >= 0 && denum >= num) ;
        if (num == 0)
-           return 0;
+               return 0 ;
 
-       while (k--) {
-               div   <<= 1;
-               L_num <<= 1;
+       while (k--)
+       {       div <<= 1 ;
+               L_num <<= 1 ;
 
-               if (L_num >= L_denum) {
-                       L_num -= L_denum;
-                       div++;
+               if (L_num >= L_denum)
+               {       L_num -= L_denum ;
+                       div++ ;
+                       }
                }
-       }
 
-       return div;
+       return div ;
 }
 
index 78cb853..991913b 100644 (file)
 
 #include       "gsm610_priv.h"
 
-/* 
- *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
+/*
+ *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
  */
 
 void Gsm_Coder (
 
        struct gsm_state        * State,
 
-       word    * s,    /* [0..159] samples                     IN      */
+       int16_t * s,    /* [0..159] samples                     IN      */
 
 /*
  * The RPE-LTD coder works on a frame by frame basis.  The length of
  * the frame is equal to 160 samples.  Some computations are done
  * once per frame to produce at the output of the coder the
- * LARc[1..8] parameters which are the coded LAR coefficients and 
+ * LARc [1..8] parameters which are the coded LAR coefficients and
  * also to realize the inverse filtering operation for the entire
- * frame (160 samples of signal d[0..159]).  These parts produce at
+ * frame (160 samples of signal d [0..159]).  These parts produce at
  * the output of the coder:
  */
 
-       word    * LARc, /* [0..7] LAR coefficients              OUT     */
+       int16_t * LARc, /* [0..7] LAR coefficients              OUT     */
 
 /*
  * Procedure 4.2.11 to 4.2.18 are to be executed four times per
@@ -38,50 +38,50 @@ void Gsm_Coder (
  * 40 samples.  These parts produce at the output of the coder:
  */
 
-       word    * Nc,   /* [0..3] LTP lag                       OUT     */
-       word    * bc,   /* [0..3] coded LTP gain                OUT     */
-       word    * Mc,   /* [0..3] RPE grid selection            OUT     */
-       word    * xmaxc,/* [0..3] Coded maximum amplitude       OUT     */
-       word    * xMc   /* [13*4] normalized RPE samples        OUT     */
+       int16_t *Nc,    /* [0..3] LTP lag                       OUT     */
+       int16_t *bc,    /* [0..3] coded LTP gain                OUT     */
+       int16_t *Mc,    /* [0..3] RPE grid selection            OUT     */
+       int16_t *xmaxc, /* [0..3] Coded maximum amplitude       OUT     */
+       int16_t *xMc    /* [13*4] normalized RPE samples        OUT     */
 )
 {
-       int     k;
-       word    * dp  = State->dp0 + 120;       /* [ -120...-1 ] */
-       word    * dpp = dp;             /* [ 0...39 ]    */
-
-       word    so[160];
-
-       Gsm_Preprocess                  (State, s, so);
-       Gsm_LPC_Analysis                (State, so, LARc);
-       Gsm_Short_Term_Analysis_Filter  (State, LARc, so);
-
-       for (k = 0; k <= 3; k++, xMc += 13) {
-
-               Gsm_Long_Term_Predictor ( State,
-                                        so+k*40, /* d      [0..39] IN  */
-                                        dp,      /* dp  [-120..-1] IN  */
-                                       State->e + 5,     /* e      [0..39] OUT */
-                                       dpp,      /* dpp    [0..39] OUT */
-                                        Nc++,
-                                        bc++);
-
-               Gsm_RPE_Encoding        ( /*-S,-*/
-                                       State->e + 5,   /* e      ][0..39][ IN/OUT */
-                                         xmaxc++, Mc++, xMc );
+       int     k ;
+       int16_t *dp = State->dp0 + 120 ;        /* [-120...-1] */
+       int16_t *dpp = dp ;                                     /* [0...39]      */
+
+       int16_t so [160] ;
+
+       Gsm_Preprocess (State, s, so) ;
+       Gsm_LPC_Analysis (State, so, LARc) ;
+       Gsm_Short_Term_Analysis_Filter (State, LARc, so) ;
+
+       for (k = 0 ; k <= 3 ; k++, xMc += 13)
+       {       Gsm_Long_Term_Predictor (State,
+                                       so+k*40,                /* d      [0..39] IN    */
+                                       dp,                             /* dp  [-120..-1] IN    */
+                                       State->e + 5,   /* e      [0..39] OUT   */
+                                       dpp,                    /* dpp    [0..39] OUT */
+                                       Nc++,
+                                       bc++) ;
+
+               Gsm_RPE_Encoding (/*-S,-*/
+                                       State->e + 5,   /* e     ][0..39][IN/OUT */
+                                       xmaxc++, Mc++, xMc) ;
                /*
                 * Gsm_Update_of_reconstructed_short_time_residual_signal
-                *                      ( dpp, State->e + 5, dp );
+                *                      (dpp, State->e + 5, dp) ;
                 */
 
-               { register int i;
-                 for (i = 0; i <= 39; i++)
-                       dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] );
+               {
+                       register int i ;
+                       for (i = 0 ; i <= 39 ; i++)
+                               dp [i] = GSM_ADD (State->e [5 + i], dpp [i]) ;
                }
-               dp  += 40;
-               dpp += 40;
+               dp += 40 ;
+               dpp += 40 ;
 
        }
-       (void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160),
-               120 * sizeof(*State->dp0) );
+       memcpy ((char *) State->dp0, (char *) (State->dp0 + 160),
+               120 * sizeof (*State->dp0)) ;
 }
 
index 350df12..2a0712f 100644 (file)
 
 static void Postprocessing (
        struct gsm_state        * S,
-       register word           * s)
+       register int16_t                * s)
 {
-       register int            k;
-       register word           msr = S->msr;
-       register word           tmp;
-
-       for (k = 160; k--; s++) {
-               tmp = GSM_MULT_R( msr, 28180 );
-               msr = GSM_ADD(*s, tmp);            /* Deemphasis             */
-               *s  = GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */
-       }
-       S->msr = msr;
+       register int            k ;
+       register int16_t                msr = S->msr ;
+       register int16_t                tmp ;
+
+       for (k = 160 ; k-- ; s++)
+       {       tmp = GSM_MULT_R (msr, 28180) ;
+               msr = GSM_ADD (*s, tmp) ;                       /* Deemphasis        */
+               *s = GSM_ADD (msr, msr) & 0xFFF8 ;      /* Truncation & Upscaling */
+               }
+       S->msr = msr ;
 }
 
 void Gsm_Decoder (
        struct gsm_state        * S,
 
-       word            * LARcr,        /* [0..7]               IN      */
+       int16_t         * LARcr,        /* [0..7]               IN      */
 
-       word            * Ncr,          /* [0..3]               IN      */
-       word            * bcr,          /* [0..3]               IN      */
-       word            * Mcr,          /* [0..3]               IN      */
-       word            * xmaxcr,       /* [0..3]               IN      */
-       word            * xMcr,         /* [0..13*4]            IN      */
+       int16_t         * Ncr,          /* [0..3]               IN      */
+       int16_t         * bcr,          /* [0..3]               IN      */
+       int16_t         * Mcr,          /* [0..3]               IN      */
+       int16_t         * xmaxcr,       /* [0..3]               IN      */
+       int16_t         * xMcr,         /* [0..13*4]            IN      */
 
-       word            * s)            /* [0..159]             OUT     */
+       int16_t         * s)            /* [0..159]             OUT     */
 {
-       int             j, k;
-       word            erp[40], wt[160];
-       word            * drp = S->dp0 + 120;
+       int             j, k ;
+       int16_t         erp [40], wt [160] ;
+       int16_t         *drp = S->dp0 + 120 ;
 
-       for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+       for (j = 0 ; j <= 3 ; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13)
+       {       Gsm_RPE_Decoding (/*-S,-*/ *xmaxcr, *Mcr, xMcr, erp) ;
+               Gsm_Long_Term_Synthesis_Filtering (S, *Ncr, *bcr, erp, drp) ;
 
-               Gsm_RPE_Decoding( /*-S,-*/ *xmaxcr, *Mcr, xMcr, erp );
-               Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+               for (k = 0 ; k <= 39 ; k++) wt [j * 40 + k] = drp [k] ;
+               }
 
-               for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
-       }
-
-       Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
-       Postprocessing(S, s);
+       Gsm_Short_Term_Synthesis_Filter (S, LARcr, wt, s) ;
+       Postprocessing (S, s) ;
 }
 
index 48aecc7..6506a65 100644 (file)
  *     Interface
  */
 
-typedef struct gsm_state *     gsm;
-typedef short                          gsm_signal            /* signed 16 bit */
-typedef unsigned char          gsm_byte;
-typedef gsm_byte                       gsm_frame[33];          /* 33 * 8 bits   */
+typedef struct gsm_state *     gsm ;
+typedef short                          gsm_signal ;            /* signed 16 bit */
+typedef unsigned char          gsm_byte ;
+typedef gsm_byte                       gsm_frame [33] ;        /* 33 * 8 bits   */
 
-#define        GSM_MAGIC               0xD                     /* 13 kbit/s RPE-LTP */
+#define GSM_MAGIC                      0xD                     /* 13 kbit/s RPE-LTP */
 
 #define        GSM_PATCHLEVEL          10
 #define        GSM_MINOR                       0
@@ -31,21 +31,21 @@ typedef gsm_byte                    gsm_frame[33];          /* 33 * 8 bits   */
 #define        GSM_OPT_FRAME_INDEX     5
 #define        GSM_OPT_FRAME_CHAIN     6
 
-gsm  gsm_create        (void);
+gsm gsm_create (void) ;
 
 /* Added for libsndfile : May 6, 2002 */
-void gsm_init (gsm);   
+void gsm_init (gsm) ;
 
-void gsm_destroy (gsm);        
+void gsm_destroy (gsm) ;
 
-int  gsm_print   (FILE *, gsm, gsm_byte  *);
-int  gsm_option  (gsm, int, int *);
+int gsm_print  (FILE *, gsm, gsm_byte *) ;
+int gsm_option (gsm, int, int *) ;
 
-void gsm_encode  (gsm, gsm_signal *, gsm_byte  *);
-int  gsm_decode  (gsm, gsm_byte   *, gsm_signal *);
+void gsm_encode        (gsm, gsm_signal *, gsm_byte *) ;
+int gsm_decode (gsm, gsm_byte *, gsm_signal *) ;
 
-int  gsm_explode (gsm, gsm_byte   *, gsm_signal *);
-void gsm_implode (gsm, gsm_signal *, gsm_byte   *);
+int gsm_explode (gsm, gsm_byte *, gsm_signal *) ;
+void gsm_implode (gsm, gsm_signal *, gsm_byte *) ;
 
 #endif /* GSM_H */
 
index e121c1c..9e650cc 100644 (file)
 
 
 
-typedef short                          word;           /* 16 bit signed int    */
-typedef int                                    longword;       /* 32 bit signed int    */
+typedef short                          int16_t ;               /* 16 bit signed int    */
+typedef int                                    int32_t ;       /* 32 bit signed int    */
 
-typedef unsigned short         uword;          /* unsigned word        */
-typedef unsigned int           ulongword;      /* unsigned longword    */
+typedef unsigned short         uint16_t ;              /* unsigned int16_t     */
+typedef unsigned int           uint32_t ;      /* unsigned int32_t     */
 
 struct gsm_state
-{      word                    dp0[ 280 ] ;
+{      int16_t                 dp0 [280] ;
 
-       word                    z1;                     /* preprocessing.c, Offset_com. */
-       longword                L_z2;           /*                  Offset_com. */
-       int                             mp                    /*                  Preemphasis */
+       int16_t                 z1 ;                    /* preprocessing.c, Offset_com. */
+       int32_t         L_z2 ;                  /*                  Offset_com. */
+       int                             mp ;                    /*                  Preemphasis */
 
-       word                    u[8] ;                  /* short_term_aly_filter.c      */
-       word                    LARpp[2][8] ;   /*                              */
-       word                    j;                              /*                              */
+       int16_t                 u [8] ;                 /* short_term_aly_filter.c      */
+       int16_t                 LARpp [2][8] ;  /*                              */
+       int16_t                 j ;                             /*                              */
 
-       word            ltp_cut;        /* long_term.c, LTP crosscorr.  */
-       word                    nrp;                    /* 40 */        /* long_term.c, synthesis       */
-       word                    v[9] ;                  /* short_term.c, synthesis      */
-       word                    msr;                    /* decoder.c,   Postprocessing  */
+       int16_t                 ltp_cut ;               /* long_term.c, LTP crosscorr.  */
+       int16_t                 nrp ;                   /* 40 */        /* long_term.c, synthesis       */
+       int16_t                 v [9] ;                 /* short_term.c, synthesis      */
+       int16_t                 msr ;                   /* decoder.c,   Postprocessing  */
 
-       char                    verbose               /* only used if !NDEBUG         */
-       char                    fast                  /* only used if FAST            */
+       char                    verbose ;               /* only used if !NDEBUG         */
+       char                    fast ;                  /* only used if FAST            */
 
-       char                    wav_fmt               /* only used if WAV49 defined   */
-       unsigned char   frame_index   /*            odd/even chaining */
-       unsigned char   frame_chain   /*   half-byte to carry forward */
+       char                    wav_fmt ;               /* only used if WAV49 defined   */
+       unsigned char   frame_index ;   /*            odd/even chaining */
+       unsigned char   frame_chain ;   /*   half-byte to carry forward */
 
        /* Moved here from code.c where it was defined as static */
-       word e[50] ;
+       int16_t e [50] ;
 } ;
 
 typedef struct gsm_state GSM_STATE ;
 
 #define        MIN_WORD        (-32767 - 1)
-#define        MAX_WORD          32767
+#define        MAX_WORD        32767
 
 #define        MIN_LONGWORD    (-2147483647 - 1)
-#define        MAX_LONGWORD      2147483647
+#define        MAX_LONGWORD    2147483647
 
 /* Signed arithmetic shift right. */
-static inline word
-SASR_W (word x, word by)
-{      return (x >> by) ;
-} /* SASR */
-
-static inline longword
-SASR_L (longword x, word by)
-{      return (x >> by) ;
-} /* SASR */
+static inline int16_t
+SASR_W (int16_t x, int16_t by)
+{      if (x >= 0)
+               return x >> by ;
+       return ~ ((~x) >> by) ;
+} /* SASR_W */
+
+static inline int32_t
+SASR_L (int32_t x, int16_t by)
+{      if (x >= 0)
+               return x >> by ;
+       return ~ ((~x) >> by) ;
+} /* SASR_L */
+
+/* Signed arithmetic shift left. */
+static inline int16_t
+SASL_W (int16_t x, int16_t by)
+{      if (x >= 0)
+               return x << by ;
+       return - ((-x) << by) ;
+} /* SASR_W */
+
+static inline int32_t
+SASL_L (int32_t x, int16_t by)
+{      if (x >= 0)
+               return x << by ;
+       return - ((-x) << by) ;
+} /* SASR_L */
 
 /*
  *     Prototypes from add.c
  */
-word   gsm_mult                (word a, word b) ;
-longword gsm_L_mult    (word a, word b) ;
-word   gsm_mult_r              (word a, word b) ;
+int16_t        gsm_mult                (int16_t a, int16_t b) ;
+int32_t gsm_L_mult     (int16_t a, int16_t b) ;
+int16_t        gsm_mult_r              (int16_t a, int16_t b) ;
 
-word   gsm_div                 (word num, word denum) ;
+int16_t        gsm_div                 (int16_t num, int16_t denum) ;
 
-word   gsm_add                 (word a, word b ) ;
-longword gsm_L_add     (longword a, longword b ) ;
+int16_t        gsm_add                 (int16_t a, int16_t b) ;
+int32_t gsm_L_add              (int32_t a, int32_t b) ;
 
-word   gsm_sub                 (word a, word b) ;
-longword gsm_L_sub     (longword a, longword b) ;
+int16_t        gsm_sub                 (int16_t a, int16_t b) ;
+int32_t gsm_L_sub              (int32_t a, int32_t b) ;
 
-word   gsm_abs                 (word a) ;
+int16_t        gsm_abs                 (int16_t a) ;
 
-word   gsm_norm                (longword a ) ;
+int16_t        gsm_norm                (int32_t a) ;
 
-longword gsm_L_asl     (longword a, int n) ;
-word   gsm_asl                 (word a, int n) ;
+int32_t gsm_L_asl              (int32_t a, int n) ;
+int16_t        gsm_asl                 (int16_t a, int n) ;
 
-longword gsm_L_asr     (longword a, int n) ;
-word   gsm_asr                 (word a, int n) ;
+int32_t gsm_L_asr              (int32_t a, int n) ;
+int16_t        gsm_asr                 (int16_t a, int n) ;
 
 /*
  *  Inlined functions from add.h
  */
 
-static inline longword
-GSM_MULT_R (word a, word b)
-{      return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ;
+static inline int32_t
+GSM_MULT_R (int16_t a, int16_t b)
+{      return (((int32_t) (a)) * ((int32_t) (b)) + 16384) >> 15 ;
 } /* GSM_MULT_R */
 
-static inline longword
-GSM_MULT (word a, word b)
-{      return (((longword) (a)) * ((longword) (b))) >> 15 ;
+static inline int32_t
+GSM_MULT (int16_t a, int16_t b)
+{      return (((int32_t) (a)) * ((int32_t) (b))) >> 15 ;
 } /* GSM_MULT */
 
-static inline longword
-GSM_L_MULT (word a, word b)
-{      return ((longword) (a)) * ((longword) (b)) << 1 ;
+static inline int32_t
+GSM_L_MULT (int16_t a, int16_t b)
+{      return ((int32_t) (a)) * ((int32_t) (b)) << 1 ;
 } /* GSM_L_MULT */
 
-static inline longword
-GSM_L_ADD (longword a, longword b)
-{      ulongword utmp ;
+static inline int32_t
+GSM_L_ADD (int32_t a, int32_t b)
+{      uint32_t utmp ;
 
        if (a < 0 && b < 0)
-       {       utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ;
-               return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ;
+       {       utmp = (uint32_t) - ((a) + 1) + (uint32_t) - ((b) + 1) ;
+               return (utmp >= (uint32_t) MAX_LONGWORD) ? MIN_LONGWORD : - (int32_t) utmp - 2 ;
                } ;
 
        if (a > 0 && b > 0)
-       {       utmp = (ulongword) a + (ulongword) b ;
-               return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
+       {       utmp = (uint32_t) a + (uint32_t) b ;
+               return (utmp >= (uint32_t) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
                } ;
 
        return a + b ;
 } /* GSM_L_ADD */
 
-static inline longword
-GSM_ADD (word a, word b)
-{      longword ltmp ;
+static inline int32_t
+GSM_ADD (int16_t a, int16_t b)
+{      int32_t ltmp ;
 
-       ltmp = ((longword) a) + ((longword) b) ;
+       ltmp = ((int32_t) a) + ((int32_t) b) ;
 
        if (ltmp >= MAX_WORD)
                return MAX_WORD ;
@@ -146,11 +165,11 @@ GSM_ADD (word a, word b)
        return ltmp ;
 } /* GSM_ADD */
 
-static inline longword
-GSM_SUB (word a, word b)
-{      longword ltmp ;
+static inline int32_t
+GSM_SUB (int16_t a, int16_t b)
+{      int32_t ltmp ;
 
-       ltmp = ((longword) a) - ((longword) b) ;
+       ltmp = ((int32_t) a) - ((int32_t) b) ;
 
        if (ltmp >= MAX_WORD)
                ltmp = MAX_WORD ;
@@ -160,8 +179,8 @@ GSM_SUB (word a, word b)
        return ltmp ;
 } /* GSM_SUB */
 
-static inline word
-GSM_ABS (word a)
+static inline int16_t
+GSM_ABS (int16_t a)
 {
        if (a > 0)
                return a ;
@@ -176,124 +195,145 @@ GSM_ABS (word a)
  */
 void Gsm_Coder (
                struct gsm_state        * S,
-               word    * s,    /* [0..159] samples             IN      */
-               word    * LARc, /* [0..7] LAR coefficients      OUT     */
-               word    * Nc,   /* [0..3] LTP lag               OUT     */
-               word    * bc,   /* [0..3] coded LTP gain        OUT     */
-               word    * Mc,   /* [0..3] RPE grid selection    OUT     */
-               word    * xmaxc,/* [0..3] Coded maximum amplitude OUT   */
-               word    * xMc) ;/* [13*4] normalized RPE samples OUT    */
+               int16_t * s,            /* [0..159] samples             IN      */
+               int16_t * LARc,         /* [0..7] LAR coefficients      OUT     */
+               int16_t * Nc,           /* [0..3] LTP lag               OUT     */
+               int16_t * bc,           /* [0..3] coded LTP gain        OUT     */
+               int16_t * Mc,           /* [0..3] RPE grid selection    OUT     */
+               int16_t * xmaxc,        /* [0..3] Coded maximum amplitude OUT   */
+               int16_t * xMc) ;        /* [13*4] normalized RPE samples OUT    */
 
 void Gsm_Long_Term_Predictor (         /* 4x for 160 samples */
                struct gsm_state * S,
-               word    * d,    /* [0..39]   residual signal    IN      */
-               word    * dp,   /* [-120..-1] d'                IN      */
-               word    * e,    /* [0..40]                      OUT     */
-               word    * dpp,  /* [0..40]                      OUT     */
-               word    * Nc,   /* correlation lag              OUT     */
-               word    * bc) ; /* gain factor                  OUT     */
+               int16_t * d,    /* [0..39]   residual signal    IN      */
+               int16_t * dp,   /* [-120..-1] d'                IN      */
+               int16_t * e,    /* [0..40]                      OUT     */
+               int16_t * dpp,  /* [0..40]                      OUT     */
+               int16_t * Nc,   /* correlation lag              OUT     */
+               int16_t * bc) ; /* gain factor                  OUT     */
 
 void Gsm_LPC_Analysis (
                struct gsm_state * S,
-               word * s,               /* 0..159 signals       IN/OUT  */
-               word * LARc) ;   /* 0..7   LARc's       OUT     */
+               int16_t * s,            /* 0..159 signals       IN/OUT  */
+               int16_t * LARc) ;       /* 0..7   LARc's        OUT     */
 
 void Gsm_Preprocess (
                struct gsm_state * S,
-               word * s, word * so) ;
+               int16_t * s, int16_t * so) ;
 
 void Gsm_Encoding (
                struct gsm_state * S,
-               word    * e,
-               word    * ep,
-               word    * xmaxc,
-               word    * Mc,
-               word    * xMc) ;
+               int16_t * e,
+               int16_t * ep,
+               int16_t * xmaxc,
+               int16_t * Mc,
+               int16_t * xMc) ;
 
 void Gsm_Short_Term_Analysis_Filter (
                struct gsm_state * S,
-               word    * LARc, /* coded log area ratio [0..7]  IN      */
-               word    * d) ;  /* st res. signal [0..159]      IN/OUT  */
+               int16_t * LARc, /* coded log area ratio [0..7]  IN      */
+               int16_t * d) ;  /* st res. signal [0..159]      IN/OUT  */
 
 void Gsm_Decoder (
                struct gsm_state * S,
-               word    * LARcr,        /* [0..7]               IN      */
-               word    * Ncr,          /* [0..3]               IN      */
-               word    * bcr,          /* [0..3]               IN      */
-               word    * Mcr,          /* [0..3]               IN      */
-               word    * xmaxcr,       /* [0..3]               IN      */
-               word    * xMcr,         /* [0..13*4]            IN      */
-               word    * s) ;          /* [0..159]             OUT     */
+               int16_t * LARcr,        /* [0..7]               IN      */
+               int16_t * Ncr,          /* [0..3]               IN      */
+               int16_t * bcr,          /* [0..3]               IN      */
+               int16_t * Mcr,          /* [0..3]               IN      */
+               int16_t * xmaxcr,       /* [0..3]               IN      */
+               int16_t * xMcr,         /* [0..13*4]            IN      */
+               int16_t * s) ;          /* [0..159]             OUT     */
 
 void Gsm_Decoding (
                struct gsm_state * S,
-               word    xmaxcr,
-               word    Mcr,
-               word    * xMcr,         /* [0..12]              IN      */
-               word    * erp) ;        /* [0..39]              OUT     */
+               int16_t         xmaxcr,
+               int16_t Mcr,
+               int16_t * xMcr,         /* [0..12]              IN      */
+               int16_t * erp) ;        /* [0..39]              OUT     */
 
 void Gsm_Long_Term_Synthesis_Filtering (
                struct gsm_state* S,
-               word    Ncr,
-               word    bcr,
-               word    * erp,          /* [0..39]                IN    */
-               word    * drp) ;        /* [-120..-1] IN, [0..40] OUT   */
+               int16_t Ncr,
+               int16_t bcr,
+               int16_t * erp,          /* [0..39]                IN    */
+               int16_t * drp) ;        /* [-120..-1] IN, [0..40] OUT   */
 
 void Gsm_RPE_Decoding (
        /*-struct gsm_state *S,-*/
-               word xmaxcr,
-               word Mcr,
-               word * xMcr,  /* [0..12], 3 bits             IN      */
-               word * erp) ; /* [0..39]                     OUT     */
+               int16_t xmaxcr,
+               int16_t Mcr,
+               int16_t * xMcr, /* [0..12], 3 bits             IN      */
+               int16_t * erp) ;        /* [0..39]                     OUT     */
 
 void Gsm_RPE_Encoding (
                /*-struct gsm_state * S,-*/
-               word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
-               word    * xmaxc,        /*                              OUT */
-               word    * Mc,           /*                              OUT */
-               word    * xMc) ;        /* [0..12]                      OUT */
+               int16_t * e,                    /* -5..-1][0..39][40..44     IN/OUT  */
+               int16_t * xmaxc,                /*                              OUT */
+               int16_t * Mc,                   /*                              OUT */
+               int16_t * xMc) ;                /* [0..12]                      OUT */
 
 void Gsm_Short_Term_Synthesis_Filter (
                struct gsm_state * S,
-               word    * LARcr,        /* log area ratios [0..7]  IN   */
-               word    * drp,          /* received d [0...39]     IN   */
-               word    * s) ;          /* signal   s [0..159]    OUT   */
+               int16_t * LARcr,        /* log area ratios [0..7]  IN   */
+               int16_t * drp,          /* received d [0...39]     IN   */
+               int16_t * s) ;          /* signal   s [0..159]    OUT   */
 
 void Gsm_Update_of_reconstructed_short_time_residual_signal (
-               word    * dpp,          /* [0...39]     IN      */
-               word    * ep,           /* [0...39]     IN      */
-               word    * dp) ;         /* [-120...-1]  IN/OUT  */
+               int16_t * dpp,          /* [0...39]     IN      */
+               int16_t * ep,           /* [0...39]     IN      */
+               int16_t * dp) ;         /* [-120...-1]  IN/OUT  */
 
 /*
  *  Tables from table.c
  */
 #ifndef        GSM_TABLE_C
 
-extern word gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ;
-extern word gsm_INVA [8] ;
-extern word gsm_DLB [4], gsm_QLB [4] ;
-extern word gsm_H [11] ;
-extern word gsm_NRFAC [8] ;
-extern word gsm_FAC [8] ;
+extern int16_t gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ;
+extern int16_t gsm_INVA [8] ;
+extern int16_t gsm_DLB [4], gsm_QLB [4] ;
+extern int16_t gsm_H [11] ;
+extern int16_t gsm_NRFAC [8] ;
+extern int16_t gsm_FAC [8] ;
 
 #endif /* GSM_TABLE_C */
 
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+
+static inline int32_t ALWAYS_INLINE
+arith_shift_left (int32_t x, int shift)
+{      return (int32_t) (((uint32_t) x) << shift) ;
+} /* arith_shift_left */
+
+static inline int32_t ALWAYS_INLINE
+arith_shift_right (int32_t x, int shift)
+{      if (x >= 0)
+               return x << shift ;
+       return ~ ((~x) << shift) ;
+} /* arith_shift_right */
+
+
 /*
  *  Debugging
  */
 #ifdef NDEBUG
 
-#      define  gsm_debug_words(a, b, c, d)             /* nil */
-#      define  gsm_debug_longwords(a, b, c, d)         /* nil */
-#      define  gsm_debug_word(a, b)                    /* nil */
-#      define  gsm_debug_longword(a, b)                /* nil */
+#      define  gsm_debug_int16_ts(a, b, c, d)          /* nil */
+#      define  gsm_debug_int32_ts(a, b, c, d)          /* nil */
+#      define  gsm_debug_int16_t(a, b)                 /* nil */
+#      define  gsm_debug_int32_t(a, b)         /* nil */
 
 #else  /* !NDEBUG => DEBUG */
 
-       void  gsm_debug_words     (char * name, int, int, word *) ;
-       void  gsm_debug_longwords (char * name, int, int, longword *) ;
-       void  gsm_debug_longword  (char * name, longword) ;
-       void  gsm_debug_word      (char * name, word) ;
+       void gsm_debug_int16_ts         (char * name, int, int, int16_t *) ;
+       void gsm_debug_int32_ts (char * name, int, int, int32_t *) ;
+       void gsm_debug_int32_t          (char * name, int32_t) ;
+       void gsm_debug_int16_t                  (char * name, int16_t) ;
 
 #endif /* !NDEBUG */
 
index 2bb4307..05425dd 100644 (file)
 
 gsm gsm_create (void)
 {
-       gsm  r;
+       gsm ;
 
-       r = malloc (sizeof(struct gsm_state));
-       if (!r) return r;
-       
-       memset((char *)r, 0, sizeof (struct gsm_state));
-       r->nrp = 40;
+       r = malloc (sizeof (struct gsm_state)) ;
+       if (!r) return r ;
 
-       return r;
+       memset ((char *) r, 0, sizeof (struct gsm_state)) ;
+       r->nrp = 40 ;
+
+       return r ;
 }
 
 /* Added for libsndfile : May 6, 2002. Not sure if it works. */
@@ -33,5 +33,5 @@ void gsm_init (gsm state)
 {
        memset (state, 0, sizeof (struct gsm_state)) ;
        state->nrp = 40 ;
-} 
+}
 
index b13308a..04411be 100644 (file)
 
 int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
 {
-       word    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+       int16_t LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ;
 
 #ifdef WAV49
-       if (s->wav_fmt) {
+       if (s->wav_fmt)
+       {       uint16_t sr = 0 ;
 
-               uword sr = 0;
+               s->frame_index = !s->frame_index ;
+               if (s->frame_index)
+               {       sr = *c++ ;
+                       LARc [0] = sr & 0x3f ; sr >>= 6 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       LARc [1] = sr & 0x3f ; sr >>= 6 ;
+                       sr |= (uint16_t) *c++ << 4 ;
+                       LARc [2] = sr & 0x1f ; sr >>= 5 ;
+                       LARc [3] = sr & 0x1f ; sr >>= 5 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       LARc [4] = sr & 0xf ; sr >>= 4 ;
+                       LARc [5] = sr & 0xf ; sr >>= 4 ;
+                       sr |= (uint16_t) *c++ << 2 ;                    /* 5 */
+                       LARc [6] = sr & 0x7 ; sr >>= 3 ;
+                       LARc [7] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 4 ;
+                       Nc [0] = sr & 0x7f ; sr >>= 7 ;
+                       bc [0] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [0] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmaxc [0] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [0] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [1] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [2] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [3] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [4] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [5] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;                    /* 10 */
+                       xmc [6] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [7] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [8] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [9] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [10] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [11] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [12] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 4 ;
+                       Nc [1] = sr & 0x7f ; sr >>= 7 ;
+                       bc [1] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [1] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmaxc [1] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [13] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;                             /* 15 */
+                       xmc [14] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [15] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [16] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [17] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [18] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [19] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [20] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [21] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [22] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [23] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [24] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [25] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 4 ;                    /* 20 */
+                       Nc [2] = sr & 0x7f ; sr >>= 7 ;
+                       bc [2] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [2] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmaxc [2] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [26] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [27] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [28] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [29] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [30] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [31] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [32] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [33] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [34] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;                             /* 25 */
+                       xmc [35] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [36] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [37] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [38] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 4 ;
+                       Nc [3] = sr & 0x7f ; sr >>= 7 ;
+                       bc [3] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [3] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmaxc [3] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [39] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [40] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [41] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;                    /* 30 */
+                       xmc [42] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [43] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [44] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [45] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [46] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [47] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [48] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [49] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [50] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [51] = sr & 0x7 ; sr >>= 3 ;
 
-               s->frame_index = !s->frame_index;
-               if (s->frame_index) {
-
-                       sr = *c++;
-                       LARc[0] = sr & 0x3f;  sr >>= 6;
-                       sr |= (uword)*c++ << 2;
-                       LARc[1] = sr & 0x3f;  sr >>= 6;
-                       sr |= (uword)*c++ << 4;
-                       LARc[2] = sr & 0x1f;  sr >>= 5;
-                       LARc[3] = sr & 0x1f;  sr >>= 5;
-                       sr |= (uword)*c++ << 2;
-                       LARc[4] = sr & 0xf;  sr >>= 4;
-                       LARc[5] = sr & 0xf;  sr >>= 4;
-                       sr |= (uword)*c++ << 2;                 /* 5 */
-                       LARc[6] = sr & 0x7;  sr >>= 3;
-                       LARc[7] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 4;
-                       Nc[0] = sr & 0x7f;  sr >>= 7;
-                       bc[0] = sr & 0x3;  sr >>= 2;
-                       Mc[0] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 1;
-                       xmaxc[0] = sr & 0x3f;  sr >>= 6;
-                       xmc[0] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[1] = sr & 0x7;  sr >>= 3;
-                       xmc[2] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[3] = sr & 0x7;  sr >>= 3;
-                       xmc[4] = sr & 0x7;  sr >>= 3;
-                       xmc[5] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;                 /* 10 */
-                       xmc[6] = sr & 0x7;  sr >>= 3;
-                       xmc[7] = sr & 0x7;  sr >>= 3;
-                       xmc[8] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[9] = sr & 0x7;  sr >>= 3;
-                       xmc[10] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[11] = sr & 0x7;  sr >>= 3;
-                       xmc[12] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 4;
-                       Nc[1] = sr & 0x7f;  sr >>= 7;
-                       bc[1] = sr & 0x3;  sr >>= 2;
-                       Mc[1] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 1;
-                       xmaxc[1] = sr & 0x3f;  sr >>= 6;
-                       xmc[13] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;                              /* 15 */
-                       xmc[14] = sr & 0x7;  sr >>= 3;
-                       xmc[15] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[16] = sr & 0x7;  sr >>= 3;
-                       xmc[17] = sr & 0x7;  sr >>= 3;
-                       xmc[18] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[19] = sr & 0x7;  sr >>= 3;
-                       xmc[20] = sr & 0x7;  sr >>= 3;
-                       xmc[21] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[22] = sr & 0x7;  sr >>= 3;
-                       xmc[23] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[24] = sr & 0x7;  sr >>= 3;
-                       xmc[25] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 4;                 /* 20 */
-                       Nc[2] = sr & 0x7f;  sr >>= 7;
-                       bc[2] = sr & 0x3;  sr >>= 2;
-                       Mc[2] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 1;
-                       xmaxc[2] = sr & 0x3f;  sr >>= 6;
-                       xmc[26] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[27] = sr & 0x7;  sr >>= 3;
-                       xmc[28] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[29] = sr & 0x7;  sr >>= 3;
-                       xmc[30] = sr & 0x7;  sr >>= 3;
-                       xmc[31] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[32] = sr & 0x7;  sr >>= 3;
-                       xmc[33] = sr & 0x7;  sr >>= 3;
-                       xmc[34] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;                              /* 25 */
-                       xmc[35] = sr & 0x7;  sr >>= 3;
-                       xmc[36] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[37] = sr & 0x7;  sr >>= 3;
-                       xmc[38] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 4;
-                       Nc[3] = sr & 0x7f;  sr >>= 7;
-                       bc[3] = sr & 0x3;  sr >>= 2;
-                       Mc[3] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 1;
-                       xmaxc[3] = sr & 0x3f;  sr >>= 6;
-                       xmc[39] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[40] = sr & 0x7;  sr >>= 3;
-                       xmc[41] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;                 /* 30 */
-                       xmc[42] = sr & 0x7;  sr >>= 3;
-                       xmc[43] = sr & 0x7;  sr >>= 3;
-                       xmc[44] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[45] = sr & 0x7;  sr >>= 3;
-                       xmc[46] = sr & 0x7;  sr >>= 3;
-                       xmc[47] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[48] = sr & 0x7;  sr >>= 3;
-                       xmc[49] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[50] = sr & 0x7;  sr >>= 3;
-                       xmc[51] = sr & 0x7;  sr >>= 3;
-
-                       s->frame_chain = sr & 0xf;
+                       s->frame_chain = sr & 0xf ;
                }
                else {
-                       sr = s->frame_chain;
-                       sr |= (uword)*c++ << 4;                 /* 1 */
-                       LARc[0] = sr & 0x3f;  sr >>= 6;
-                       LARc[1] = sr & 0x3f;  sr >>= 6;
-                       sr = *c++;
-                       LARc[2] = sr & 0x1f;  sr >>= 5;
-                       sr |= (uword)*c++ << 3;
-                       LARc[3] = sr & 0x1f;  sr >>= 5;
-                       LARc[4] = sr & 0xf;  sr >>= 4;
-                       sr |= (uword)*c++ << 2;
-                       LARc[5] = sr & 0xf;  sr >>= 4;
-                       LARc[6] = sr & 0x7;  sr >>= 3;
-                       LARc[7] = sr & 0x7;  sr >>= 3;
-                       sr = *c++                             /* 5 */
-                       Nc[0] = sr & 0x7f;  sr >>= 7;
-                       sr |= (uword)*c++ << 1;
-                       bc[0] = sr & 0x3;  sr >>= 2;
-                       Mc[0] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 5;
-                       xmaxc[0] = sr & 0x3f;  sr >>= 6;
-                       xmc[0] = sr & 0x7;  sr >>= 3;
-                       xmc[1] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[2] = sr & 0x7;  sr >>= 3;
-                       xmc[3] = sr & 0x7;  sr >>= 3;
-                       xmc[4] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[5] = sr & 0x7;  sr >>= 3;
-                       xmc[6] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;                 /* 10 */
-                       xmc[7] = sr & 0x7;  sr >>= 3;
-                       xmc[8] = sr & 0x7;  sr >>= 3;
-                       xmc[9] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[10] = sr & 0x7;  sr >>= 3;
-                       xmc[11] = sr & 0x7;  sr >>= 3;
-                       xmc[12] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       Nc[1] = sr & 0x7f;  sr >>= 7;
-                       sr |= (uword)*c++ << 1;
-                       bc[1] = sr & 0x3;  sr >>= 2;
-                       Mc[1] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 5;
-                       xmaxc[1] = sr & 0x3f;  sr >>= 6;
-                       xmc[13] = sr & 0x7;  sr >>= 3;
-                       xmc[14] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;                 /* 15 */
-                       xmc[15] = sr & 0x7;  sr >>= 3;
-                       xmc[16] = sr & 0x7;  sr >>= 3;
-                       xmc[17] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[18] = sr & 0x7;  sr >>= 3;
-                       xmc[19] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[20] = sr & 0x7;  sr >>= 3;
-                       xmc[21] = sr & 0x7;  sr >>= 3;
-                       xmc[22] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[23] = sr & 0x7;  sr >>= 3;
-                       xmc[24] = sr & 0x7;  sr >>= 3;
-                       xmc[25] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       Nc[2] = sr & 0x7f;  sr >>= 7;
-                       sr |= (uword)*c++ << 1;                 /* 20 */
-                       bc[2] = sr & 0x3;  sr >>= 2;
-                       Mc[2] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 5;
-                       xmaxc[2] = sr & 0x3f;  sr >>= 6;
-                       xmc[26] = sr & 0x7;  sr >>= 3;
-                       xmc[27] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1; 
-                       xmc[28] = sr & 0x7;  sr >>= 3;
-                       xmc[29] = sr & 0x7;  sr >>= 3;
-                       xmc[30] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       xmc[31] = sr & 0x7;  sr >>= 3;
-                       xmc[32] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[33] = sr & 0x7;  sr >>= 3;
-                       xmc[34] = sr & 0x7;  sr >>= 3;
-                       xmc[35] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;                 /* 25 */
-                       xmc[36] = sr & 0x7;  sr >>= 3;
-                       xmc[37] = sr & 0x7;  sr >>= 3;
-                       xmc[38] = sr & 0x7;  sr >>= 3;
-                       sr = *c++;
-                       Nc[3] = sr & 0x7f;  sr >>= 7;
-                       sr |= (uword)*c++ << 1;         
-                       bc[3] = sr & 0x3;  sr >>= 2;
-                       Mc[3] = sr & 0x3;  sr >>= 2;
-                       sr |= (uword)*c++ << 5;
-                       xmaxc[3] = sr & 0x3f;  sr >>= 6;
-                       xmc[39] = sr & 0x7;  sr >>= 3;
-                       xmc[40] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[41] = sr & 0x7;  sr >>= 3;
-                       xmc[42] = sr & 0x7;  sr >>= 3;
-                       xmc[43] = sr & 0x7;  sr >>= 3;
-                       sr = *c++                             /* 30 */
-                       xmc[44] = sr & 0x7;  sr >>= 3;
-                       xmc[45] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 2;
-                       xmc[46] = sr & 0x7;  sr >>= 3;
-                       xmc[47] = sr & 0x7;  sr >>= 3;
-                       xmc[48] = sr & 0x7;  sr >>= 3;
-                       sr |= (uword)*c++ << 1;
-                       xmc[49] = sr & 0x7;  sr >>= 3;
-                       xmc[50] = sr & 0x7;  sr >>= 3;
-                       xmc[51] = sr & 0x7;  sr >>= 3;
+                       sr = s->frame_chain ;
+                       sr |= (uint16_t) *c++ << 4 ;                    /* 1 */
+                       LARc [0] = sr & 0x3f ; sr >>= 6 ;
+                       LARc [1] = sr & 0x3f ; sr >>= 6 ;
+                       sr = *c++ ;
+                       LARc [2] = sr & 0x1f ; sr >>= 5 ;
+                       sr |= (uint16_t) *c++ << 3 ;
+                       LARc [3] = sr & 0x1f ; sr >>= 5 ;
+                       LARc [4] = sr & 0xf ; sr >>= 4 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       LARc [5] = sr & 0xf ; sr >>= 4 ;
+                       LARc [6] = sr & 0x7 ; sr >>= 3 ;
+                       LARc [7] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;                             /* 5 */
+                       Nc [0] = sr & 0x7f ; sr >>= 7 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       bc [0] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [0] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 5 ;
+                       xmaxc [0] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [0] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [1] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [2] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [3] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [4] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [5] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [6] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;                    /* 10 */
+                       xmc [7] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [8] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [9] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [10] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [11] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [12] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       Nc [1] = sr & 0x7f ; sr >>= 7 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       bc [1] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [1] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 5 ;
+                       xmaxc [1] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [13] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [14] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;                    /* 15 */
+                       xmc [15] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [16] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [17] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [18] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [19] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [20] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [21] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [22] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [23] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [24] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [25] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       Nc [2] = sr & 0x7f ; sr >>= 7 ;
+                       sr |= (uint16_t) *c++ << 1 ;                    /* 20 */
+                       bc [2] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [2] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 5 ;
+                       xmaxc [2] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [26] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [27] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [28] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [29] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [30] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       xmc [31] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [32] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [33] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [34] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [35] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;                    /* 25 */
+                       xmc [36] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [37] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [38] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;
+                       Nc [3] = sr & 0x7f ; sr >>= 7 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       bc [3] = sr & 0x3 ; sr >>= 2 ;
+                       Mc [3] = sr & 0x3 ; sr >>= 2 ;
+                       sr |= (uint16_t) *c++ << 5 ;
+                       xmaxc [3] = sr & 0x3f ; sr >>= 6 ;
+                       xmc [39] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [40] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [41] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [42] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [43] = sr & 0x7 ; sr >>= 3 ;
+                       sr = *c++ ;                             /* 30 */
+                       xmc [44] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [45] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 2 ;
+                       xmc [46] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [47] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [48] = sr & 0x7 ; sr >>= 3 ;
+                       sr |= (uint16_t) *c++ << 1 ;
+                       xmc [49] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [50] = sr & 0x7 ; sr >>= 3 ;
+                       xmc [51] = sr & 0x7 ; sr >>= 3 ;
                }
        }
        else
 #endif
        {
-               /* GSM_MAGIC  = (*c >> 4) & 0xF; */
+               /* GSM_MAGIC = (*c >> 4) & 0xF ; */
 
-               if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+               if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1 ;
 
-               LARc[0]  = (*c++ & 0xF) << 2;           /* 1 */
-               LARc[0] |= (*c >> 6) & 0x3;
-               LARc[1]  = *c++ & 0x3F;
-               LARc[2]  = (*c >> 3) & 0x1F;
-               LARc[3]  = (*c++ & 0x7) << 2;
-               LARc[3] |= (*c >> 6) & 0x3;
-               LARc[4]  = (*c >> 2) & 0xF;
-               LARc[5]  = (*c++ & 0x3) << 2;
-               LARc[5] |= (*c >> 6) & 0x3;
-               LARc[6]  = (*c >> 3) & 0x7;
-               LARc[7]  = *c++ & 0x7;
-               Nc[0]  = (*c >> 1) & 0x7F;
-               bc[0]  = (*c++ & 0x1) << 1;
-               bc[0] |= (*c >> 7) & 0x1;
-               Mc[0]  = (*c >> 5) & 0x3;
-               xmaxc[0]  = (*c++ & 0x1F) << 1;
-               xmaxc[0] |= (*c >> 7) & 0x1;
-               xmc[0]  = (*c >> 4) & 0x7;
-               xmc[1]  = (*c >> 1) & 0x7;
-               xmc[2]  = (*c++ & 0x1) << 2;
-               xmc[2] |= (*c >> 6) & 0x3;
-               xmc[3]  = (*c >> 3) & 0x7;
-               xmc[4]  = *c++ & 0x7;
-               xmc[5]  = (*c >> 5) & 0x7;
-               xmc[6]  = (*c >> 2) & 0x7;
-               xmc[7]  = (*c++ & 0x3) << 1;            /* 10 */
-               xmc[7] |= (*c >> 7) & 0x1;
-               xmc[8]  = (*c >> 4) & 0x7;
-               xmc[9]  = (*c >> 1) & 0x7;
-               xmc[10]  = (*c++ & 0x1) << 2;
-               xmc[10] |= (*c >> 6) & 0x3;
-               xmc[11]  = (*c >> 3) & 0x7;
-               xmc[12]  = *c++ & 0x7;
-               Nc[1]  = (*c >> 1) & 0x7F;
-               bc[1]  = (*c++ & 0x1) << 1;
-               bc[1] |= (*c >> 7) & 0x1;
-               Mc[1]  = (*c >> 5) & 0x3;
-               xmaxc[1]  = (*c++ & 0x1F) << 1;
-               xmaxc[1] |= (*c >> 7) & 0x1;
-               xmc[13]  = (*c >> 4) & 0x7;
-               xmc[14]  = (*c >> 1) & 0x7;
-               xmc[15]  = (*c++ & 0x1) << 2;
-               xmc[15] |= (*c >> 6) & 0x3;
-               xmc[16]  = (*c >> 3) & 0x7;
-               xmc[17]  = *c++ & 0x7;
-               xmc[18]  = (*c >> 5) & 0x7;
-               xmc[19]  = (*c >> 2) & 0x7;
-               xmc[20]  = (*c++ & 0x3) << 1;
-               xmc[20] |= (*c >> 7) & 0x1;
-               xmc[21]  = (*c >> 4) & 0x7;
-               xmc[22]  = (*c >> 1) & 0x7;
-               xmc[23]  = (*c++ & 0x1) << 2;
-               xmc[23] |= (*c >> 6) & 0x3;
-               xmc[24]  = (*c >> 3) & 0x7;
-               xmc[25]  = *c++ & 0x7;
-               Nc[2]  = (*c >> 1) & 0x7F;
-               bc[2]  = (*c++ & 0x1) << 1;             /* 20 */
-               bc[2] |= (*c >> 7) & 0x1;
-               Mc[2]  = (*c >> 5) & 0x3;
-               xmaxc[2]  = (*c++ & 0x1F) << 1;
-               xmaxc[2] |= (*c >> 7) & 0x1;
-               xmc[26]  = (*c >> 4) & 0x7;
-               xmc[27]  = (*c >> 1) & 0x7;
-               xmc[28]  = (*c++ & 0x1) << 2;
-               xmc[28] |= (*c >> 6) & 0x3;
-               xmc[29]  = (*c >> 3) & 0x7;
-               xmc[30]  = *c++ & 0x7;
-               xmc[31]  = (*c >> 5) & 0x7;
-               xmc[32]  = (*c >> 2) & 0x7;
-               xmc[33]  = (*c++ & 0x3) << 1;
-               xmc[33] |= (*c >> 7) & 0x1;
-               xmc[34]  = (*c >> 4) & 0x7;
-               xmc[35]  = (*c >> 1) & 0x7;
-               xmc[36]  = (*c++ & 0x1) << 2;
-               xmc[36] |= (*c >> 6) & 0x3;
-               xmc[37]  = (*c >> 3) & 0x7;
-               xmc[38]  = *c++ & 0x7;
-               Nc[3]  = (*c >> 1) & 0x7F;
-               bc[3]  = (*c++ & 0x1) << 1;
-               bc[3] |= (*c >> 7) & 0x1;
-               Mc[3]  = (*c >> 5) & 0x3;
-               xmaxc[3]  = (*c++ & 0x1F) << 1;
-               xmaxc[3] |= (*c >> 7) & 0x1;
-               xmc[39]  = (*c >> 4) & 0x7;
-               xmc[40]  = (*c >> 1) & 0x7;
-               xmc[41]  = (*c++ & 0x1) << 2;
-               xmc[41] |= (*c >> 6) & 0x3;
-               xmc[42]  = (*c >> 3) & 0x7;
-               xmc[43]  = *c++ & 0x7;                  /* 30  */
-               xmc[44]  = (*c >> 5) & 0x7;
-               xmc[45]  = (*c >> 2) & 0x7;
-               xmc[46]  = (*c++ & 0x3) << 1;
-               xmc[46] |= (*c >> 7) & 0x1;
-               xmc[47]  = (*c >> 4) & 0x7;
-               xmc[48]  = (*c >> 1) & 0x7;
-               xmc[49]  = (*c++ & 0x1) << 2;
-               xmc[49] |= (*c >> 6) & 0x3;
-               xmc[50]  = (*c >> 3) & 0x7;
-               xmc[51]  = *c & 0x7;                    /* 33 */
+               LARc [0] = (*c++ & 0xF) << 2 ;          /* 1 */
+               LARc [0] |= (*c >> 6) & 0x3 ;
+               LARc [1] = *c++ & 0x3F ;
+               LARc [2] = (*c >> 3) & 0x1F ;
+               LARc [3] = (*c++ & 0x7) << 2 ;
+               LARc [3] |= (*c >> 6) & 0x3 ;
+               LARc [4] = (*c >> 2) & 0xF ;
+               LARc [5] = (*c++ & 0x3) << 2 ;
+               LARc [5] |= (*c >> 6) & 0x3 ;
+               LARc [6] = (*c >> 3) & 0x7 ;
+               LARc [7] = *c++ & 0x7 ;
+               Nc [0] = (*c >> 1) & 0x7F ;
+               bc [0] = (*c++ & 0x1) << 1 ;
+               bc [0] |= (*c >> 7) & 0x1 ;
+               Mc [0] = (*c >> 5) & 0x3 ;
+               xmaxc [0] = (*c++ & 0x1F) << 1 ;
+               xmaxc [0] |= (*c >> 7) & 0x1 ;
+               xmc [0] = (*c >> 4) & 0x7 ;
+               xmc [1] = (*c >> 1) & 0x7 ;
+               xmc [2] = (*c++ & 0x1) << 2 ;
+               xmc [2] |= (*c >> 6) & 0x3 ;
+               xmc [3] = (*c >> 3) & 0x7 ;
+               xmc [4] = *c++ & 0x7 ;
+               xmc [5] = (*c >> 5) & 0x7 ;
+               xmc [6] = (*c >> 2) & 0x7 ;
+               xmc [7] = (*c++ & 0x3) << 1 ;           /* 10 */
+               xmc [7] |= (*c >> 7) & 0x1 ;
+               xmc [8] = (*c >> 4) & 0x7 ;
+               xmc [9] = (*c >> 1) & 0x7 ;
+               xmc [10] = (*c++ & 0x1) << 2 ;
+               xmc [10] |= (*c >> 6) & 0x3 ;
+               xmc [11] = (*c >> 3) & 0x7 ;
+               xmc [12] = *c++ & 0x7 ;
+               Nc [1] = (*c >> 1) & 0x7F ;
+               bc [1] = (*c++ & 0x1) << 1 ;
+               bc [1] |= (*c >> 7) & 0x1 ;
+               Mc [1] = (*c >> 5) & 0x3 ;
+               xmaxc [1] = (*c++ & 0x1F) << 1 ;
+               xmaxc [1] |= (*c >> 7) & 0x1 ;
+               xmc [13] = (*c >> 4) & 0x7 ;
+               xmc [14] = (*c >> 1) & 0x7 ;
+               xmc [15] = (*c++ & 0x1) << 2 ;
+               xmc [15] |= (*c >> 6) & 0x3 ;
+               xmc [16] = (*c >> 3) & 0x7 ;
+               xmc [17] = *c++ & 0x7 ;
+               xmc [18] = (*c >> 5) & 0x7 ;
+               xmc [19] = (*c >> 2) & 0x7 ;
+               xmc [20] = (*c++ & 0x3) << 1 ;
+               xmc [20] |= (*c >> 7) & 0x1 ;
+               xmc [21] = (*c >> 4) & 0x7 ;
+               xmc [22] = (*c >> 1) & 0x7 ;
+               xmc [23] = (*c++ & 0x1) << 2 ;
+               xmc [23] |= (*c >> 6) & 0x3 ;
+               xmc [24] = (*c >> 3) & 0x7 ;
+               xmc [25] = *c++ & 0x7 ;
+               Nc [2] = (*c >> 1) & 0x7F ;
+               bc [2] = (*c++ & 0x1) << 1 ;            /* 20 */
+               bc [2] |= (*c >> 7) & 0x1 ;
+               Mc [2] = (*c >> 5) & 0x3 ;
+               xmaxc [2] = (*c++ & 0x1F) << 1 ;
+               xmaxc [2] |= (*c >> 7) & 0x1 ;
+               xmc [26] = (*c >> 4) & 0x7 ;
+               xmc [27] = (*c >> 1) & 0x7 ;
+               xmc [28] = (*c++ & 0x1) << 2 ;
+               xmc [28] |= (*c >> 6) & 0x3 ;
+               xmc [29] = (*c >> 3) & 0x7 ;
+               xmc [30] = *c++ & 0x7 ;
+               xmc [31] = (*c >> 5) & 0x7 ;
+               xmc [32] = (*c >> 2) & 0x7 ;
+               xmc [33] = (*c++ & 0x3) << 1 ;
+               xmc [33] |= (*c >> 7) & 0x1 ;
+               xmc [34] = (*c >> 4) & 0x7 ;
+               xmc [35] = (*c >> 1) & 0x7 ;
+               xmc [36] = (*c++ & 0x1) << 2 ;
+               xmc [36] |= (*c >> 6) & 0x3 ;
+               xmc [37] = (*c >> 3) & 0x7 ;
+               xmc [38] = *c++ & 0x7 ;
+               Nc [3] = (*c >> 1) & 0x7F ;
+               bc [3] = (*c++ & 0x1) << 1 ;
+               bc [3] |= (*c >> 7) & 0x1 ;
+               Mc [3] = (*c >> 5) & 0x3 ;
+               xmaxc [3] = (*c++ & 0x1F) << 1 ;
+               xmaxc [3] |= (*c >> 7) & 0x1 ;
+               xmc [39] = (*c >> 4) & 0x7 ;
+               xmc [40] = (*c >> 1) & 0x7 ;
+               xmc [41] = (*c++ & 0x1) << 2 ;
+               xmc [41] |= (*c >> 6) & 0x3 ;
+               xmc [42] = (*c >> 3) & 0x7 ;
+               xmc [43] = *c++ & 0x7 ;                 /* 30  */
+               xmc [44] = (*c >> 5) & 0x7 ;
+               xmc [45] = (*c >> 2) & 0x7 ;
+               xmc [46] = (*c++ & 0x3) << 1 ;
+               xmc [46] |= (*c >> 7) & 0x1 ;
+               xmc [47] = (*c >> 4) & 0x7 ;
+               xmc [48] = (*c >> 1) & 0x7 ;
+               xmc [49] = (*c++ & 0x1) << 2 ;
+               xmc [49] |= (*c >> 6) & 0x3 ;
+               xmc [50] = (*c >> 3) & 0x7 ;
+               xmc [51] = *c & 0x7 ;                   /* 33 */
        }
 
-       Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+       Gsm_Decoder (s, LARc, Nc, bc, Mc, xmaxc, xmc, target) ;
 
-       return 0;
+       return 0 ;
 }
 
index 9b41711..03bf7c3 100644 (file)
 #      ifdef   HAS_MALLOC_H
 #              include         <malloc.h>
 #      else
-               extern void free();
+               extern void free () ;
 #      endif
 #endif
 
 void gsm_destroy (gsm S)
 {
-       if (S) free((char *)S);
+       if (S)
+               free ((char *) S) ;
 }
 
index 5c9e1ab..5fd5351 100644 (file)
 
 void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
 {
-       word            LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+       int16_t         LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ;
 
-       Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+       Gsm_Coder (s, source, LARc, Nc, bc, Mc, xmaxc, xmc) ;
 
 
        /*      variable        size
 
                GSM_MAGIC       4
 
-               LARc[0]         6
-               LARc[1]         6
-               LARc[2]         5
-               LARc[3]         5
-               LARc[4]         4
-               LARc[5]         4
-               LARc[6]         3
-               LARc[7]         3
+               LARc [0]                6
+               LARc [1]                6
+               LARc [2]                5
+               LARc [3]                5
+               LARc [4]                4
+               LARc [5]                4
+               LARc [6]                3
+               LARc [7]                3
 
-               Nc[0]           7
-               bc[0]           2
-               Mc[0]           2
-               xmaxc[0]        6
-               xmc[0]          3
-               xmc[1]          3
-               xmc[2]          3
-               xmc[3]          3
-               xmc[4]          3
-               xmc[5]          3
-               xmc[6]          3
-               xmc[7]          3
-               xmc[8]          3
-               xmc[9]          3
-               xmc[10]         3
-               xmc[11]         3
-               xmc[12]         3
+               Nc [0]          7
+               bc [0]          2
+               Mc [0]          2
+               xmaxc [0]       6
+               xmc [0]         3
+               xmc [1]         3
+               xmc [2]         3
+               xmc [3]         3
+               xmc [4]         3
+               xmc [5]         3
+               xmc [6]         3
+               xmc [7]         3
+               xmc [8]         3
+               xmc [9]         3
+               xmc [10]                3
+               xmc [11]                3
+               xmc [12]                3
 
-               Nc[1]           7
-               bc[1]           2
-               Mc[1]           2
-               xmaxc[1]        6
-               xmc[13]         3
-               xmc[14]         3
-               xmc[15]         3
-               xmc[16]         3
-               xmc[17]         3
-               xmc[18]         3
-               xmc[19]         3
-               xmc[20]         3
-               xmc[21]         3
-               xmc[22]         3
-               xmc[23]         3
-               xmc[24]         3
-               xmc[25]         3
+               Nc [1]          7
+               bc [1]          2
+               Mc [1]          2
+               xmaxc [1]       6
+               xmc [13]                3
+               xmc [14]                3
+               xmc [15]                3
+               xmc [16]                3
+               xmc [17]                3
+               xmc [18]                3
+               xmc [19]                3
+               xmc [20]                3
+               xmc [21]                3
+               xmc [22]                3
+               xmc [23]                3
+               xmc [24]                3
+               xmc [25]                3
 
-               Nc[2]           7
-               bc[2]           2
-               Mc[2]           2
-               xmaxc[2]        6
-               xmc[26]         3
-               xmc[27]         3
-               xmc[28]         3
-               xmc[29]         3
-               xmc[30]         3
-               xmc[31]         3
-               xmc[32]         3
-               xmc[33]         3
-               xmc[34]         3
-               xmc[35]         3
-               xmc[36]         3
-               xmc[37]         3
-               xmc[38]         3
+               Nc [2]          7
+               bc [2]          2
+               Mc [2]          2
+               xmaxc [2]       6
+               xmc [26]                3
+               xmc [27]                3
+               xmc [28]                3
+               xmc [29]                3
+               xmc [30]                3
+               xmc [31]                3
+               xmc [32]                3
+               xmc [33]                3
+               xmc [34]                3
+               xmc [35]                3
+               xmc [36]                3
+               xmc [37]                3
+               xmc [38]                3
 
-               Nc[3]           7
-               bc[3]           2
-               Mc[3]           2
-               xmaxc[3]        6
-               xmc[39]         3
-               xmc[40]         3
-               xmc[41]         3
-               xmc[42]         3
-               xmc[43]         3
-               xmc[44]         3
-               xmc[45]         3
-               xmc[46]         3
-               xmc[47]         3
-               xmc[48]         3
-               xmc[49]         3
-               xmc[50]         3
-               xmc[51]         3
+               Nc [3]          7
+               bc [3]          2
+               Mc [3]          2
+               xmaxc [3]       6
+               xmc [39]                3
+               xmc [40]                3
+               xmc [41]                3
+               xmc [42]                3
+               xmc [43]                3
+               xmc [44]                3
+               xmc [45]                3
+               xmc [46]                3
+               xmc [47]                3
+               xmc [48]                3
+               xmc [49]                3
+               xmc [50]                3
+               xmc [51]                3
        */
 
 #ifdef WAV49
 
-       if (s->wav_fmt) {
-               s->frame_index = !s->frame_index;
-               if (s->frame_index) {
+       if (s->wav_fmt)
+       {       s->frame_index = !s->frame_index ;
+               if (s->frame_index)
+               {       uint16_t sr ;
 
-                       uword sr;
-
-                       sr = 0;
-                       sr = sr >> 6 | LARc[0] << 10;
-                       sr = sr >> 6 | LARc[1] << 10;
-                       *c++ = sr >> 4;
-                       sr = sr >> 5 | LARc[2] << 11;
-                       *c++ = sr >> 7;
-                       sr = sr >> 5 | LARc[3] << 11;
-                       sr = sr >> 4 | LARc[4] << 12;
-                       *c++ = sr >> 6;
-                       sr = sr >> 4 | LARc[5] << 12;
-                       sr = sr >> 3 | LARc[6] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | LARc[7] << 13;
-                       sr = sr >> 7 | Nc[0] << 9;
-                       *c++ = sr >> 5;
-                       sr = sr >> 2 | bc[0] << 14;
-                       sr = sr >> 2 | Mc[0] << 14;
-                       sr = sr >> 6 | xmaxc[0] << 10;
-                       *c++ = sr >> 3;
-                       sr = sr >> 3 | xmc[0] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[1] << 13;
-                       sr = sr >> 3 | xmc[2] << 13;
-                       sr = sr >> 3 | xmc[3] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[4] << 13;
-                       sr = sr >> 3 | xmc[5] << 13;
-                       sr = sr >> 3 | xmc[6] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[7] << 13;
-                       sr = sr >> 3 | xmc[8] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[9] << 13;
-                       sr = sr >> 3 | xmc[10] << 13;
-                       sr = sr >> 3 | xmc[11] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[12] << 13;
-                       sr = sr >> 7 | Nc[1] << 9;
-                       *c++ = sr >> 5;
-                       sr = sr >> 2 | bc[1] << 14;
-                       sr = sr >> 2 | Mc[1] << 14;
-                       sr = sr >> 6 | xmaxc[1] << 10;
-                       *c++ = sr >> 3;
-                       sr = sr >> 3 | xmc[13] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[14] << 13;
-                       sr = sr >> 3 | xmc[15] << 13;
-                       sr = sr >> 3 | xmc[16] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[17] << 13;
-                       sr = sr >> 3 | xmc[18] << 13;
-                       sr = sr >> 3 | xmc[19] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[20] << 13;
-                       sr = sr >> 3 | xmc[21] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[22] << 13;
-                       sr = sr >> 3 | xmc[23] << 13;
-                       sr = sr >> 3 | xmc[24] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[25] << 13;
-                       sr = sr >> 7 | Nc[2] << 9;
-                       *c++ = sr >> 5;
-                       sr = sr >> 2 | bc[2] << 14;
-                       sr = sr >> 2 | Mc[2] << 14;
-                       sr = sr >> 6 | xmaxc[2] << 10;
-                       *c++ = sr >> 3;
-                       sr = sr >> 3 | xmc[26] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[27] << 13;
-                       sr = sr >> 3 | xmc[28] << 13;
-                       sr = sr >> 3 | xmc[29] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[30] << 13;
-                       sr = sr >> 3 | xmc[31] << 13;
-                       sr = sr >> 3 | xmc[32] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[33] << 13;
-                       sr = sr >> 3 | xmc[34] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[35] << 13;
-                       sr = sr >> 3 | xmc[36] << 13;
-                       sr = sr >> 3 | xmc[37] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[38] << 13;
-                       sr = sr >> 7 | Nc[3] << 9;
-                       *c++ = sr >> 5;
-                       sr = sr >> 2 | bc[3] << 14;
-                       sr = sr >> 2 | Mc[3] << 14;
-                       sr = sr >> 6 | xmaxc[3] << 10;
-                       *c++ = sr >> 3;
-                       sr = sr >> 3 | xmc[39] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[40] << 13;
-                       sr = sr >> 3 | xmc[41] << 13;
-                       sr = sr >> 3 | xmc[42] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[43] << 13;
-                       sr = sr >> 3 | xmc[44] << 13;
-                       sr = sr >> 3 | xmc[45] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[46] << 13;
-                       sr = sr >> 3 | xmc[47] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[48] << 13;
-                       sr = sr >> 3 | xmc[49] << 13;
-                       sr = sr >> 3 | xmc[50] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[51] << 13;
-                       sr = sr >> 4;
-                       *c = sr >> 8;
-                       s->frame_chain = *c;
+                       sr = 0 ;
+                       sr = sr >> 6 | LARc [0] << 10 ;
+                       sr = sr >> 6 | LARc [1] << 10 ;
+                       *c++ = sr >> 4 ;
+                       sr = sr >> 5 | LARc [2] << 11 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 5 | LARc [3] << 11 ;
+                       sr = sr >> 4 | LARc [4] << 12 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 4 | LARc [5] << 12 ;
+                       sr = sr >> 3 | LARc [6] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | LARc [7] << 13 ;
+                       sr = sr >> 7 | Nc [0] << 9 ;
+                       *c++ = sr >> 5 ;
+                       sr = sr >> 2 | bc [0] << 14 ;
+                       sr = sr >> 2 | Mc [0] << 14 ;
+                       sr = sr >> 6 | xmaxc [0] << 10 ;
+                       *c++ = sr >> 3 ;
+                       sr = sr >> 3 | xmc [0] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [1] << 13 ;
+                       sr = sr >> 3 | xmc [2] << 13 ;
+                       sr = sr >> 3 | xmc [3] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [4] << 13 ;
+                       sr = sr >> 3 | xmc [5] << 13 ;
+                       sr = sr >> 3 | xmc [6] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [7] << 13 ;
+                       sr = sr >> 3 | xmc [8] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [9] << 13 ;
+                       sr = sr >> 3 | xmc [10] << 13 ;
+                       sr = sr >> 3 | xmc [11] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [12] << 13 ;
+                       sr = sr >> 7 | Nc [1] << 9 ;
+                       *c++ = sr >> 5 ;
+                       sr = sr >> 2 | bc [1] << 14 ;
+                       sr = sr >> 2 | Mc [1] << 14 ;
+                       sr = sr >> 6 | xmaxc [1] << 10 ;
+                       *c++ = sr >> 3 ;
+                       sr = sr >> 3 | xmc [13] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [14] << 13 ;
+                       sr = sr >> 3 | xmc [15] << 13 ;
+                       sr = sr >> 3 | xmc [16] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [17] << 13 ;
+                       sr = sr >> 3 | xmc [18] << 13 ;
+                       sr = sr >> 3 | xmc [19] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [20] << 13 ;
+                       sr = sr >> 3 | xmc [21] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [22] << 13 ;
+                       sr = sr >> 3 | xmc [23] << 13 ;
+                       sr = sr >> 3 | xmc [24] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [25] << 13 ;
+                       sr = sr >> 7 | Nc [2] << 9 ;
+                       *c++ = sr >> 5 ;
+                       sr = sr >> 2 | bc [2] << 14 ;
+                       sr = sr >> 2 | Mc [2] << 14 ;
+                       sr = sr >> 6 | xmaxc [2] << 10 ;
+                       *c++ = sr >> 3 ;
+                       sr = sr >> 3 | xmc [26] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [27] << 13 ;
+                       sr = sr >> 3 | xmc [28] << 13 ;
+                       sr = sr >> 3 | xmc [29] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [30] << 13 ;
+                       sr = sr >> 3 | xmc [31] << 13 ;
+                       sr = sr >> 3 | xmc [32] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [33] << 13 ;
+                       sr = sr >> 3 | xmc [34] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [35] << 13 ;
+                       sr = sr >> 3 | xmc [36] << 13 ;
+                       sr = sr >> 3 | xmc [37] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [38] << 13 ;
+                       sr = sr >> 7 | Nc [3] << 9 ;
+                       *c++ = sr >> 5 ;
+                       sr = sr >> 2 | bc [3] << 14 ;
+                       sr = sr >> 2 | Mc [3] << 14 ;
+                       sr = sr >> 6 | xmaxc [3] << 10 ;
+                       *c++ = sr >> 3 ;
+                       sr = sr >> 3 | xmc [39] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [40] << 13 ;
+                       sr = sr >> 3 | xmc [41] << 13 ;
+                       sr = sr >> 3 | xmc [42] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [43] << 13 ;
+                       sr = sr >> 3 | xmc [44] << 13 ;
+                       sr = sr >> 3 | xmc [45] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [46] << 13 ;
+                       sr = sr >> 3 | xmc [47] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [48] << 13 ;
+                       sr = sr >> 3 | xmc [49] << 13 ;
+                       sr = sr >> 3 | xmc [50] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [51] << 13 ;
+                       sr = sr >> 4 ;
+                       *c = sr >> 8 ;
+                       s->frame_chain = *c ;
                }
                else {
-                       uword sr;
+                       uint16_t sr ;
 
-                       sr = 0;
-                       sr = sr >> 4 | s->frame_chain << 12;
-                       sr = sr >> 6 | LARc[0] << 10;
-                       *c++ = sr >> 6;
-                       sr = sr >> 6 | LARc[1] << 10;
-                       *c++ = sr >> 8;
-                       sr = sr >> 5 | LARc[2] << 11;
-                       sr = sr >> 5 | LARc[3] << 11;
-                       *c++ = sr >> 6;
-                       sr = sr >> 4 | LARc[4] << 12;
-                       sr = sr >> 4 | LARc[5] << 12;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | LARc[6] << 13;
-                       sr = sr >> 3 | LARc[7] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 7 | Nc[0] << 9;
-                       sr = sr >> 2 | bc[0] << 14;
-                       *c++ = sr >> 7;
-                       sr = sr >> 2 | Mc[0] << 14;
-                       sr = sr >> 6 | xmaxc[0] << 10;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[0] << 13;
-                       sr = sr >> 3 | xmc[1] << 13;
-                       sr = sr >> 3 | xmc[2] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[3] << 13;
-                       sr = sr >> 3 | xmc[4] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[5] << 13;
-                       sr = sr >> 3 | xmc[6] << 13;
-                       sr = sr >> 3 | xmc[7] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[8] << 13;
-                       sr = sr >> 3 | xmc[9] << 13;
-                       sr = sr >> 3 | xmc[10] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[11] << 13;
-                       sr = sr >> 3 | xmc[12] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 7 | Nc[1] << 9;
-                       sr = sr >> 2 | bc[1] << 14;
-                       *c++ = sr >> 7;
-                       sr = sr >> 2 | Mc[1] << 14;
-                       sr = sr >> 6 | xmaxc[1] << 10;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[13] << 13;
-                       sr = sr >> 3 | xmc[14] << 13;
-                       sr = sr >> 3 | xmc[15] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[16] << 13;
-                       sr = sr >> 3 | xmc[17] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[18] << 13;
-                       sr = sr >> 3 | xmc[19] << 13;
-                       sr = sr >> 3 | xmc[20] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[21] << 13;
-                       sr = sr >> 3 | xmc[22] << 13;
-                       sr = sr >> 3 | xmc[23] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[24] << 13;
-                       sr = sr >> 3 | xmc[25] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 7 | Nc[2] << 9;
-                       sr = sr >> 2 | bc[2] << 14;
-                       *c++ = sr >> 7;
-                       sr = sr >> 2 | Mc[2] << 14;
-                       sr = sr >> 6 | xmaxc[2] << 10;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[26] << 13;
-                       sr = sr >> 3 | xmc[27] << 13;
-                       sr = sr >> 3 | xmc[28] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[29] << 13;
-                       sr = sr >> 3 | xmc[30] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[31] << 13;
-                       sr = sr >> 3 | xmc[32] << 13;
-                       sr = sr >> 3 | xmc[33] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[34] << 13;
-                       sr = sr >> 3 | xmc[35] << 13;
-                       sr = sr >> 3 | xmc[36] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[37] << 13;
-                       sr = sr >> 3 | xmc[38] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 7 | Nc[3] << 9;
-                       sr = sr >> 2 | bc[3] << 14;
-                       *c++ = sr >> 7;
-                       sr = sr >> 2 | Mc[3] << 14;
-                       sr = sr >> 6 | xmaxc[3] << 10;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[39] << 13;
-                       sr = sr >> 3 | xmc[40] << 13;
-                       sr = sr >> 3 | xmc[41] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[42] << 13;
-                       sr = sr >> 3 | xmc[43] << 13;
-                       *c++ = sr >> 8;
-                       sr = sr >> 3 | xmc[44] << 13;
-                       sr = sr >> 3 | xmc[45] << 13;
-                       sr = sr >> 3 | xmc[46] << 13;
-                       *c++ = sr >> 7;
-                       sr = sr >> 3 | xmc[47] << 13;
-                       sr = sr >> 3 | xmc[48] << 13;
-                       sr = sr >> 3 | xmc[49] << 13;
-                       *c++ = sr >> 6;
-                       sr = sr >> 3 | xmc[50] << 13;
-                       sr = sr >> 3 | xmc[51] << 13;
-                       *c++ = sr >> 8;
+                       sr = 0 ;
+                       sr = sr >> 4 | s->frame_chain << 12 ;
+                       sr = sr >> 6 | LARc [0] << 10 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 6 | LARc [1] << 10 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 5 | LARc [2] << 11 ;
+                       sr = sr >> 5 | LARc [3] << 11 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 4 | LARc [4] << 12 ;
+                       sr = sr >> 4 | LARc [5] << 12 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | LARc [6] << 13 ;
+                       sr = sr >> 3 | LARc [7] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 7 | Nc [0] << 9 ;
+                       sr = sr >> 2 | bc [0] << 14 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 2 | Mc [0] << 14 ;
+                       sr = sr >> 6 | xmaxc [0] << 10 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [0] << 13 ;
+                       sr = sr >> 3 | xmc [1] << 13 ;
+                       sr = sr >> 3 | xmc [2] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [3] << 13 ;
+                       sr = sr >> 3 | xmc [4] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [5] << 13 ;
+                       sr = sr >> 3 | xmc [6] << 13 ;
+                       sr = sr >> 3 | xmc [7] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [8] << 13 ;
+                       sr = sr >> 3 | xmc [9] << 13 ;
+                       sr = sr >> 3 | xmc [10] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [11] << 13 ;
+                       sr = sr >> 3 | xmc [12] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 7 | Nc [1] << 9 ;
+                       sr = sr >> 2 | bc [1] << 14 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 2 | Mc [1] << 14 ;
+                       sr = sr >> 6 | xmaxc [1] << 10 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [13] << 13 ;
+                       sr = sr >> 3 | xmc [14] << 13 ;
+                       sr = sr >> 3 | xmc [15] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [16] << 13 ;
+                       sr = sr >> 3 | xmc [17] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [18] << 13 ;
+                       sr = sr >> 3 | xmc [19] << 13 ;
+                       sr = sr >> 3 | xmc [20] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [21] << 13 ;
+                       sr = sr >> 3 | xmc [22] << 13 ;
+                       sr = sr >> 3 | xmc [23] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [24] << 13 ;
+                       sr = sr >> 3 | xmc [25] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 7 | Nc [2] << 9 ;
+                       sr = sr >> 2 | bc [2] << 14 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 2 | Mc [2] << 14 ;
+                       sr = sr >> 6 | xmaxc [2] << 10 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [26] << 13 ;
+                       sr = sr >> 3 | xmc [27] << 13 ;
+                       sr = sr >> 3 | xmc [28] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [29] << 13 ;
+                       sr = sr >> 3 | xmc [30] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [31] << 13 ;
+                       sr = sr >> 3 | xmc [32] << 13 ;
+                       sr = sr >> 3 | xmc [33] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [34] << 13 ;
+                       sr = sr >> 3 | xmc [35] << 13 ;
+                       sr = sr >> 3 | xmc [36] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [37] << 13 ;
+                       sr = sr >> 3 | xmc [38] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 7 | Nc [3] << 9 ;
+                       sr = sr >> 2 | bc [3] << 14 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 2 | Mc [3] << 14 ;
+                       sr = sr >> 6 | xmaxc [3] << 10 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [39] << 13 ;
+                       sr = sr >> 3 | xmc [40] << 13 ;
+                       sr = sr >> 3 | xmc [41] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [42] << 13 ;
+                       sr = sr >> 3 | xmc [43] << 13 ;
+                       *c++ = sr >> 8 ;
+                       sr = sr >> 3 | xmc [44] << 13 ;
+                       sr = sr >> 3 | xmc [45] << 13 ;
+                       sr = sr >> 3 | xmc [46] << 13 ;
+                       *c++ = sr >> 7 ;
+                       sr = sr >> 3 | xmc [47] << 13 ;
+                       sr = sr >> 3 | xmc [48] << 13 ;
+                       sr = sr >> 3 | xmc [49] << 13 ;
+                       *c++ = sr >> 6 ;
+                       sr = sr >> 3 | xmc [50] << 13 ;
+                       sr = sr >> 3 | xmc [51] << 13 ;
+                       *c++ = sr >> 8 ;
                }
        }
 
@@ -343,106 +342,106 @@ void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
 #endif /* WAV49 */
        {
 
-               *c++ =   ((GSM_MAGIC & 0xF) << 4)               /* 1 */
-                      | ((LARc[0] >> 2) & 0xF);
-               *c++ =   ((LARc[0] & 0x3) << 6)
-                      | (LARc[1] & 0x3F);
-               *c++ =   ((LARc[2] & 0x1F) << 3)
-                      | ((LARc[3] >> 2) & 0x7);
-               *c++ =   ((LARc[3] & 0x3) << 6)
-                      | ((LARc[4] & 0xF) << 2)
-                      | ((LARc[5] >> 2) & 0x3);
-               *c++ =   ((LARc[5] & 0x3) << 6)
-                      | ((LARc[6] & 0x7) << 3)
-                      | (LARc[7] & 0x7);
-               *c++ =   ((Nc[0] & 0x7F) << 1)
-                      | ((bc[0] >> 1) & 0x1);
-               *c++ =   ((bc[0] & 0x1) << 7)
-                      | ((Mc[0] & 0x3) << 5)
-                      | ((xmaxc[0] >> 1) & 0x1F);
-               *c++ =   ((xmaxc[0] & 0x1) << 7)
-                      | ((xmc[0] & 0x7) << 4)
-                      | ((xmc[1] & 0x7) << 1)
-                      | ((xmc[2] >> 2) & 0x1);
-               *c++ =   ((xmc[2] & 0x3) << 6)
-                      | ((xmc[3] & 0x7) << 3)
-                      | (xmc[4] & 0x7);
-               *c++ =   ((xmc[5] & 0x7) << 5)                  /* 10 */
-                      | ((xmc[6] & 0x7) << 2)
-                      | ((xmc[7] >> 1) & 0x3);
-               *c++ =   ((xmc[7] & 0x1) << 7)
-                      | ((xmc[8] & 0x7) << 4)
-                      | ((xmc[9] & 0x7) << 1)
-                      | ((xmc[10] >> 2) & 0x1);
-               *c++ =   ((xmc[10] & 0x3) << 6)
-                      | ((xmc[11] & 0x7) << 3)
-                      | (xmc[12] & 0x7);
-               *c++ =   ((Nc[1] & 0x7F) << 1)
-                      | ((bc[1] >> 1) & 0x1);
-               *c++ =   ((bc[1] & 0x1) << 7)
-                      | ((Mc[1] & 0x3) << 5)
-                      | ((xmaxc[1] >> 1) & 0x1F);
-               *c++ =   ((xmaxc[1] & 0x1) << 7)
-                      | ((xmc[13] & 0x7) << 4)
-                      | ((xmc[14] & 0x7) << 1)
-                      | ((xmc[15] >> 2) & 0x1);
-               *c++ =   ((xmc[15] & 0x3) << 6)
-                      | ((xmc[16] & 0x7) << 3)
-                      | (xmc[17] & 0x7);
-               *c++ =   ((xmc[18] & 0x7) << 5)
-                      | ((xmc[19] & 0x7) << 2)
-                      | ((xmc[20] >> 1) & 0x3);
-               *c++ =   ((xmc[20] & 0x1) << 7)
-                      | ((xmc[21] & 0x7) << 4)
-                      | ((xmc[22] & 0x7) << 1)
-                      | ((xmc[23] >> 2) & 0x1);
-               *c++ =   ((xmc[23] & 0x3) << 6)
-                      | ((xmc[24] & 0x7) << 3)
-                      | (xmc[25] & 0x7);
-               *c++ =   ((Nc[2] & 0x7F) << 1)                  /* 20 */
-                      | ((bc[2] >> 1) & 0x1);
-               *c++ =   ((bc[2] & 0x1) << 7)
-                      | ((Mc[2] & 0x3) << 5)
-                      | ((xmaxc[2] >> 1) & 0x1F);
-               *c++ =   ((xmaxc[2] & 0x1) << 7)
-                      | ((xmc[26] & 0x7) << 4)
-                      | ((xmc[27] & 0x7) << 1)
-                      | ((xmc[28] >> 2) & 0x1);
-               *c++ =   ((xmc[28] & 0x3) << 6)
-                      | ((xmc[29] & 0x7) << 3)
-                      | (xmc[30] & 0x7);
-               *c++ =   ((xmc[31] & 0x7) << 5)
-                      | ((xmc[32] & 0x7) << 2)
-                      | ((xmc[33] >> 1) & 0x3);
-               *c++ =   ((xmc[33] & 0x1) << 7)
-                      | ((xmc[34] & 0x7) << 4)
-                      | ((xmc[35] & 0x7) << 1)
-                      | ((xmc[36] >> 2) & 0x1);
-               *c++ =   ((xmc[36] & 0x3) << 6)
-                      | ((xmc[37] & 0x7) << 3)
-                      | (xmc[38] & 0x7);
-               *c++ =   ((Nc[3] & 0x7F) << 1)
-                      | ((bc[3] >> 1) & 0x1);
-               *c++ =   ((bc[3] & 0x1) << 7)
-                      | ((Mc[3] & 0x3) << 5)
-                      | ((xmaxc[3] >> 1) & 0x1F);
-               *c++ =   ((xmaxc[3] & 0x1) << 7)
-                      | ((xmc[39] & 0x7) << 4)
-                      | ((xmc[40] & 0x7) << 1)
-                      | ((xmc[41] >> 2) & 0x1);
-               *c++ =   ((xmc[41] & 0x3) << 6)                 /* 30 */
-                      | ((xmc[42] & 0x7) << 3)
-                      | (xmc[43] & 0x7);
-               *c++ =   ((xmc[44] & 0x7) << 5)
-                      | ((xmc[45] & 0x7) << 2)
-                      | ((xmc[46] >> 1) & 0x3);
-               *c++ =   ((xmc[46] & 0x1) << 7)
-                      | ((xmc[47] & 0x7) << 4)
-                      | ((xmc[48] & 0x7) << 1)
-                      | ((xmc[49] >> 2) & 0x1);
-               *c++ =   ((xmc[49] & 0x3) << 6)
-                      | ((xmc[50] & 0x7) << 3)
-                      | (xmc[51] & 0x7);
+               *c++ = ((GSM_MAGIC & 0xF) << 4)         /* 1 */
+                               | ((LARc [0] >> 2) & 0xF) ;
+               *c++ = ((LARc [0] & 0x3) << 6)
+                               | (LARc [1] & 0x3F) ;
+               *c++ = ((LARc [2] & 0x1F) << 3)
+                               | ((LARc [3] >> 2) & 0x7) ;
+               *c++ = ((LARc [3] & 0x3) << 6)
+                               | ((LARc [4] & 0xF) << 2)
+                               | ((LARc [5] >> 2) & 0x3) ;
+               *c++ = ((LARc [5] & 0x3) << 6)
+                               | ((LARc [6] & 0x7) << 3)
+                               | (LARc [7] & 0x7) ;
+               *c++ = ((Nc [0] & 0x7F) << 1)
+                               | ((bc [0] >> 1) & 0x1) ;
+               *c++ = ((bc [0] & 0x1) << 7)
+                               | ((Mc [0] & 0x3) << 5)
+                               | ((xmaxc [0] >> 1) & 0x1F) ;
+               *c++ = ((xmaxc [0] & 0x1) << 7)
+                               | ((xmc [0] & 0x7) << 4)
+                               | ((xmc [1] & 0x7) << 1)
+                               | ((xmc [2] >> 2) & 0x1) ;
+               *c++ = ((xmc [2] & 0x3) << 6)
+                               | ((xmc [3] & 0x7) << 3)
+                               | (xmc [4] & 0x7) ;
+               *c++ = ((xmc [5] & 0x7) << 5)                   /* 10 */
+                               | ((xmc [6] & 0x7) << 2)
+                               | ((xmc [7] >> 1) & 0x3) ;
+               *c++ = ((xmc [7] & 0x1) << 7)
+                               | ((xmc [8] & 0x7) << 4)
+                               | ((xmc [9] & 0x7) << 1)
+                               | ((xmc [10] >> 2) & 0x1) ;
+               *c++ = ((xmc [10] & 0x3) << 6)
+                               | ((xmc [11] & 0x7) << 3)
+                               | (xmc [12] & 0x7) ;
+               *c++ = ((Nc [1] & 0x7F) << 1)
+                               | ((bc [1] >> 1) & 0x1) ;
+               *c++ = ((bc [1] & 0x1) << 7)
+                               | ((Mc [1] & 0x3) << 5)
+                               | ((xmaxc [1] >> 1) & 0x1F) ;
+               *c++ = ((xmaxc [1] & 0x1) << 7)
+                               | ((xmc [13] & 0x7) << 4)
+                               | ((xmc [14] & 0x7) << 1)
+                               | ((xmc [15] >> 2) & 0x1) ;
+               *c++ = ((xmc [15] & 0x3) << 6)
+                               | ((xmc [16] & 0x7) << 3)
+                               | (xmc [17] & 0x7) ;
+               *c++ = ((xmc [18] & 0x7) << 5)
+                               | ((xmc [19] & 0x7) << 2)
+                               | ((xmc [20] >> 1) & 0x3) ;
+               *c++ = ((xmc [20] & 0x1) << 7)
+                               | ((xmc [21] & 0x7) << 4)
+                               | ((xmc [22] & 0x7) << 1)
+                               | ((xmc [23] >> 2) & 0x1) ;
+               *c++ = ((xmc [23] & 0x3) << 6)
+                               | ((xmc [24] & 0x7) << 3)
+                               | (xmc [25] & 0x7) ;
+               *c++ = ((Nc [2] & 0x7F) << 1)                   /* 20 */
+                               | ((bc [2] >> 1) & 0x1) ;
+               *c++ = ((bc [2] & 0x1) << 7)
+                               | ((Mc [2] & 0x3) << 5)
+                               | ((xmaxc [2] >> 1) & 0x1F) ;
+               *c++ = ((xmaxc [2] & 0x1) << 7)
+                               | ((xmc [26] & 0x7) << 4)
+                               | ((xmc [27] & 0x7) << 1)
+                               | ((xmc [28] >> 2) & 0x1) ;
+               *c++ = ((xmc [28] & 0x3) << 6)
+                               | ((xmc [29] & 0x7) << 3)
+                               | (xmc [30] & 0x7) ;
+               *c++ = ((xmc [31] & 0x7) << 5)
+                               | ((xmc [32] & 0x7) << 2)
+                               | ((xmc [33] >> 1) & 0x3) ;
+               *c++ = ((xmc [33] & 0x1) << 7)
+                               | ((xmc [34] & 0x7) << 4)
+                               | ((xmc [35] & 0x7) << 1)
+                               | ((xmc [36] >> 2) & 0x1) ;
+               *c++ = ((xmc [36] & 0x3) << 6)
+                               | ((xmc [37] & 0x7) << 3)
+                               | (xmc [38] & 0x7) ;
+               *c++ = ((Nc [3] & 0x7F) << 1)
+                               | ((bc [3] >> 1) & 0x1) ;
+               *c++ = ((bc [3] & 0x1) << 7)
+                               | ((Mc [3] & 0x3) << 5)
+                               | ((xmaxc [3] >> 1) & 0x1F) ;
+               *c++ = ((xmaxc [3] & 0x1) << 7)
+                               | ((xmc [39] & 0x7) << 4)
+                               | ((xmc [40] & 0x7) << 1)
+                               | ((xmc [41] >> 2) & 0x1) ;
+               *c++ = ((xmc [41] & 0x3) << 6)                  /* 30 */
+                               | ((xmc [42] & 0x7) << 3)
+                               | (xmc [43] & 0x7) ;
+               *c++ = ((xmc [44] & 0x7) << 5)
+                               | ((xmc [45] & 0x7) << 2)
+                               | ((xmc [46] >> 1) & 0x3) ;
+               *c++ = ((xmc [46] & 0x1) << 7)
+                               | ((xmc [47] & 0x7) << 4)
+                               | ((xmc [48] & 0x7) << 1)
+                               | ((xmc [49] >> 2) & 0x1) ;
+               *c++ = ((xmc [49] & 0x3) << 6)
+                               | ((xmc [50] & 0x7) << 3)
+                               | (xmc [51] & 0x7) ;
 
        }
 }
index 0139c35..2087683 100644 (file)
 
 int gsm_option (gsm r, int opt, int * val)
 {
-       int     result = -1;
+       int     result = -1 ;
 
        switch (opt) {
        case GSM_OPT_LTP_CUT:
 #ifdef         LTP_CUT
-               result = r->ltp_cut;
-               if (val) r->ltp_cut = *val;
+               result = r->ltp_cut ;
+               if (val) r->ltp_cut = *val ;
 #endif
-               break;
+               break ;
 
        case GSM_OPT_VERBOSE:
 #ifndef        NDEBUG
-               result = r->verbose;
-               if (val) r->verbose = *val;
+               result = r->verbose ;
+               if (val) r->verbose = *val ;
 #endif
-               break;
+               break ;
 
        case GSM_OPT_FAST:
 
-#if    defined(FAST) && defined(USE_FLOAT_MUL)
-               result = r->fast;
-               if (val) r->fast = !!*val;
+#if    defined (FAST) && defined (USE_FLOAT_MUL)
+               result = r->fast ;
+               if (val) r->fast = !!*val ;
 #endif
-               break;
+               break ;
 
        case GSM_OPT_FRAME_CHAIN:
 
 #ifdef WAV49
-               result = r->frame_chain;
-               if (val) r->frame_chain = *val;
+               result = r->frame_chain ;
+               if (val) r->frame_chain = *val ;
 #endif
-               break;
+               break ;
 
        case GSM_OPT_FRAME_INDEX:
 
 #ifdef WAV49
-               result = r->frame_index;
-               if (val) r->frame_index = *val;
+               result = r->frame_index ;
+               if (val) r->frame_index = *val ;
 #endif
-               break;
+               break ;
 
        case GSM_OPT_WAV49:
 
-#ifdef WAV49 
-               result = r->wav_fmt;
-               if (val) r->wav_fmt = !!*val;
+#ifdef WAV49
+               result = r->wav_fmt ;
+               if (val) r->wav_fmt = !!*val ;
 #endif
-               break;
+               break ;
 
        default:
-               break;
+               break ;
        }
-       return result;
+       return result ;
 }
index 0d2cd0f..3276a46 100644 (file)
  * This module computes the LTP gain (bc) and the LTP lag (Nc)
  * for the long term analysis filter.   This is done by calculating a
  * maximum of the cross-correlation function between the current
- * sub-segment short term residual signal d[0..39] (output of
- * the short term analysis filter; for simplification the index
+ * sub-segment short term residual signal d [0..39] (output of
+ * the short term analysis filter ; for simplification the index
  * of this array begins at 0 and ends at 39 for each sub-segment of the
  * RPE-LTP analysis) and the previous reconstructed short term
- * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
+ * residual signal dp [-120 .. -1].  A dynamic scaling must be
  * performed to avoid overflow.
  */
 
  /* The next procedure exists in six versions.  First two integer
-  * version (if USE_FLOAT_MUL is not defined); then four floating
+  * version (if USE_FLOAT_MUL is not defined) ; then four floating
   * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
   * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
   * option used).  Every pair has first a Cut version (see the -C
-  * option to toast or the LTP_CUT option to gsm_option()), then the
+  * option to toast or the LTP_CUT option to gsm_option ()), then the
   * uncut one.  (For a detailed explanation of why this is altogether
   * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
   * Harmful''.)
   */
 
-#ifndef  USE_FLOAT_MUL
+#ifndef        USE_FLOAT_MUL
 
 #ifdef LTP_CUT
 
@@ -45,240 +45,235 @@ static void Cut_Calculation_of_the_LTP_parameters (
 
        struct gsm_state * st,
 
-       register word   * d,            /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * d,            /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       word            Nc, bc;
-       word            wt[40];
+       register int    k, lambda ;
+       int16_t         Nc, bc ;
+       int16_t         wt [40] ;
 
-       longword        L_result;
-       longword        L_max, L_power;
-       word            R, S, dmax, scal, best_k;
-       word            ltp_cut;
+       int32_t L_result ;
+       int32_t L_max, L_power ;
+       int16_t         R, S, dmax, scal, best_k ;
+       int16_t         ltp_cut ;
 
-       register word   temp, wt_k;
+       register int16_t        temp, wt_k ;
 
-       /*  Search of the optimum scaling of d[0..39].
-        */
-       dmax = 0;
-       for (k = 0; k <= 39; k++) {
-               temp = d[k];
-               temp = GSM_ABS( temp );
-               if (temp > dmax) {
-                       dmax = temp;
-                       best_k = k;
+       /*  Search of the optimum scaling of d [0..39]. */
+       dmax = 0 ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       temp = d [k] ;
+               temp = GSM_ABS (temp) ;
+               if (temp > dmax)
+               {       dmax = temp ;
+                       best_k = k ;
+                       }
                }
-       }
-       temp = 0;
-       if (dmax == 0) scal = 0;
-       else {
-               assert(dmax > 0);
-               temp = gsm_norm( (longword)dmax << 16 );
-       }
-       if (temp > 6) scal = 0;
-       else scal = 6 - temp;
-       assert(scal >= 0);
+       temp = 0 ;
+       if (dmax == 0)
+               scal = 0 ;
+       else
+       {       assert (dmax > 0) ;
+               temp = gsm_norm ((int32_t) dmax << 16) ;
+               }
+       if (temp > 6) scal = 0 ;
+       else scal = 6 - temp ;
+       assert (scal >= 0) ;
 
        /* Search for the maximum cross-correlation and coding of the LTP lag
         */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
-       wt_k  = SASR_W(d[best_k], scal);
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
+       wt_k = SASR_W (d [best_k], scal) ;
 
-       for (lambda = 40; lambda <= 120; lambda++) {
-               L_result = (longword)wt_k * dp[best_k - lambda];
-               if (L_result > L_max) {
-                       Nc    = lambda;
-                       L_max = L_result;
+       for (lambda = 40 ; lambda <= 120 ; lambda++)
+       {       L_result = (int32_t) wt_k * dp [best_k - lambda] ;
+               if (L_result > L_max)
+               {       Nc = lambda ;
+                       L_max = L_result ;
+                       }
                }
-       }
-       *Nc_out = Nc;
-       L_max <<= 1;
+       *Nc_out = Nc ;
+       L_max <<= 1 ;
 
        /*  Rescaling of L_max
         */
-       assert(scal <= 100 && scal >= -100);
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+       assert (scal <= 100 && scal >= -100) ;
+       L_max = L_max >> (6 - scal) ;   /* sub (6, scal) */
 
-       assert( Nc <= 120 && Nc >= 40);
+       assert (Nc <= 120 && Nc >= 40) ;
 
        /*   Compute the power of the reconstructed short term residual
-        *   signal dp[..]
+        *   signal dp [..]
         */
-       L_power = 0;
-       for (k = 0; k <= 39; k++) {
+       L_power = 0 ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       register int32_t L_temp ;
 
-               register longword L_temp;
-
-               L_temp   = SASR_W( dp[k - Nc], 3 );
-               L_power += L_temp * L_temp;
-       }
-       L_power <<= 1;  /* from L_MULT */
+               L_temp = SASR_W (dp [k - Nc], 3) ;
+               L_power += L_temp * L_temp ;
+               }
+       L_power <<= 1 ; /* from L_MULT */
 
-       /*  Normalization of L_max and L_power
-        */
+       /*  Normalization of L_max and L_power */
 
-       if (L_max <= 0)  {
-               *bc_out = 0;
-               return;
-       }
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max <= 0)
+       {       *bc_out = 0 ;
+               return ;
+               }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
-       temp = gsm_norm( L_power );
+       temp = gsm_norm (L_power) ;
 
-       R = SASR( L_max   << temp, 16 );
-       S = SASR( L_power << temp, 16 );
+       R = SASR (L_max << temp, 16) ;
+       S = SASR (L_power << temp, 16) ;
 
        /*  Coding of the LTP gain
         */
 
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+       /*  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
-       *bc_out = bc;
+       for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ;
+       *bc_out = bc ;
 }
 
 #endif         /* LTP_CUT */
 
 static void Calculation_of_the_LTP_parameters (
-       register word   * d,            /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * d,            /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       word            Nc, bc;
-       word            wt[40];
+       register int    k, lambda ;
+       int16_t         Nc, bc ;
+       int16_t         wt [40] ;
 
-       longword        L_max, L_power;
-       word            R, S, dmax, scal;
-       register word   temp;
+       int32_t L_max, L_power ;
+       int16_t         R, S, dmax, scal ;
+       register int16_t        temp ;
 
-       /*  Search of the optimum scaling of d[0..39].
+       /*  Search of the optimum scaling of d [0..39].
         */
-       dmax = 0;
+       dmax = 0 ;
 
-       for (k = 0; k <= 39; k++) {
-               temp = d[k];
-               temp = GSM_ABS( temp );
-               if (temp > dmax) dmax = temp;
-       }
+       for (k = 0 ; k <= 39 ; k++)
+       {       temp = d [k] ;
+               temp = GSM_ABS (temp) ;
+               if (temp > dmax) dmax = temp ;
+               }
 
-       temp = 0;
-       if (dmax == 0) scal = 0;
-       else {
-               assert(dmax > 0);
-               temp = gsm_norm( (longword)dmax << 16 );
-       }
+       temp = 0 ;
+       if (dmax == 0)
+               scal = 0 ;
+       else
+       {       assert (dmax > 0) ;
+               temp = gsm_norm ((int32_t) dmax << 16) ;
+               }
 
-       if (temp > 6) scal = 0;
-       else scal = 6 - temp;
+       if (temp > 6) scal = 0 ;
+       else scal = 6 - temp ;
 
-       assert(scal >= 0);
+       assert (scal >= 0) ;
 
        /*  Initialization of a working array wt
         */
 
-       for (k = 0; k <= 39; k++) wt[k] = SASR_W( d[k], scal );
+       for (k = 0 ; k <= 39 ; k++) wt [k] = SASR_W (d [k], scal) ;
 
-       /* Search for the maximum cross-correlation and coding of the LTP lag
-        */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
+       /* Search for the maximum cross-correlation and coding of the LTP lag */
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
 
-       for (lambda = 40; lambda <= 120; lambda++) {
+       for (lambda = 40 ; lambda <= 120 ; lambda++)
+       {
 
 # undef STEP
-#              define STEP(k)  (longword)wt[k] * dp[k - lambda]
-
-               register longword L_result;
-
-               L_result  = STEP(0)  ; L_result += STEP(1) ;
-               L_result += STEP(2)  ; L_result += STEP(3) ;
-               L_result += STEP(4)  ; L_result += STEP(5)  ;
-               L_result += STEP(6)  ; L_result += STEP(7)  ;
-               L_result += STEP(8)  ; L_result += STEP(9)  ;
-               L_result += STEP(10) ; L_result += STEP(11) ;
-               L_result += STEP(12) ; L_result += STEP(13) ;
-               L_result += STEP(14) ; L_result += STEP(15) ;
-               L_result += STEP(16) ; L_result += STEP(17) ;
-               L_result += STEP(18) ; L_result += STEP(19) ;
-               L_result += STEP(20) ; L_result += STEP(21) ;
-               L_result += STEP(22) ; L_result += STEP(23) ;
-               L_result += STEP(24) ; L_result += STEP(25) ;
-               L_result += STEP(26) ; L_result += STEP(27) ;
-               L_result += STEP(28) ; L_result += STEP(29) ;
-               L_result += STEP(30) ; L_result += STEP(31) ;
-               L_result += STEP(32) ; L_result += STEP(33) ;
-               L_result += STEP(34) ; L_result += STEP(35) ;
-               L_result += STEP(36) ; L_result += STEP(37) ;
-               L_result += STEP(38) ; L_result += STEP(39) ;
-
-               if (L_result > L_max) {
-
-                       Nc    = lambda;
-                       L_max = L_result;
+#              define STEP(k)  (int32_t) wt [k] * dp [k - lambda]
+
+               register int32_t L_result ;
+
+               L_result = STEP (0) ; L_result += STEP (1) ;
+               L_result += STEP (2) ; L_result += STEP (3) ;
+               L_result += STEP (4) ; L_result += STEP (5) ;
+               L_result += STEP (6) ; L_result += STEP (7) ;
+               L_result += STEP (8) ; L_result += STEP (9) ;
+               L_result += STEP (10) ; L_result += STEP (11) ;
+               L_result += STEP (12) ; L_result += STEP (13) ;
+               L_result += STEP (14) ; L_result += STEP (15) ;
+               L_result += STEP (16) ; L_result += STEP (17) ;
+               L_result += STEP (18) ; L_result += STEP (19) ;
+               L_result += STEP (20) ; L_result += STEP (21) ;
+               L_result += STEP (22) ; L_result += STEP (23) ;
+               L_result += STEP (24) ; L_result += STEP (25) ;
+               L_result += STEP (26) ; L_result += STEP (27) ;
+               L_result += STEP (28) ; L_result += STEP (29) ;
+               L_result += STEP (30) ; L_result += STEP (31) ;
+               L_result += STEP (32) ; L_result += STEP (33) ;
+               L_result += STEP (34) ; L_result += STEP (35) ;
+               L_result += STEP (36) ; L_result += STEP (37) ;
+               L_result += STEP (38) ; L_result += STEP (39) ;
+
+               if (L_result > L_max)
+               {       Nc = lambda ;
+                       L_max = L_result ;
+                       }
                }
-       }
 
-       *Nc_out = Nc;
+       *Nc_out = Nc ;
 
-       L_max <<= 1;
+       L_max <<= 1 ;
 
        /*  Rescaling of L_max
         */
-       assert(scal <= 100 && scal >=  -100);
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+       assert (scal <= 100 && scal >= -100) ;
+       L_max = L_max >> (6 - scal) ;   /* sub (6, scal) */
 
-       assert( Nc <= 120 && Nc >= 40);
+       assert (Nc <= 120 && Nc >= 40) ;
 
        /*   Compute the power of the reconstructed short term residual
-        *   signal dp[..]
+        *   signal dp [..]
         */
-       L_power = 0;
-       for (k = 0; k <= 39; k++) {
+       L_power = 0 ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       register int32_t L_temp ;
 
-               register longword L_temp;
-
-               L_temp   = SASR_W( dp[k - Nc], 3 );
-               L_power += L_temp * L_temp;
-       }
-       L_power <<= 1;  /* from L_MULT */
+               L_temp = SASR_W (dp [k - Nc], 3) ;
+               L_power += L_temp * L_temp ;
+               }
+       L_power <<= 1 ; /* from L_MULT */
 
        /*  Normalization of L_max and L_power
         */
 
-       if (L_max <= 0)  {
-               *bc_out = 0;
-               return;
-       }
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max <= 0)
+       {       *bc_out = 0 ;
+               return ;
+               }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
-       temp = gsm_norm( L_power );
+       temp = gsm_norm (L_power) ;
 
-       R = SASR_L( L_max   << temp, 16 );
-       S = SASR_L( L_power << temp, 16 );
+       R = SASR_L (L_max << temp, 16) ;
+       S = SASR_L (L_power << temp, 16) ;
 
        /*  Coding of the LTP gain
         */
 
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+       /*  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
-       *bc_out = bc;
+       for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ;
+       *bc_out = bc ;
 }
 
 #else  /* USE_FLOAT_MUL */
@@ -287,117 +282,110 @@ static void Calculation_of_the_LTP_parameters (
 
 static void Cut_Calculation_of_the_LTP_parameters (
        struct gsm_state * st,          /*              IN      */
-       register word   * d,            /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * d,            /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       word            Nc, bc;
-       word            ltp_cut;
+       register int    k, lambda ;
+       int16_t         Nc, bc ;
+       int16_t         ltp_cut ;
 
-       float           wt_float[40];
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+       float           wt_float [40] ;
+       float           dp_float_base [120], * dp_float = dp_float_base + 120 ;
 
-       longword        L_max, L_power;
-       word            R, S, dmax, scal;
-       register word   temp;
+       int32_t L_max, L_power ;
+       int16_t         R, S, dmax, scal ;
+       register int16_t        temp ;
 
-       /*  Search of the optimum scaling of d[0..39].
+       /*  Search of the optimum scaling of d [0..39].
         */
-       dmax = 0;
-
-       for (k = 0; k <= 39; k++) {
-               temp = d[k];
-               temp = GSM_ABS( temp );
-               if (temp > dmax) dmax = temp;
-       }
+       dmax = 0 ;
 
-       temp = 0;
-       if (dmax == 0) scal = 0;
-       else {
-               assert(dmax > 0);
-               temp = gsm_norm( (longword)dmax << 16 );
-       }
+       for (k = 0 ; k <= 39 ; k++)
+       {       temp = d [k] ;
+               temp = GSM_ABS (temp) ;
+               if (temp > dmax) dmax = temp ;
+               }
 
-       if (temp > 6) scal = 0;
-       else scal = 6 - temp;
+       temp = 0 ;
+       if (dmax == 0) scal = 0 ;
+       else
+       {       assert (dmax > 0) ;
+               temp = gsm_norm ((int32_t) dmax << 16) ;
+               }
 
-       assert(scal >= 0);
-       ltp_cut = (longword)SASR_W(dmax, scal) * st->ltp_cut / 100; 
+       if (temp > 6) scal = 0 ;
+       else scal = 6 - temp ;
 
+       assert (scal >= 0) ;
+       ltp_cut = (int32_t) SASR_W (dmax, scal) * st->ltp_cut / 100 ;
 
-       /*  Initialization of a working array wt
-        */
+       /*  Initialization of a working array wt */
 
-       for (k = 0; k < 40; k++) {
-               register word w = SASR_W( d[k], scal );
-               if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
-                       wt_float[k] = 0.0;
-               }
-               else {
-                       wt_float[k] =  w;
+       for (k = 0 ; k < 40 ; k++)
+       {       register int16_t w = SASR_W (d [k], scal) ;
+               if (w < 0 ? w > -ltp_cut : w < ltp_cut)
+                       wt_float [k] = 0.0 ;
+               else
+                       wt_float [k] = w ;
                }
-       }
-       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+       for (k = -120 ; k < 0 ; k++) dp_float [k] = dp [k] ;
 
        /* Search for the maximum cross-correlation and coding of the LTP lag
         */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
 
-       for (lambda = 40; lambda <= 120; lambda += 9) {
+       for (lambda = 40 ; lambda <= 120 ; lambda += 9)
+       {       /*  Calculate L_result for l = lambda .. lambda + 9. */
+               register float *lp = dp_float - lambda ;
 
-               /*  Calculate L_result for l = lambda .. lambda + 9.
-                */
-               register float *lp = dp_float - lambda;
-
-               register float  W;
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],
-                               d = lp[-5], e = lp[-4], f = lp[-3],
-                               g = lp[-2], h = lp[-1];
-               register float  E; 
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+               register float W ;
+               register float a = lp [-8], b = lp [-7], c = lp [-6],
+                                               d = lp [-5], e = lp [-4], f = lp [-3],
+                                               g = lp [-2], h = lp [-1] ;
+               register float E ;
+               register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                                               S5 = 0, S6 = 0, S7 = 0, S8 = 0 ;
 
 #              undef STEP
 #              define  STEP(K, a, b, c, d, e, f, g, h) \
-                       if ((W = wt_float[K]) != 0.0) { \
-                       E = W * a; S8 += E;             \
-                       E = W * b; S7 += E;             \
-                       E = W * c; S6 += E;             \
-                       E = W * d; S5 += E;             \
-                       E = W * e; S4 += E;             \
-                       E = W * f; S3 += E;             \
-                       E = W * g; S2 += E;             \
-                       E = W * h; S1 += E;             \
-                       a  = lp[K];                     \
-                       E = W * a; S0 += E; } else (a = lp[K])
-
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
-
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
-
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
-
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
-
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
-
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+                       if ((W = wt_float [K]) != 0.0) {        \
+                       E = W * a ; S8 += E ;           \
+                       E = W * b ; S7 += E ;           \
+                       E = W * c ; S6 += E ;           \
+                       E = W * d ; S5 += E ;           \
+                       E = W * e ; S4 += E ;           \
+                       E = W * f ; S3 += E ;           \
+                       E = W * g ; S2 += E ;           \
+                       E = W * h ; S1 += E ;           \
+                       a = lp [K] ;                            \
+                       E = W * a ; S0 += E ; } else (a = lp [K])
+
+#              define  STEP_A(K)       STEP (K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP (K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP (K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP (K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP (K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP (K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP (K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP (K, h, a, b, c, d, e, f, g)
+
+               STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ;
+               STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ;
+
+               STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ;
+               STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ;
+
+               STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ;
+               STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ;
+
+               STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ;
+               STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ;
+
+               STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ;
+               STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ;
 
 #              undef STEP_A
 #              undef STEP_B
@@ -408,171 +396,166 @@ static void Cut_Calculation_of_the_LTP_parameters (
 #              undef STEP_G
 #              undef STEP_H
 
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+               if (S0 > L_max) { L_max = S0 ; Nc = lambda ; }
+               if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; }
+               if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; }
+               if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; }
+               if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; }
+               if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; }
+               if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; }
+               if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; }
+               if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; }
 
        }
-       *Nc_out = Nc;
+       *Nc_out = Nc ;
 
-       L_max <<= 1;
+       L_max <<= 1 ;
 
        /*  Rescaling of L_max
         */
-       assert(scal <= 100 && scal >=  -100);
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+       assert (scal <= 100 && scal >= -100) ;
+       L_max = L_max >> (6 - scal) ;   /* sub (6, scal) */
 
-       assert( Nc <= 120 && Nc >= 40);
+       assert (Nc <= 120 && Nc >= 40) ;
 
        /*   Compute the power of the reconstructed short term residual
-        *   signal dp[..]
+        *   signal dp [..]
         */
-       L_power = 0;
-       for (k = 0; k <= 39; k++) {
-
-               register longword L_temp;
+       L_power = 0 ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       register int32_t L_temp ;
 
-               L_temp   = SASR_W( dp[k - Nc], 3 );
-               L_power += L_temp * L_temp;
-       }
-       L_power <<= 1 /* from L_MULT */
+               L_temp = SASR_W (dp [k - Nc], 3) ;
+               L_power += L_temp * L_temp ;
+               }
+       L_power <<= 1 ; /* from L_MULT */
 
        /*  Normalization of L_max and L_power
         */
 
-       if (L_max <= 0)  {
-               *bc_out = 0;
-               return;
-       }
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max <= 0)
+       {       *bc_out = 0 ;
+               return ;
+               }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
-       temp = gsm_norm( L_power );
+       temp = gsm_norm (L_power) ;
 
-       R = SASR( L_max   << temp, 16 );
-       S = SASR( L_power << temp, 16 );
+       R = SASR (L_max << temp, 16) ;
+       S = SASR (L_power << temp, 16) ;
 
        /*  Coding of the LTP gain
         */
 
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+       /*  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
-       *bc_out = bc;
+       for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ;
+       *bc_out = bc ;
 }
 
 #endif /* LTP_CUT */
 
 static void Calculation_of_the_LTP_parameters (
-       register word   * din,          /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * din,          /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       word            Nc, bc;
+       register int    k, lambda ;
+       int16_t Nc, bc ;
 
-       float           wt_float[40];
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+       float   wt_float [40] ;
+       float   dp_float_base [120], * dp_float = dp_float_base + 120 ;
 
-       longword        L_max, L_power;
-       word            R, S, dmax, scal;
-       register word   temp;
+       int32_t L_max, L_power ;
+       int16_t         R, S, dmax, scal ;
+       register int16_t        temp ;
 
-       /*  Search of the optimum scaling of d[0..39].
+       /*  Search of the optimum scaling of d [0..39].
         */
-       dmax = 0;
+       dmax = 0 ;
 
-       for (k = 0; k <= 39; k++) {
-               temp = din [k] ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       temp = din [k] ;
                temp = GSM_ABS (temp) ;
-               if (temp > dmax) dmax = temp;
-       }
+               if (temp > dmax) dmax = temp ;
+               }
 
-       temp = 0;
-       if (dmax == 0) scal = 0;
-       else {
-               assert(dmax > 0);
-               temp = gsm_norm( (longword)dmax << 16 );
-       }
+       temp = 0 ;
+       if (dmax == 0) scal = 0 ;
+       else
+       {       assert (dmax > 0) ;
+               temp = gsm_norm ((int32_t) dmax << 16) ;
+               }
 
-       if (temp > 6) scal = 0;
-       else scal = 6 - temp;
+       if (temp > 6) scal = 0 ;
+       else scal = 6 - temp ;
 
-       assert(scal >= 0);
+       assert (scal >= 0) ;
 
-       /*  Initialization of a working array wt
-        */
+       /*  Initialization of a working array wt */
 
-       for (k =    0; k < 40; k++) wt_float[k] =  SASR_W (din [k], scal) ;
-       for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+       for (k = 0 ; k < 40 ; k++)              wt_float [k] = SASR_W (din [k], scal) ;
+       for (k = -120 ; k < 0 ; k++)    dp_float [k] = dp [k] ;
 
        /* Search for the maximum cross-correlation and coding of the LTP lag
         */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
 
-       for (lambda = 40; lambda <= 120; lambda += 9) {
+       for (lambda = 40 ; lambda <= 120 ; lambda += 9)
+       {       /*  Calculate L_result for l = lambda .. lambda + 9. */
+               register float *lp = dp_float - lambda ;
 
-               /*  Calculate L_result for l = lambda .. lambda + 9.
-                */
-               register float *lp = dp_float - lambda;
-
-               register float  W;
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],
-                               d = lp[-5], e = lp[-4], f = lp[-3],
-                               g = lp[-2], h = lp[-1];
-               register float  E; 
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+               register float W ;
+               register float a = lp [-8], b = lp [-7], c = lp [-6],
+                                               d = lp [-5], e = lp [-4], f = lp [-3],
+                                               g = lp [-2], h = lp [-1] ;
+               register float E ;
+               register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                                               S5 = 0, S6 = 0, S7 = 0, S8 = 0 ;
 
 #              undef STEP
 #              define  STEP(K, a, b, c, d, e, f, g, h) \
-                       W = wt_float[K];                \
-                       E = W * a; S8 += E;             \
-                       E = W * b; S7 += E;             \
-                       E = W * c; S6 += E;             \
-                       E = W * d; S5 += E;             \
-                       E = W * e; S4 += E;             \
-                       E = W * f; S3 += E;             \
-                       E = W * g; S2 += E;             \
-                       E = W * h; S1 += E;             \
-                       a  = lp[K];                     \
-                       E = W * a; S0 += E
-
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
-
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
-
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
-
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
-
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
-
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+                       W = wt_float [K] ;              \
+                       E = W * a ; S8 += E ;           \
+                       E = W * b ; S7 += E ;           \
+                       E = W * c ; S6 += E ;           \
+                       E = W * d ; S5 += E ;           \
+                       E = W * e ; S4 += E ;           \
+                       E = W * f ; S3 += E ;           \
+                       E = W * g ; S2 += E ;           \
+                       E = W * h ; S1 += E ;           \
+                       a = lp [K] ;                            \
+                       E = W * a ; S0 += E
+
+#              define  STEP_A(K)       STEP (K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP (K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP (K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP (K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP (K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP (K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP (K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP (K, h, a, b, c, d, e, f, g)
+
+               STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ;
+               STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ;
+
+               STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ;
+               STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ;
+
+               STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ;
+               STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ;
+
+               STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ;
+               STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ;
+
+               STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ;
+               STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ;
 
 #              undef STEP_A
 #              undef STEP_B
@@ -583,65 +566,64 @@ static void Calculation_of_the_LTP_parameters (
 #              undef STEP_G
 #              undef STEP_H
 
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+               if (S0 > L_max) { L_max = S0 ; Nc = lambda ; }
+               if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; }
+               if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; }
+               if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; }
+               if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; }
+               if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; }
+               if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; }
+               if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; }
+               if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; }
        }
-       *Nc_out = Nc;
+       *Nc_out = Nc ;
 
-       L_max <<= 1;
+       L_max <<= 1 ;
 
        /*  Rescaling of L_max
         */
-       assert(scal <= 100 && scal >=  -100);
-       L_max = L_max >> (6 - scal);    /* sub(6, scal) */
+       assert (scal <= 100 && scal >= -100) ;
+       L_max = L_max >> (6 - scal) ;   /* sub (6, scal) */
 
-       assert( Nc <= 120 && Nc >= 40);
+       assert (Nc <= 120 && Nc >= 40) ;
 
        /*   Compute the power of the reconstructed short term residual
-        *   signal dp[..]
+        *   signal dp [..]
         */
-       L_power = 0;
-       for (k = 0; k <= 39; k++) {
-
-               register longword L_temp;
+       L_power = 0 ;
+       for (k = 0 ; k <= 39 ; k++)
+       {       register int32_t L_temp ;
 
-               L_temp   = SASR_W( dp[k - Nc], 3 );
-               L_power += L_temp * L_temp;
-       }
-       L_power <<= 1 /* from L_MULT */
+               L_temp = SASR_W (dp [k - Nc], 3) ;
+               L_power += L_temp * L_temp ;
+               }
+       L_power <<= 1 ; /* from L_MULT */
 
        /*  Normalization of L_max and L_power
         */
 
-       if (L_max <= 0)  {
-               *bc_out = 0;
-               return;
-       }
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max <= 0)
+       {       *bc_out = 0 ;
+               return ;
+               }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
-       temp = gsm_norm( L_power );
+       temp = gsm_norm (L_power) ;
 
-       R = SASR_L ( L_max   << temp, 16 );
-       S = SASR_L ( L_power << temp, 16 );
+       R = SASR_L (L_max << temp, 16) ;
+       S = SASR_L (L_power << temp, 16) ;
 
        /*  Coding of the LTP gain
         */
 
-       /*  Table 4.3a must be used to obtain the level DLB[i] for the
+       /*  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
-       *bc_out = bc;
+       for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ;
+       *bc_out = bc ;
 }
 
 #ifdef FAST
@@ -649,192 +631,186 @@ static void Calculation_of_the_LTP_parameters (
 
 static void Cut_Fast_Calculation_of_the_LTP_parameters (
        struct gsm_state * st,          /*              IN      */
-       register word   * d,            /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * d,            /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       register float  wt_float;
-       word            Nc, bc;
-       word            wt_max, best_k, ltp_cut;
+       register int    k, lambda ;
+       register float  wt_float ;
+       int16_t Nc, bc ;
+       int16_t wt_max, best_k, ltp_cut ;
 
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+       float           dp_float_base [120], * dp_float = dp_float_base + 120 ;
 
-       register float  L_result, L_max, L_power;
+       register float  L_result, L_max, L_power ;
 
-       wt_max = 0;
+       wt_max = 0 ;
 
-       for (k = 0; k < 40; ++k) {
-               if      ( d[k] > wt_max) wt_max =  d[best_k = k];
-               else if (-d[k] > wt_max) wt_max = -d[best_k = k];
-       }
+       for (k = 0 ; k < 40 ; ++k)
+       {       if (d [k] > wt_max) wt_max = d [best_k = k] ;
+               else if (-d [k] > wt_max) wt_max = -d [best_k = k] ;
+               }
 
-       assert(wt_max >= 0);
-       wt_float = (float)wt_max;
+       assert (wt_max >= 0) ;
+       wt_float = (float) wt_max ;
 
-       for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+       for (k = -120 ; k < 0 ; ++k) dp_float [k] = (float) dp [k] ;
 
-       /* Search for the maximum cross-correlation and coding of the LTP lag
-        */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
+       /* Search for the maximum cross-correlation and coding of the LTP lag */
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
 
-       for (lambda = 40; lambda <= 120; lambda++) {
-               L_result = wt_float * dp_float[best_k - lambda];
-               if (L_result > L_max) {
-                       Nc    = lambda;
-                       L_max = L_result;
+       for (lambda = 40 ; lambda <= 120 ; lambda++)
+       {       L_result = wt_float * dp_float [best_k - lambda] ;
+               if (L_result > L_max)
+               {       Nc = lambda ;
+                       L_max = L_result ;
+                       }
                }
-       }
 
-       *Nc_out = Nc;
-       if (L_max <= 0.)  {
-               *bc_out = 0;
-               return;
-       }
+       *Nc_out = Nc ;
+       if (L_max <= 0.)
+       {       *bc_out = 0 ;
+               return ;
+               }
 
        /*  Compute the power of the reconstructed short term residual
-        *  signal dp[..]
+        *  signal dp [..]
         */
-       dp_float -= Nc;
-       L_power = 0;
-       for (k = 0; k < 40; ++k) {
-               register float f = dp_float[k];
-               L_power += f * f;
-       }
+       dp_float -= Nc ;
+       L_power = 0 ;
+       for (k = 0 ; k < 40 ; ++k)
+       {       register float f = dp_float [k] ;
+               L_power += f * f ;
+               }
 
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
        /*  Coding of the LTP gain
-        *  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       lambda = L_max / L_power * 32768.;
-       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
-       *bc_out = bc;
+       lambda = L_max / L_power * 32768.;
+       for (bc = 0 ; bc <= 2 ; ++bc) if (lambda <= gsm_DLB [bc]) break ;
+       *bc_out = bc ;
 }
 
 #endif /* LTP_CUT */
 
 static void Fast_Calculation_of_the_LTP_parameters (
-       register word   * din,          /* [0..39]      IN      */
-       register word   * dp,           /* [-120..-1]   IN      */
-       word            * bc_out,       /*              OUT     */
-       word            * Nc_out        /*              OUT     */
-)
+       register int16_t        * din,          /* [0..39]      IN      */
+       register int16_t        * dp,           /* [-120..-1]   IN      */
+       int16_t         * bc_out,       /*              OUT     */
+       int16_t         * Nc_out        /*              OUT     */)
 {
-       register int    k, lambda;
-       word            Nc, bc;
+       register int    k, lambda ;
+       int16_t                 Nc, bc ;
 
-       float           wt_float[40];
-       float           dp_float_base[120], * dp_float = dp_float_base + 120;
+       float           wt_float [40] ;
+       float           dp_float_base [120], * dp_float = dp_float_base + 120 ;
 
-       register float  L_max, L_power;
+       register float  L_max, L_power ;
 
-       for (k = 0; k < 40; ++k) wt_float[k] = (float) din [k] ;
-       for (k = -120; k < 0; ++k) dp_float[k] = (float) dp [k] ;
+       for (k = 0 ; k < 40 ; ++k) wt_float [k] = (float) din [k] ;
+       for (k = -120 ; k < 0 ; ++k) dp_float [k] = (float) dp [k] ;
 
-       /* Search for the maximum cross-correlation and coding of the LTP lag
-        */
-       L_max = 0;
-       Nc    = 40;     /* index for the maximum cross-correlation */
-
-       for (lambda = 40; lambda <= 120; lambda += 9) {
+       /* Search for the maximum cross-correlation and coding of the LTP lag */
+       L_max = 0 ;
+       Nc = 40 ;       /* index for the maximum cross-correlation */
 
-               /*  Calculate L_result for l = lambda .. lambda + 9.
-                */
-               register float *lp = dp_float - lambda;
+       for (lambda = 40 ; lambda <= 120 ; lambda += 9)
+       {       /*  Calculate L_result for l = lambda .. lambda + 9. */
+               register float *lp = dp_float - lambda ;
 
-               register float  W;
-               register float  a = lp[-8], b = lp[-7], c = lp[-6],
-                               d = lp[-5], e = lp[-4], f = lp[-3],
-                               g = lp[-2], h = lp[-1];
-               register float  E; 
-               register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
-                               S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+               register float ;
+               register float a = lp [-8], b = lp [-7], c = lp [-6],
+                                               d = lp [-5], e = lp [-4], f = lp [-3],
+                                               g = lp [-2], h = lp [-1] ;
+               register float E ;
+               register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+                                               S5 = 0, S6 = 0, S7 = 0, S8 = 0 ;
 
 #              undef STEP
 #              define  STEP(K, a, b, c, d, e, f, g, h) \
-                       W = wt_float[K];                \
-                       E = W * a; S8 += E;             \
-                       E = W * b; S7 += E;             \
-                       E = W * c; S6 += E;             \
-                       E = W * d; S5 += E;             \
-                       E = W * e; S4 += E;             \
-                       E = W * f; S3 += E;             \
-                       E = W * g; S2 += E;             \
-                       E = W * h; S1 += E;             \
-                       a  = lp[K];                     \
-                       E = W * a; S0 += E
-
-#              define  STEP_A(K)       STEP(K, a, b, c, d, e, f, g, h)
-#              define  STEP_B(K)       STEP(K, b, c, d, e, f, g, h, a)
-#              define  STEP_C(K)       STEP(K, c, d, e, f, g, h, a, b)
-#              define  STEP_D(K)       STEP(K, d, e, f, g, h, a, b, c)
-#              define  STEP_E(K)       STEP(K, e, f, g, h, a, b, c, d)
-#              define  STEP_F(K)       STEP(K, f, g, h, a, b, c, d, e)
-#              define  STEP_G(K)       STEP(K, g, h, a, b, c, d, e, f)
-#              define  STEP_H(K)       STEP(K, h, a, b, c, d, e, f, g)
-
-               STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
-               STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
-
-               STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
-               STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
-
-               STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
-               STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
-
-               STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
-               STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
-
-               STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
-               STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
-
-               if (S0 > L_max) { L_max = S0; Nc = lambda;     }
-               if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
-               if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
-               if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
-               if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
-               if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
-               if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
-               if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
-               if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
-       }
-       *Nc_out = Nc;
-
-       if (L_max <= 0.)  {
-               *bc_out = 0;
-               return;
-       }
+                       W = wt_float [K] ;              \
+                       E = W * a ; S8 += E ;           \
+                       E = W * b ; S7 += E ;           \
+                       E = W * c ; S6 += E ;           \
+                       E = W * d ; S5 += E ;           \
+                       E = W * e ; S4 += E ;           \
+                       E = W * f ; S3 += E ;           \
+                       E = W * g ; S2 += E ;           \
+                       E = W * h ; S1 += E ;           \
+                       a = lp [K] ;                            \
+                       E = W * a ; S0 += E
+
+#              define  STEP_A(K)       STEP (K, a, b, c, d, e, f, g, h)
+#              define  STEP_B(K)       STEP (K, b, c, d, e, f, g, h, a)
+#              define  STEP_C(K)       STEP (K, c, d, e, f, g, h, a, b)
+#              define  STEP_D(K)       STEP (K, d, e, f, g, h, a, b, c)
+#              define  STEP_E(K)       STEP (K, e, f, g, h, a, b, c, d)
+#              define  STEP_F(K)       STEP (K, f, g, h, a, b, c, d, e)
+#              define  STEP_G(K)       STEP (K, g, h, a, b, c, d, e, f)
+#              define  STEP_H(K)       STEP (K, h, a, b, c, d, e, f, g)
+
+               STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ;
+               STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ;
+
+               STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ;
+               STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ;
+
+               STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ;
+               STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ;
+
+               STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ;
+               STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ;
+
+               STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ;
+               STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ;
+
+               if (S0 > L_max) { L_max = S0 ; Nc = lambda ; }
+               if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; }
+               if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; }
+               if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; }
+               if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; }
+               if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; }
+               if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; }
+               if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; }
+               if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; }
+       }
+       *Nc_out = Nc ;
+
+       if (L_max <= 0.0)
+       {       *bc_out = 0 ;
+               return ;
+               }
 
        /*  Compute the power of the reconstructed short term residual
-        *  signal dp[..]
+        *  signal dp [..]
         */
-       dp_float -= Nc;
-       L_power = 0;
-       for (k = 0; k < 40; ++k) {
-               register float f = dp_float[k];
-               L_power += f * f;
-       }
+       dp_float -= Nc ;
+       L_power = 0 ;
+       for (k = 0 ; k < 40 ; ++k)
+       {       register float f = dp_float [k] ;
+               L_power += f * f ;
+               }
 
-       if (L_max >= L_power) {
-               *bc_out = 3;
-               return;
-       }
+       if (L_max >= L_power)
+       {       *bc_out = 3 ;
+               return ;
+               }
 
        /*  Coding of the LTP gain
-        *  Table 4.3a must be used to obtain the level DLB[i] for the
+        *  Table 4.3a must be used to obtain the level DLB [i] for the
         *  quantization of the LTP gain b to get the coded version bc.
         */
-       lambda = L_max / L_power * 32768.;
-       for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
-       *bc_out = bc;
+       lambda = L_max / L_power * 32768.;
+       for (bc = 0 ; bc <= 2 ; ++bc) if (lambda <= gsm_DLB [bc]) break ;
+       *bc_out = bc ;
 }
 
 #endif /* FAST          */
@@ -844,116 +820,113 @@ static void Fast_Calculation_of_the_LTP_parameters (
 /* 4.2.12 */
 
 static void Long_term_analysis_filtering (
-       word            bc,     /*                                      IN  */
-       word            Nc,     /*                                      IN  */
-       register word   * dp,   /* previous d   [-120..-1]              IN  */
-       register word   * d,    /* d            [0..39]                 IN  */
-       register word   * dpp,  /* estimate     [0..39]                 OUT */
-       register word   * e     /* long term res. signal [0..39]        OUT */
-)
+       int16_t         bc,     /*                                      IN  */
+       int16_t         Nc,     /*                                      IN  */
+       register int16_t        * dp,   /* previous d   [-120..-1]              IN  */
+       register int16_t        * d,    /* d            [0..39]                 IN  */
+       register int16_t        * dpp,  /* estimate     [0..39]                 OUT */
+       register int16_t        * e     /* long term res. signal [0..39]        OUT */)
 /*
  *  In this part, we have to decode the bc parameter to compute
- *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
- *  use of table 4.3b.  The long term residual signal e[0..39]
+ *  the samples of the estimate dpp [0..39].  The decoding of bc needs the
+ *  use of table 4.3b.  The long term residual signal e [0..39]
  *  is then calculated to be fed to the RPE encoding section.
  */
 {
-       register int      k;
+       register int ;
 
 #      undef STEP
 #      define STEP(BP)                                 \
-       for (k = 0; k <= 39; k++) {                     \
-               dpp[k]  = GSM_MULT_R( BP, dp[k - Nc]);  \
-               e[k]    = GSM_SUB( d[k], dpp[k] );      \
-       }
+       for (k = 0 ; k <= 39 ; k++)             \
+       {       dpp [k] = GSM_MULT_R (BP, dp [k - Nc]) ;        \
+               e [k]   = GSM_SUB (d [k], dpp [k]) ;    \
+               }
 
-       switch (bc) {
-       case 0: STEP(  3277 ); break;
-       case 1: STEP( 11469 ); break;
-       case 2: STEP( 21299 ); break;
-       case 3: STEP( 32767 ); break; 
-       }
+       switch (bc)
+       {       case 0: STEP (3277) ; break ;
+               case 1: STEP (11469) ; break ;
+               case 2: STEP (21299) ; break ;
+               case 3: STEP (32767) ; break ;
+               }
 }
 
 void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */
 
        struct gsm_state        * S,
 
-       word    * d,    /* [0..39]   residual signal    IN      */
-       word    * dp,   /* [-120..-1] d'                IN      */
+       int16_t * d,    /* [0..39]   residual signal    IN      */
+       int16_t * dp,   /* [-120..-1] d'                IN      */
 
-       word    * e,    /* [0..39]                      OUT     */
-       word    * dpp,  /* [0..39]                      OUT     */
-       word    * Nc,   /* correlation lag              OUT     */
-       word    * bc    /* gain factor                  OUT     */
-)
+       int16_t * e,    /* [0..39]                      OUT     */
+       int16_t * dpp,  /* [0..39]                      OUT     */
+       int16_t * Nc,   /* correlation lag              OUT     */
+       int16_t * bc    /* gain factor                  OUT     */)
 {
-       assert( d  ); assert( dp ); assert( e  );
-       assert( dpp); assert( Nc ); assert( bc );
+       assert (d) ; assert (dp) ; assert (e) ;
+       assert (dpp) ; assert (Nc) ; assert (bc) ;
 
-#if defined(FAST) && defined(USE_FLOAT_MUL)
-       if (S->fast) 
-#if   defined (LTP_CUT)
+#if defined (FAST) && defined (USE_FLOAT_MUL)
+       if (S->fast)
+#if defined (LTP_CUT)
                if (S->ltp_cut)
-                       Cut_Fast_Calculation_of_the_LTP_parameters(S,
-                               d, dp, bc, Nc);
+                       Cut_Fast_Calculation_of_the_LTP_parameters (S,
+                               d, dp, bc, Nc) ;
                else
 #endif /* LTP_CUT */
-                       Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
-       else 
+                       Fast_Calculation_of_the_LTP_parameters (d, dp, bc, Nc) ;
+       else
 #endif /* FAST & USE_FLOAT_MUL */
 #ifdef LTP_CUT
                if (S->ltp_cut)
-                       Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+                       Cut_Calculation_of_the_LTP_parameters (S, d, dp, bc, Nc) ;
                else
 #endif
-                       Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+                       Calculation_of_the_LTP_parameters (d, dp, bc, Nc) ;
 
-       Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+       Long_term_analysis_filtering (*bc, *Nc, dp, d, dpp, e) ;
 }
 
 /* 4.3.2 */
 void Gsm_Long_Term_Synthesis_Filtering (
        struct gsm_state        * S,
 
-       word                    Ncr,
-       word                    bcr,
-       register word           * erp,     /* [0..39]                    IN */
-       register word           * drp      /* [-120..-1] IN, [-120..40] OUT */
-)
+       int16_t                 Ncr,
+       int16_t                 bcr,
+       register int16_t        * erp,  /* [0..39]                       IN */
+       register int16_t        * drp   /* [-120..-1] IN, [-120..40] OUT */)
 /*
  *  This procedure uses the bcr and Ncr parameter to realize the
  *  long term synthesis filtering.  The decoding of bcr needs
  *  table 4.3b.
  */
 {
-       register int            k;
-       word                    brp, drpp, Nr;
+       register int            k ;
+       int16_t                 brp, drpp, Nr ;
 
        /*  Check the limits of Nr.
         */
-       Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
-       S->nrp = Nr;
-       assert(Nr >= 40 && Nr <= 120);
+       Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr ;
+       S->nrp = Nr ;
+       assert (Nr >= 40 && Nr <= 120) ;
 
        /*  Decoding of the LTP gain bcr
         */
-       brp = gsm_QLB[ bcr ];
+       brp = gsm_QLB [bcr] ;
 
-       /*  Computation of the reconstructed short term residual 
-        *  signal drp[0..39]
+       /*  Computation of the reconstructed short term residual
+        *  signal drp [0..39]
         */
-       assert(brp != MIN_WORD);
+       assert (brp != MIN_WORD) ;
 
-       for (k = 0; k <= 39; k++) {
-               drpp   = GSM_MULT_R( brp, drp[ k - Nr ] );
-               drp[k] = GSM_ADD( erp[k], drpp );
-       }
+       for (k = 0 ; k <= 39 ; k++)
+       {       drpp = GSM_MULT_R (brp, drp [k - Nr]) ;
+               drp [k] = GSM_ADD (erp [k], drpp) ;
+               }
 
        /*
         *  Update of the reconstructed short term residual signal
-        *  drp[ -1..-120 ]
+        *  drp [-1..-120]
         */
 
-       for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+       for (k = 0 ; k <= 119 ; k++) drp [-120 + k] = drp [-80 + k] ;
 }
index 0e776e3..b35cd4b 100644 (file)
 
 
 static void Autocorrelation (
-       word     * s,           /* [0..159]     IN/OUT  */
-       longword * L_ACF)       /* [0..8]       OUT     */
+       int16_t         * s,            /* [0..159]     IN/OUT  */
+       int32_t * L_ACF)        /* [0..8]       OUT     */
 /*
- *  The goal is to compute the array L_ACF[k].  The signal s[i] must
+ *  The goal is to compute the array L_ACF [k].  The signal s [i] must
  *  be scaled in order to avoid an overflow situation.
  */
 {
-       register int    k, i;
+       register int    k, i ;
 
-       word            temp, smax, scalauto;
+       int16_t         temp, smax, scalauto ;
 
 #ifdef USE_FLOAT_MUL
-       float           float_s[160];
+       float           float_s [160] ;
 #endif
 
-       /*  Dynamic scaling of the array  s[0..159]
-        */
+       /*  Dynamic scaling of the array  s [0..159] */
 
-       /*  Search for the maximum.
-        */
-       smax = 0;
-       for (k = 0; k <= 159; k++) {
-               temp = GSM_ABS( s[k] );
-               if (temp > smax) smax = temp;
-       }
+       /*  Search for the maximum. */
+       smax = 0 ;
+       for (k = 0 ; k <= 159 ; k++)
+       {       temp = GSM_ABS (s [k]) ;
+               if (temp > smax) smax = temp ;
+               }
 
        /*  Computation of the scaling factor.
         */
-       if (smax == 0) scalauto = 0;
-       else {
-               assert(smax > 0);
-               scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
-       }
+       if (smax == 0)
+               scalauto = 0 ;
+       else
+       {       assert (smax > 0) ;
+               scalauto = 4 - gsm_norm ((int32_t) smax << 16) ;        /* sub (4,..) */
+               }
 
-       /*  Scaling of the array s[0...159]
+       /*  Scaling of the array s [0...159]
         */
 
-       if (scalauto > 0) {
+       if (scalauto > 0)
+       {
 
 # ifdef USE_FLOAT_MUL
-#   define SCALE(n)    \
-       case n: for (k = 0; k <= 159; k++) \
-                       float_s[k] = (float)    \
-                               (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
-               break;
-# else 
-#   define SCALE(n)    \
-       case n: for (k = 0; k <= 159; k++) \
-                       s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\
-               break;
+#      define SCALE(n) \
+       case n: for (k = 0 ; k <= 159 ; k++) \
+                       float_s [k] = (float)   \
+                               (s [k] = GSM_MULT_R (s [k], 16384 >> (n-1))) ;\
+               break ;
+# else
+#      define SCALE(n) \
+       case n: for (k = 0 ; k <= 159 ; k++) \
+                       s [k] = GSM_MULT_R (s [k], 16384 >> (n-1)) ;\
+               break ;
 # endif /* USE_FLOAT_MUL */
 
                switch (scalauto) {
-               SCALE(1)
-               SCALE(2)
-               SCALE(3)
-               SCALE(4)
+               SCALE (1)
+               SCALE (2)
+               SCALE (3)
+               SCALE (4)
                }
 # undef        SCALE
        }
 # ifdef        USE_FLOAT_MUL
-       else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+       else for (k = 0 ; k <= 159 ; k++) float_s [k] = (float) s [k] ;
 # endif
 
-       /*  Compute the L_ACF[..].
+       /*  Compute the L_ACF [..].
         */
        {
 # ifdef        USE_FLOAT_MUL
-               register float * sp = float_s;
-               register float   sl = *sp;
+               register float  *sp = float_s ;
+               register float  sl = *sp ;
 
-#              define STEP(k)   L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+#              define STEP(k)  L_ACF [k] += (int32_t) (sl * sp [- (k)]) ;
 # else
-               word  * sp = s;
-               word    sl = *sp;
+               int16_t *sp = s ;
+               int16_t sl = *sp ;
 
-#              define STEP(k)   L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+#              define STEP(k)  L_ACF [k] += ((int32_t) sl * sp [- (k)]) ;
 # endif
 
-#      define NEXTI     sl = *++sp
-
-
-       for (k = 9; k--; L_ACF[k] = 0) ;
-
-       STEP (0);
-       NEXTI;
-       STEP(0); STEP(1);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2); STEP(3);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
-       NEXTI;
-       STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
-
-       for (i = 8; i <= 159; i++) {
-
-               NEXTI;
-
-               STEP(0);
-               STEP(1); STEP(2); STEP(3); STEP(4);
-               STEP(5); STEP(6); STEP(7); STEP(8);
-       }
+#      define NEXTI    sl = *++sp
+
+
+       for (k = 9 ; k-- ; L_ACF [k] = 0) ;
+
+       STEP (0) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ; STEP (6) ;
+       NEXTI ;
+       STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ; STEP (6) ; STEP (7) ;
+
+       for (i = 8 ; i <= 159 ; i++)
+       {       NEXTI ;
+
+               STEP (0) ;
+               STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ;
+               STEP (5) ; STEP (6) ; STEP (7) ; STEP (8) ;
+               }
 
-       for (k = 9; k--; L_ACF[k] <<= 1) ; 
+       for (k = 9 ; k-- ; )
+               L_ACF [k] = SASL_L (L_ACF [k], 1) ;
 
        }
-       /*   Rescaling of the array s[0..159]
+       /*   Rescaling of the array s [0..159]
         */
-       if (scalauto > 0) {
-               assert(scalauto <= 4); 
-               for (k = 160; k--; *s++ <<= scalauto) ;
-       }
+       if (scalauto > 0)
+       {       assert (scalauto <= 4) ;
+               for (k = 160 ; k-- ; s++)
+                       *s = SASL_W (*s, scalauto) ;
+               }
 }
 
-#if defined(USE_FLOAT_MUL) && defined(FAST)
+#if defined (USE_FLOAT_MUL) && defined (FAST)
 
 static void Fast_Autocorrelation (
-       word * s,               /* [0..159]     IN/OUT  */
-       longword * L_ACF)       /* [0..8]       OUT     */
+       int16_t * s,            /* [0..159]     IN/OUT  */
+       int32_t * L_ACF)        /* [0..8]       OUT     */
 {
-       register int    k, i;
-       float f_L_ACF[9];
-       float scale;
-
-       float          s_f[160];
-       register float *sf = s_f;
-
-       for (i = 0; i < 160; ++i) sf[i] = s[i];
-       for (k = 0; k <= 8; k++) {
-               register float L_temp2 = 0;
-               register float *sfl = sf - k;
-               for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
-               f_L_ACF[k] = L_temp2;
-       }
-       scale = MAX_LONGWORD / f_L_ACF[0];
+       register int    k, i ;
+       float f_L_ACF [9] ;
+       float scale ;
+
+       float                   s_f [160] ;
+       register float *sf = s_f ;
+
+       for (i = 0 ; i < 160 ; ++i) sf [i] = s [i] ;
+       for (k = 0 ; k <= 8 ; k++)
+       {       register float L_temp2 = 0 ;
+               register float *sfl = sf - k ;
+               for (i = k ; i < 160 ; ++i) L_temp2 += sf [i] * sfl [i] ;
+               f_L_ACF [k] = L_temp2 ;
+               }
+       scale = MAX_LONGWORD / f_L_ACF [0] ;
 
-       for (k = 0; k <= 8; k++) {
-               L_ACF[k] = f_L_ACF[k] * scale;
-       }
+       for (k = 0 ; k <= 8 ; k++)
+               L_ACF [k] = f_L_ACF [k] * scale ;
 }
 #endif /* defined (USE_FLOAT_MUL) && defined (FAST) */
 
 /* 4.2.5 */
 
 static void Reflection_coefficients (
-       longword        * L_ACF,                /* 0...8        IN      */
-       register word   * r                     /* 0...7        OUT     */
+       int32_t * L_ACF,                /* 0...8        IN      */
+       register int16_t        * r                     /* 0...7        OUT     */
 )
 {
-       register int    i, m, n;
-       register word   temp;
-       word            ACF[9]; /* 0..8 */
-       word            P[  9]; /* 0..8 */
-       word            K[  9]; /* 2..8 */
+       register int    i, m, n ;
+       register int16_t        temp ;
+       int16_t         ACF [9] ;       /* 0..8 */
+       int16_t         P [9] ; /* 0..8 */
+       int16_t         K [9] ; /* 2..8 */
 
        /*  Schur recursion with 16 bits arithmetic.
         */
 
-       if (L_ACF[0] == 0) {
-               for (i = 8; i--; *r++ = 0) ;
-               return;
-       }
+       if (L_ACF [0] == 0)
+       {       for (i = 8 ; i-- ; *r++ = 0) ;
+               return ;
+               }
 
-       assert( L_ACF[0] != 0 );
-       temp = gsm_norm( L_ACF[0] );
+       assert (L_ACF [0] != 0) ;
+       temp = gsm_norm (L_ACF [0]) ;
 
-       assert(temp >= 0 && temp < 32);
+       assert (temp >= 0 && temp < 32) ;
 
        /* ? overflow ? */
-       for (i = 0; i <= 8; i++) ACF[i] = SASR_L( L_ACF[i] << temp, 16 );
+       for (i = 0 ; i <= 8 ; i++) ACF [i] = SASR_L (SASL_L (L_ACF [i], temp), 16) ;
 
-       /*   Initialize array P[..] and K[..] for the recursion.
+       /*   Initialize array P [..] and K [..] for the recursion.
         */
 
-       for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
-       for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+       for (i = 1 ; i <= 7 ; i++) K [i] = ACF [i] ;
+       for (i = 0 ; i <= 8 ; i++) P [i] = ACF [i] ;
 
        /*   Compute reflection coefficients
         */
-       for (n = 1; n <= 8; n++, r++) {
-
-               temp = P[1];
-               temp = GSM_ABS(temp);
-               if (P[0] < temp) {
-                       for (i = n; i <= 8; i++) *r++ = 0;
-                       return;
-               }
+       for (n = 1 ; n <= 8 ; n++, r++)
+       {       temp = P [1] ;
+               temp = GSM_ABS (temp) ;
+               if (P [0] < temp)
+               {       for (i = n ; i <= 8 ; i++) *r++ = 0 ;
+                       return ;
+                       }
 
-               *r = gsm_div( temp, P[0] );
+               *r = gsm_div (temp, P [0]) ;
 
-               assert(*r >= 0);
-               if (P[1] > 0) *r = -*r;         /* r[n] = sub(0, r[n]) */
-               assert (*r != MIN_WORD);
-               if (n == 8) return
+               assert (*r >= 0) ;
+               if (P [1] > 0) *r = -*r ;               /* r [n] = sub (0, r [n]) */
+               assert (*r != MIN_WORD) ;
+               if (n == 8) return ;
 
                /*  Schur recursion
                 */
-               temp = GSM_MULT_R( P[1], *r );
-               P[0] = GSM_ADD( P[0], temp );
+               temp = GSM_MULT_R (P [1], *r) ;
+               P [0] = GSM_ADD (P [0], temp) ;
 
-               for (m = 1; m <= 8 - n; m++) {
-                       temp     = GSM_MULT_R( K[ m   ],    *r );
-                       P[m]     = GSM_ADD(    P[ m+1 ],  temp );
+               for (m = 1 ; m <= 8 - n ; m++)
+               {       temp = GSM_MULT_R (K [m], *r) ;
+                       P [m] = GSM_ADD (P [m + 1], temp) ;
 
-                       temp     = GSM_MULT_R( P[ m+1 ],    *r );
-                       K[m]     = GSM_ADD(    K[ m   ],  temp );
+                       temp = GSM_MULT_R (P [m + 1], *r) ;
+                       K [m] = GSM_ADD (K [m], temp) ;
+                       }
                }
-       }
 }
 
 /* 4.2.6 */
 
 static void Transformation_to_Log_Area_Ratios (
-       register word   * r                     /* 0..7    IN/OUT */
+       register int16_t        * r                     /* 0..7    IN/OUT */
 )
 /*
- *  The following scaling for r[..] and LAR[..] has been used:
+ *  The following scaling for r [..] and LAR [..] has been used:
  *
- *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
- *  LAR[..] = integer( real_LAR[..] * 16384 );
+ *  r [..]   = integer (real_r [..]*32768.) ; -1 <= real_r < 1.
+ *  LAR [..] = integer (real_LAR [..] * 16384) ;
  *  with -1.625 <= real_LAR <= 1.625
  */
 {
-       register word   temp;
-       register int    i;
+       register int16_t        temp ;
+       register int    i ;
 
 
-       /* Computation of the LAR[0..7] from the r[0..7]
+       /* Computation of the LAR [0..7] from the r [0..7]
         */
-       for (i = 1; i <= 8; i++, r++) {
-
-               temp = *r;
-               temp = GSM_ABS(temp);
-               assert(temp >= 0);
-
-               if (temp < 22118) {
-                       temp >>= 1;
-               } else if (temp < 31130) {
-                       assert( temp >= 11059 );
-                       temp -= 11059;
-               } else {
-                       assert( temp >= 26112 );
-                       temp -= 26112;
-                       temp <<= 2;
-               }
-
-               *r = *r < 0 ? -temp : temp;
-               assert( *r != MIN_WORD );
+       for (i = 1 ; i <= 8 ; i++, r++)
+       {       temp = *r ;
+               temp = GSM_ABS (temp) ;
+               assert (temp >= 0) ;
+
+               if (temp < 22118)
+               {       temp >>= 1 ;
+                       }
+               else if (temp < 31130)
+               {       assert (temp >= 11059) ;
+                       temp -= 11059 ;
+                       }
+               else
+               {       assert (temp >= 26112) ;
+                       temp -= 26112 ;
+                       temp <<= 2 ;
+                       }
+
+               *r = *r < 0 ? -temp : temp ;
+               assert (*r != MIN_WORD) ;
        }
 }
 
 /* 4.2.7 */
 
 static void Quantization_and_coding (
-       register word * LAR     /* [0..7]       IN/OUT  */
+       register int16_t * LAR          /* [0..7]       IN/OUT  */
 )
 {
-       register word   temp;
+       register int16_t        temp ;
 
-       /*  This procedure needs four tables; the following equations
+       /*  This procedure needs four tables ; the following equations
         *  give the optimum scaling for the constants:
-        *  
-        *  A[0..7] = integer( real_A[0..7] * 1024 )
-        *  B[0..7] = integer( real_B[0..7] *  512 )
-        *  MAC[0..7] = maximum of the LARc[0..7]
-        *  MIC[0..7] = minimum of the LARc[0..7]
+        *
+        *  A [0..7] = integer (real_A [0..7] * 1024)
+        *  B [0..7] = integer (real_B [0..7] *  512)
+        *  MAC [0..7] = maximum of the LARc [0..7]
+        *  MIC [0..7] = minimum of the LARc [0..7]
         */
 
 #      undef STEP
-#      define  STEP( A, B, MAC, MIC )          \
-               temp = GSM_MULT( A,   *LAR );   \
-               temp = GSM_ADD(  temp,   B );   \
-               temp = GSM_ADD(  temp, 256 );   \
-               temp = SASR_W(     temp,   9 ); \
-               *LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
-               LAR++;
-
-       STEP(  20480,     0,  31, -32 );
-       STEP(  20480,     0,  31, -32 );
-       STEP(  20480,  2048,  15, -16 );
-       STEP(  20480, -2560,  15, -16 );
-
-       STEP(  13964,    94,   7,  -8 );
-       STEP(  15360, -1792,   7,  -8 );
-       STEP(   8534,  -341,   3,  -4 );
-       STEP(   9036, -1144,   3,  -4 );
+#      define  STEP(A, B, MAC, MIC)    \
+               temp = GSM_MULT (A, *LAR) ;     \
+               temp = GSM_ADD (temp, B) ;      \
+               temp = GSM_ADD (temp, 256) ;    \
+               temp = SASR_W (temp, 9) ;       \
+               *LAR = temp > MAC ? MAC - MIC : (temp < MIC ? 0 : temp - MIC) ; \
+               LAR++ ;
+
+       STEP (20480, 0, 31, -32) ;
+       STEP (20480, 0, 31, -32) ;
+       STEP (20480, 2048, 15, -16) ;
+       STEP (20480, -2560, 15, -16) ;
+
+       STEP (13964, 94, 7, -8) ;
+       STEP (15360, -1792, 7, -8) ;
+       STEP (8534, -341, 3, -4) ;
+       STEP (9036, -1144, 3, -4) ;
 
 #      undef   STEP
 }
 
 void Gsm_LPC_Analysis (
        struct gsm_state *S,
-       word             * s,           /* 0..159 signals       IN/OUT  */
-        word            * LARc)        /* 0..7   LARc's        OUT     */
+       int16_t                 * s,    /* 0..159 signals       IN/OUT  */
+       int16_t                 *LARc)  /* 0..7   LARc's        OUT     */
 {
-       longword        L_ACF[9];
+       int32_t L_ACF [9] ;
 
-#if defined(USE_FLOAT_MUL) && defined(FAST)
-       if (S->fast) Fast_Autocorrelation (s,     L_ACF );
+#if defined (USE_FLOAT_MUL) && defined (FAST)
+       if (S->fast)
+               Fast_Autocorrelation (s, L_ACF) ;
        else
 #endif
-       Autocorrelation                   (s,     L_ACF );
-       Reflection_coefficients           (L_ACF, LARc  );
-       Transformation_to_Log_Area_Ratios (LARc);
-       Quantization_and_coding           (LARc);
+               Autocorrelation (s,     L_ACF   ) ;
+       Reflection_coefficients (L_ACF, LARc    ) ;
+       Transformation_to_Log_Area_Ratios (LARc) ;
+       Quantization_and_coding (LARc) ;
 }
index 723e226..82f4fe2 100644 (file)
@@ -10,7 +10,7 @@
 #include "gsm610_priv.h"
 
 /*     4.2.0 .. 4.2.3  PREPROCESSING SECTION
- *  
+ *
  *     After A-law to linear conversion (or directly from the
  *     Ato D converter) the following scaling is assumed for
  *     input to the RPE-LTP algorithm:
  *     Where S is the sign bit, v a valid bit, and * a "don't care" bit.
  *     The original signal is called sop[..]
  *
- *      out:   0.1................... 12 
+ *      out:   0.1................... 12
  *          S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
  */
 
 
 void Gsm_Preprocess (
        struct gsm_state * S,
-       word             * s,
-       word             * so )         /* [0..159]     IN/OUT  */
+       int16_t         * s,
+       int16_t         * so)           /* [0..159]     IN/OUT  */
 {
 
-       word       z1 = S->z1;
-       longword L_z2 = S->L_z2;
-       word       mp = S->mp;
+       int16_t         z1 = S->z1 ;
+       int32_t         L_z2 = S->L_z2 ;
+       int16_t         mp = S->mp ;
 
-       word            s1;
-       longword      L_s2;
+       int16_t         s1 ;
+       int32_t L_s2 ;
 
-       longword      L_temp;
+       int32_t L_temp ;
 
-       word            msp, lsp;
-       word            SO;
+       int16_t         msp, lsp ;
+       int16_t         SO ;
 
-       register int            k = 160;
+       register int            k = 160 ;
 
-       while (k--) {
+       while (k--)
+       {
 
-       /*  4.2.1   Downscaling of the input signal
-        */
-               SO = SASR_W( *s, 3 ) << 2;
-               s++;
+               /*  4.2.1   Downscaling of the input signal */
+               SO = arith_shift_left (SASR_W (*s, 3), 2) ;
+               s++ ;
 
-               assert (SO >= -0x4000); /* downscaled by     */
-               assert (SO <=  0x3FFC); /* previous routine. */
+               assert (SO >= -0x4000) ;        /* downscaled by     */
+               assert (SO <= 0x3FFC) ;         /* previous routine. */
 
 
-       /*  4.2.2   Offset compensation
-        * 
-        *  This part implements a high-pass filter and requires extended
-        *  arithmetic precision for the recursive part of this filter.
-        *  The input of this procedure is the array so[0...159] and the
-        *  output the array sof[ 0...159 ].
-        */
-               /*   Compute the non-recursive part
+               /*  4.2.2   Offset compensation
+                *
+                *  This part implements a high-pass filter and requires extended
+                *  arithmetic precision for the recursive part of this filter.
+                *  The input of this procedure is the array so[0...159] and the
+                *  output the array sof[ 0...159 ].
                 */
 
-               s1 = SO - z1;                   /* s1 = gsm_sub( *so, z1 ); */
-               z1 = SO;
+               /*   Compute the non-recursive part */
 
-               assert(s1 != MIN_WORD);
+               s1 = SO - z1 ;                  /* s1 = gsm_sub (*so, z1) ; */
+               z1 = SO ;
 
-               /*   Compute the recursive part
-                */
-               L_s2 = s1;
-               L_s2 <<= 15;
+               assert (s1 != MIN_WORD) ;
 
-               /*   Execution of a 31 bv 16 bits multiplication
-                */
+               /*   Compute the recursive part */
+               L_s2 = s1 ;
+               L_s2 = arith_shift_left (L_s2, 15) ;
 
-               msp = SASR_L( L_z2, 15 );
-               lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
+               /*   Execution of a 31 bv 16 bits multiplication */
 
-               L_s2  += GSM_MULT_R( lsp, 32735 );
-               L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
-               L_z2   = GSM_L_ADD( L_temp, L_s2 );
+               msp = SASR_L (L_z2, 15) ;
+               lsp = L_z2 - arith_shift_left ((int32_t) msp, 15) ; /* gsm_L_sub (L_z2,(msp<<15)) ; */
 
-               /*    Compute sof[k] with rounding
-                */
-               L_temp = GSM_L_ADD( L_z2, 16384 );
+               L_s2 += GSM_MULT_R (lsp, 32735) ;
+               L_temp = (int32_t) msp * 32735 ; /* GSM_L_MULT (msp,32735) >> 1 ;*/
+               L_z2 = GSM_L_ADD (L_temp, L_s2) ;
+
+               /*    Compute sof[k] with rounding */
+               L_temp = GSM_L_ADD (L_z2, 16384) ;
 
-       /*   4.2.3  Preemphasis
-        */
+               /*   4.2.3  Preemphasis */
 
-               msp   = GSM_MULT_R( mp, -28180 );
-               mp    = SASR_L( L_temp, 15 );
-               *so++ = GSM_ADD( mp, msp );
-       }
+               msp     = GSM_MULT_R (mp, -28180) ;
+               mp      = SASR_L (L_temp, 15) ;
+               *so++ = GSM_ADD (mp, msp) ;
+               }
 
-       S->z1   = z1;
-       S->L_z2 = L_z2;
-       S->mp   = mp;
+       S->z1   = z1 ;
+       S->L_z2 = L_z2 ;
+       S->mp   = mp ;
 }
index d8f931e..4514cab 100644 (file)
 /* 4.2.13 */
 
 static void Weighting_filter (
-       register word   * e,            /* signal [-5..0.39.44] IN  */
-       word            * x             /* signal [0..39]       OUT */
+       register int16_t        * e,            /* signal [-5..0.39.44] IN  */
+       int16_t         * x             /* signal [0..39]       OUT */
 )
 /*
  *  The coefficients of the weighting filter are stored in a table
  *  (see table 4.4).  The following scaling is used:
  *
- *     H[0..10] = integer( real_H[ 0..10] * 8192 ); 
+ *     H[0..10] = integer(real_H [0..10] * 8192) ;
  */
 {
-       /* word                 wt[ 50 ]; */
+       /* int16_t                      wt [50] ; */
 
-       register longword       L_result;
+       register int32_t        L_result ;
        register int            k /* , i */ ;
 
        /*  Initialization of a temporary working array wt[0...49]
         */
 
-       /* for (k =  0; k <=  4; k++) wt[k] = 0;
-        * for (k =  5; k <= 44; k++) wt[k] = *e++;
-        * for (k = 45; k <= 49; k++) wt[k] = 0;
+       /* for (k =  0 ; k <=  4 ; k++) wt[k] = 0 ;
+        * for (k =  5 ; k <= 44 ; k++) wt[k] = *e++;
+        * for (k = 45 ; k <= 49 ; k++) wt[k] = 0 ;
         *
         *  (e[-5..-1] and e[40..44] are allocated by the caller,
         *  are initially zero and are not written anywhere.)
         */
-       e -= 5;
+       e -= 5 ;
 
        /*  Compute the signal x[0..39]
-        */ 
-       for (k = 0; k <= 39; k++) {
-
-               L_result = 8192 >> 1;
+        */
+       for (k = 0 ; k <= 39 ; k++)
+       {       L_result = 8192 >> 1 ;
 
-               /* for (i = 0; i <= 10; i++) {
-                *      L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );
-                *      L_result = GSM_L_ADD( L_result, L_temp );
+               /* for (i = 0 ; i <= 10 ; i++) {
+                *      L_temp   = GSM_L_MULT(wt[k+i], gsm_H[i]) ;
+                *      L_result = GSM_L_ADD(L_result, L_temp) ;
                 * }
                 */
 
 #undef STEP
-#define        STEP( i, H )    (e[ k + i ] * (longword)H)
+#define        STEP(i, H)      (e [k + i] * (int32_t) H)
 
                /*  Every one of these multiplications is done twice --
-                *  but I don't see an elegant way to optimize this. 
+                *  but I don't see an elegant way to optimize this.
                 *  Do you?
                 */
 
 #ifdef STUPID_COMPILER
-               L_result += STEP(       0,      -134 ) ;
-               L_result += STEP(       1,      -374 )  ;
-                      /* + STEP(       2,      0    )  */
-               L_result += STEP(       3,      2054 ) ;
-               L_result += STEP(       4,      5741 ) ;
-               L_result += STEP(       5,      8192 ) ;
-               L_result += STEP(       6,      5741 ) ;
-               L_result += STEP(       7,      2054 ) ;
-                      /* + STEP(       8,      0    )  */
-               L_result += STEP(       9,      -374 ) ;
-               L_result += STEP(       10,     -134 ) ;
+               L_result += STEP (0, -134) ;
+               L_result += STEP (1, -374) ;
+                                       /* + STEP (2, 0)  */
+               L_result += STEP (3, 2054) ;
+               L_result += STEP (4, 5741) ;
+               L_result += STEP (5, 8192) ;
+               L_result += STEP (6, 5741) ;
+               L_result += STEP (7, 2054) ;
+                                       /* + STEP (8, 0)  */
+               L_result += STEP (9, -374) ;
+               L_result += STEP (10, -134) ;
 #else
-               L_result +=
-                 STEP( 0,      -134 ) 
-               + STEP( 1,      -374 ) 
-            /* + STEP( 2,      0    )  */
-               + STEP( 3,      2054 ) 
-               + STEP( 4,      5741 ) 
-               + STEP( 5,      8192 ) 
-               + STEP( 6,      5741 ) 
-               + STEP( 7,      2054 ) 
-            /* + STEP( 8,      0    )  */
-               + STEP( 9,      -374 ) 
-               + STEP(10,      -134 )
-               ;
+               L_result += STEP (0, -134)
+                               + STEP (1, -374)
+                                       /* + STEP (2, 0)  */
+                               + STEP (3, 2054)
+                               + STEP (4, 5741)
+                               + STEP (5, 8192)
+                               + STEP (6, 5741)
+                               + STEP (7, 2054)
+                                       /* + STEP (8, 0)  */
+                               + STEP (9, -374)
+                               + STEP (10, -134) ;
 #endif
 
-               /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
-                * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+               /* L_result = GSM_L_ADD(L_result, L_result) ; (* scaling(x2) *)
+                * L_result = GSM_L_ADD(L_result, L_result) ; (* scaling(x4) *)
                 *
-                * x[k] = SASR( L_result, 16 );
+                * x[k] = SASR(L_result, 16) ;
                 */
 
                /* 2 adds vs. >>16 => 14, minus one shift to compensate for
                 * those we lost when replacing L_MULT by '*'.
                 */
 
-               L_result = SASR_L( L_result, 13 );
-               x[k] =  (  L_result < MIN_WORD ? MIN_WORD
-                       : (L_result > MAX_WORD ? MAX_WORD : L_result ));
+               L_result = SASR_L (L_result, 13) ;
+               x [k] = (L_result < MIN_WORD ? MIN_WORD
+                       : (L_result > MAX_WORD ? MAX_WORD : L_result)) ;
        }
 }
 
 /* 4.2.14 */
 
 static void RPE_grid_selection (
-       word            * x,            /* [0..39]              IN  */ 
-       word            * xM,           /* [0..12]              OUT */
-       word            * Mc_out        /*                      OUT */
+       int16_t         * x,            /* [0..39]              IN  */
+       int16_t         * xM,           /* [0..12]              OUT */
+       int16_t         * Mc_out        /*                      OUT */
 )
 /*
  *  The signal x[0..39] is used to select the RPE grid which is
  *  represented by Mc.
  */
 {
-       /* register word        temp1;  */
-       register int            /* m, */  i;
-       register longword       L_result, L_temp;
-       longword                EM;     /* xxx should be L_EM? */
-       word                    Mc;
+       register int            i ;
+       register int32_t        L_result, L_temp ;
+       int32_t         EM ;    /* xxx should be L_EM? */
+       int16_t                 Mc ;
 
-       longword                L_common_0_3;
+       int32_t         L_common_0_3 ;
 
-       EM = 0;
-       Mc = 0;
+       EM = 0 ;
+       Mc = 0 ;
 
-       /* for (m = 0; m <= 3; m++) {
-        *      L_result = 0;
+       /* for (m = 0 ; m <= 3 ; m++) {
+        *      L_result = 0 ;
         *
         *
-        *      for (i = 0; i <= 12; i++) {
+        *      for (i = 0 ; i <= 12 ; i++) {
         *
-        *              temp1    = SASR_W( x[m + 3*i], 2 );
+        *              temp1   = SASR_W (x[m + 3*i], 2) ;
         *
-        *              assert(temp1 != MIN_WORD);
+        *              assert (temp1 != MIN_WORD) ;
         *
-        *              L_temp   = GSM_L_MULT( temp1, temp1 );
-        *              L_result = GSM_L_ADD( L_temp, L_result );
+        *              L_temp   = GSM_L_MULT(temp1, temp1) ;
+        *              L_result = GSM_L_ADD(L_temp, L_result) ;
         *      }
-        * 
+        *
         *      if (L_result > EM) {
-        *              Mc = m;
-        *              EM = L_result;
+        *              Mc = m ;
+        *              EM = L_result ;
         *      }
         * }
         */
 
 #undef STEP
-#define        STEP( m, i )            L_temp = SASR_W( x[m + 3 * i], 2 );     \
-                               L_result += L_temp * L_temp;
+#define        STEP(m, i)      L_temp = SASR_W (x [m + 3 * i], 2) ;    \
+                                       L_result += L_temp * L_temp ;
 
        /* common part of 0 and 3 */
 
-       L_result = 0;
-       STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
-       STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
-       STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
-       L_common_0_3 = L_result;
+       L_result = 0 ;
+       STEP (0, 1) ; STEP (0, 2) ; STEP (0, 3) ; STEP (0, 4) ;
+       STEP (0, 5) ; STEP (0, 6) ; STEP (0, 7) ; STEP (0, 8) ;
+       STEP (0, 9) ; STEP (0, 10) ; STEP (0, 11) ; STEP (0, 12) ;
+       L_common_0_3 = L_result ;
 
        /* i = 0 */
 
-       STEP( 0, 0 );
-       L_result <<= 1; /* implicit in L_MULT */
-       EM = L_result;
+       STEP (0, 0) ;
+       L_result <<= 1 ;        /* implicit in L_MULT */
+       EM = L_result ;
 
        /* i = 1 */
 
-       L_result = 0;
-       STEP( 1, 0 );
-       STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
-       STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
-       STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
-       L_result <<= 1;
-       if (L_result > EM) {
-               Mc = 1;
-               EM = L_result;
-       }
+       L_result = 0 ;
+       STEP (1, 0) ;
+       STEP (1, 1) ; STEP (1, 2) ; STEP (1, 3) ; STEP (1, 4) ;
+       STEP (1, 5) ; STEP (1, 6) ; STEP (1, 7) ; STEP (1, 8) ;
+       STEP (1, 9) ; STEP (1, 10) ; STEP (1, 11) ; STEP (1, 12) ;
+       L_result <<= 1 ;
+       if (L_result > EM)
+       {       Mc = 1 ;
+               EM = L_result ;
+               }
 
        /* i = 2 */
 
-       L_result = 0;
-       STEP( 2, 0 );
-       STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
-       STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
-       STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
-       L_result <<= 1;
-       if (L_result > EM) {
-               Mc = 2;
-               EM = L_result;
-       }
+       L_result = 0 ;
+       STEP (2, 0) ;
+       STEP (2, 1) ; STEP (2, 2) ; STEP (2, 3) ; STEP (2, 4) ;
+       STEP (2, 5) ; STEP (2, 6) ; STEP (2, 7) ; STEP (2, 8) ;
+       STEP (2, 9) ; STEP (2, 10) ; STEP (2, 11) ; STEP (2, 12) ;
+       L_result <<= 1 ;
+       if (L_result > EM)
+       {       Mc = 2 ;
+               EM = L_result ;
+               }
 
        /* i = 3 */
 
-       L_result = L_common_0_3;
-       STEP( 3, 12 );
-       L_result <<= 1;
-       if (L_result > EM) {
-               Mc = 3;
-               EM = L_result;
-       }
-
-       /**/
+       L_result = L_common_0_3 ;
+       STEP (3, 12) ;
+       L_result <<= 1 ;
+       if (L_result > EM)
+       {       Mc = 3 ;
+               EM = L_result ;
+               }
 
-       /*  Down-sampling by a factor 3 to get the selected xM[0..12]
+       /*  Down-sampling by a factor 3 to get the selected xM [0..12]
         *  RPE sequence.
         */
-       for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
-       *Mc_out = Mc;
+       for (i = 0 ; i <= 12 ; i ++) xM [i] = x [Mc + 3 * i] ;
+       *Mc_out = Mc ;
 }
 
 /* 4.12.15 */
 
 static void APCM_quantization_xmaxc_to_exp_mant (
-       word            xmaxc,          /* IN   */
-       word            * expon_out,    /* OUT  */
-       word            * mant_out )    /* OUT  */
+       int16_t         xmaxc,          /* IN   */
+       int16_t         * expon_out,    /* OUT  */
+       int16_t         * mant_out)     /* OUT  */
 {
-       word    expon, mant;
+       int16_t expon, mant ;
 
        /* Compute expononent and mantissa of the decoded version of xmaxc
         */
 
-       expon = 0;
-       if (xmaxc > 15) expon = SASR_W(xmaxc, 3) - 1;
-       mant = xmaxc - (expon << 3);
+       expon = 0 ;
+       if (xmaxc > 15) expon = SASR_W (xmaxc, 3) - 1 ;
+       mant = xmaxc - (expon << 3) ;
 
-       if (mant == 0) {
-               expon  = -4;
-               mant = 7;
-       }
-       else {
-               while (mant <= 7) {
-                       mant = mant << 1 | 1;
-                       expon--;
+       if (mant == 0)
+       {       expon = -4 ;
+               mant = 7 ;
+               }
+       else
+       {       while (mant <= 7)
+               {       mant = mant << 1 | 1 ;
+                       expon-- ;
+                       }
+               mant -= 8 ;
                }
-               mant -= 8;
-       }
 
-       assert( expon  >= -4 && expon <= 6 );
-       assert( mant >= 0 && mant <= 7 );
+       assert (expon >= -4 && expon <= 6) ;
+       assert (mant >= 0 && mant <= 7) ;
 
-       *expon_out  = expon;
-       *mant_out = mant;
+       *expon_out = expon ;
+       *mant_out = mant ;
 }
 
 static void APCM_quantization (
-       word            * xM,           /* [0..12]              IN      */
-       word            * xMc,          /* [0..12]              OUT     */
-       word            * mant_out,     /*                      OUT     */
-       word            * expon_out,    /*                      OUT     */
-       word            * xmaxc_out     /*                      OUT     */
+       int16_t         * xM,           /* [0..12]              IN      */
+       int16_t         * xMc,          /* [0..12]              OUT     */
+       int16_t         * mant_out,     /*                      OUT     */
+       int16_t         * expon_out,    /*                      OUT     */
+       int16_t         * xmaxc_out     /*                      OUT     */
 )
 {
-       int     i, itest;
+       int     i, itest ;
 
-       word    xmax, xmaxc, temp, temp1, temp2;
-       word    expon, mant;
+       int16_t xmax, xmaxc, temp, temp1, temp2 ;
+       int16_t expon, mant ;
 
 
-       /*  Find the maximum absolute value xmax of xM[0..12].
+       /*  Find the maximum absolute value xmax of xM [0..12].
         */
 
-       xmax = 0;
-       for (i = 0; i <= 12; i++) {
-               temp = xM[i];
-               temp = GSM_ABS(temp);
-               if (temp > xmax) xmax = temp;
-       }
+       xmax = 0 ;
+       for (i = 0 ; i <= 12 ; i++)
+       {       temp = xM [i] ;
+               temp = GSM_ABS (temp) ;
+               if (temp > xmax) xmax = temp ;
+               }
 
        /*  Qantizing and coding of xmax to get xmaxc.
         */
 
-       expon   = 0;
-       temp  = SASR_W( xmax, 9 );
-       itest = 0;
+       expon = 0 ;
+       temp = SASR_W (xmax, 9) ;
+       itest = 0 ;
 
-       for (i = 0; i <= 5; i++) {
+       for (i = 0 ; i <= 5 ; i++)
+       {       itest |= (temp <= 0) ;
+               temp = SASR_W (temp, 1) ;
 
-               itest |= (temp <= 0);
-               temp = SASR_W( temp, 1 );
-
-               assert(expon <= 5);
-               if (itest == 0) expon++;                /* expon = add (expon, 1) */
-       }
+               assert (expon <= 5) ;
+               if (itest == 0) expon++ ;               /* expon = add (expon, 1) */
+               }
 
-       assert(expon <= 6 && expon >= 0);
-       temp = expon + 5;
+       assert (expon <= 6 && expon >= 0) ;
+       temp = expon + 5 ;
 
-       assert(temp <= 11 && temp >= 0);
-       xmaxc = gsm_add( SASR_W(xmax, temp), (word) (expon << 3) );
+       assert (temp <= 11 && temp >= 0) ;
+       xmaxc = gsm_add (SASR_W (xmax, temp), (int16_t) (expon << 3)) ;
 
-       /*   Quantizing and coding of the xM[0..12] RPE sequence
-        *   to get the xMc[0..12]
+       /*   Quantizing and coding of the xM [0..12] RPE sequence
+        *   to get the xMc [0..12]
         */
 
-       APCM_quantization_xmaxc_to_exp_mant( xmaxc, &expon, &mant );
+       APCM_quantization_xmaxc_to_exp_mant (xmaxc, &expon, &mant) ;
 
        /*  This computation uses the fact that the decoded version of xmaxc
         *  can be calculated by using the expononent and the mantissa part of
         *  xmaxc (logarithmic table).
         *  So, this method avoids any division and uses only a scaling
-        *  of the RPE samples by a function of the expononent.  A direct 
+        *  of the RPE samples by a function of the expononent.  A direct
         *  multiplication by the inverse of the mantissa (NRFAC[0..7]
-        *  found in table 4.5) gives the 3 bit coded version xMc[0..12]
+        *  found in table 4.5) gives the 3 bit coded version xMc [0..12]
         *  of the RPE samples.
         */
 
 
-       /* Direct computation of xMc[0..12] using table 4.5
+       /* Direct computation of xMc [0..12] using table 4.5
         */
 
-       assert( expon <= 4096 && expon >= -4096);
-       assert( mant >= 0 && mant <= 7 ); 
-
-       temp1 = 6 - expon;              /* normalization by the expononent */
-       temp2 = gsm_NRFAC[ mant ];      /* inverse mantissa              */
+       assert (expon <= 4096 && expon >= -4096) ;
+       assert (mant >= 0 && mant <= 7) ;
 
-       for (i = 0; i <= 12; i++) {
+       temp1 = 6 - expon ;                     /* normalization by the expononent */
+       temp2 = gsm_NRFAC [mant] ;      /* inverse mantissa              */
 
-               assert(temp1 >= 0 && temp1 < 16);
+       for (i = 0 ; i <= 12 ; i++)
+       {       assert (temp1 >= 0 && temp1 < 16) ;
 
-               temp = xM[i] << temp1;
-               temp = GSM_MULT( temp, temp2 );
-               temp = SASR_W(temp, 12);
-               xMc[i] = temp + 4;              /* see note below */
+               temp = arith_shift_left (xM [i], temp1) ;
+               temp = GSM_MULT (temp, temp2) ;
+               temp = SASR_W (temp, 12) ;
+               xMc [i] = temp + 4 ;            /* see note below */
        }
 
-       /*  NOTE: This equation is used to make all the xMc[i] positive.
+       /*  NOTE: This equation is used to make all the xMc [i] positive.
         */
 
-       *mant_out  = mant;
-       *expon_out   = expon;
-       *xmaxc_out = xmaxc;
+       *mant_out = mant ;
+       *expon_out = expon ;
+       *xmaxc_out = xmaxc ;
 }
 
 /* 4.2.16 */
 
 static void APCM_inverse_quantization (
-       register word   * xMc,  /* [0..12]                      IN      */
-       word            mant,
-       word            expon,
-       register word   * xMp)  /* [0..12]                      OUT     */
-/* 
- *  This part is for decoding the RPE sequence of coded xMc[0..12]
+       register int16_t        * xMc,  /* [0..12]                      IN      */
+       int16_t         mant,
+       int16_t         expon,
+       register int16_t        * xMp)  /* [0..12]                      OUT     */
+/*
+ *  This part is for decoding the RPE sequence of coded xMc [0..12]
  *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get
  *  the mantissa of xmaxc (FAC[0..7]).
  */
 {
-       int     i;
-       word    temp, temp1, temp2, temp3;
+       int     i ;
+       int16_t temp, temp1, temp2, temp3 ;
 
-       assert( mant >= 0 && mant <= 7 ); 
+       assert (mant >= 0 && mant <= 7) ;
 
-       temp1 = gsm_FAC[ mant ];        /* see 4.2-15 for mant */
-       temp2 = gsm_sub( 6, expon );    /* see 4.2-15 for exp  */
-       temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+       temp1 = gsm_FAC [mant] ;        /* see 4.2-15 for mant */
+       temp2 = gsm_sub (6, expon) ;    /* see 4.2-15 for exp  */
+       temp3 = gsm_asl (1, gsm_sub (temp2, 1)) ;
 
-       for (i = 13; i--;) {
+       for (i = 13 ; i-- ;)
+       {       assert (*xMc <= 7 && *xMc >= 0) ;       /* 3 bit unsigned */
 
-               assert( *xMc <= 7 && *xMc >= 0 );       /* 3 bit unsigned */
+               /* temp = gsm_sub (*xMc++ << 1, 7) ; */
+               temp = (*xMc++ << 1) - 7 ;                      /* restore sign   */
+               assert (temp <= 7 && temp >= -7) ;      /* 4 bit signed   */
 
-               /* temp = gsm_sub( *xMc++ << 1, 7 ); */
-               temp = (*xMc++ << 1) - 7;               /* restore sign   */
-               assert( temp <= 7 && temp >= -7 );      /* 4 bit signed   */
-
-               temp <<= 12;                            /* 16 bit signed  */
-               temp = GSM_MULT_R( temp1, temp );
-               temp = GSM_ADD( temp, temp3 );
-               *xMp++ = gsm_asr( temp, temp2 );
+               temp = arith_shift_left (temp, 12) ;    /* 16 bit signed  */
+               temp = GSM_MULT_R (temp1, temp) ;
+               temp = GSM_ADD (temp, temp3) ;
+               *xMp++ = gsm_asr (temp, temp2) ;
        }
 }
 
 /* 4.2.17 */
 
 static void RPE_grid_positioning (
-       word            Mc,             /* grid position        IN      */
-       register word   * xMp,          /* [0..12]              IN      */
-       register word   * ep            /* [0..39]              OUT     */
+       int16_t         Mc,             /* grid position        IN      */
+       register int16_t        * xMp,          /* [0..12]              IN      */
+       register int16_t        * ep            /* [0..39]              OUT     */
 )
 /*
  *  This procedure computes the reconstructed long term residual signal
@@ -390,28 +381,19 @@ static void RPE_grid_positioning (
  *  values.
  */
 {
-       int     i = 13;
-
-       assert(0 <= Mc && Mc <= 3);
-
-        switch (Mc) {
-                case 3: *ep++ = 0;
-                case 2:  do {
-                                *ep++ = 0;
-                case 1:         *ep++ = 0;
-                case 0:         *ep++ = *xMp++;
-                         } while (--i);
-        }
-        while (++Mc < 4) *ep++ = 0;
-
-       /*
-
-       int i, k;
-       for (k = 0; k <= 39; k++) ep[k] = 0;
-       for (i = 0; i <= 12; i++) {
-               ep[ Mc + (3*i) ] = xMp[i];
+       int     i = 13 ;
+
+       assert (0 <= Mc && Mc <= 3) ;
+
+       switch (Mc)
+       {       case 3: *ep++ = 0 ;
+               case 2: do
+                               {       *ep++ = 0 ;
+               case 1:         *ep++ = 0 ;
+               case 0:         *ep++ = *xMp++ ;
+                                       } while (--i) ;
        }
-       */
+       while (++Mc < 4) *ep++ = 0 ;
 }
 
 /* 4.2.18 */
@@ -419,62 +401,57 @@ static void RPE_grid_positioning (
 /*  This procedure adds the reconstructed long term residual signal
  *  ep[0..39] to the estimated signal dpp[0..39] from the long term
  *  analysis filter to compute the reconstructed short term residual
- *  signal dp[-40..-1]; also the reconstructed short term residual
+ *  signal dp[-40..-1] ; also the reconstructed short term residual
  *  array dp[-120..-41] is updated.
  */
 
 #if 0  /* Has been inlined in code.c */
 void Gsm_Update_of_reconstructed_short_time_residual_signal (
-       word    * dpp,          /* [0...39]     IN      */
-       word    * ep,           /* [0...39]     IN      */
-       word    * dp)           /* [-120...-1]  IN/OUT  */
+       int16_t * dpp,          /* [0...39]     IN      */
+       int16_t * ep,           /* [0...39]     IN      */
+       int16_t * dp)           /* [-120...-1]  IN/OUT  */
 {
-       int             k;
+       int             k ;
 
-       for (k = 0; k <= 79; k++) 
-               dp[ -120 + k ] = dp[ -80 + k ];
+       for (k = 0 ; k <= 79 ; k++)
+               dp [-120 + k] = dp [-80 + k] ;
 
-       for (k = 0; k <= 39; k++)
-               dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+       for (k = 0 ; k <= 39 ; k++)
+               dp [-40 + k] = gsm_add (ep [k], dpp [k]) ;
 }
 #endif /* Has been inlined in code.c */
 
 void Gsm_RPE_Encoding (
-       /*-struct gsm_state * S,-*/
-
-       word    * e,            /* -5..-1][0..39][40..44        IN/OUT  */
-       word    * xmaxc,        /*                              OUT */
-       word    * Mc,           /*                              OUT */
-       word    * xMc)          /* [0..12]                      OUT */
+       int16_t * e,            /* -5..-1][0..39][40..44        IN/OUT  */
+       int16_t * xmaxc,        /*                              OUT */
+       int16_t * Mc,           /*                              OUT */
+       int16_t * xMc)          /* [0..12]                      OUT */
 {
-       word    x[40];
-       word    xM[13], xMp[13];
-       word    mant, expon;
+       int16_t x [40] ;
+       int16_t xM [13], xMp [13] ;
+       int16_t mant, expon ;
 
-       Weighting_filter(e, x);
-       RPE_grid_selection(x, xM, Mc);
+       Weighting_filter (e, x) ;
+       RPE_grid_selection (x, xM, Mc) ;
 
-       APCM_quantization(      xM, xMc, &mant, &expon, xmaxc);
-       APCM_inverse_quantization(  xMc,  mant,  expon, xMp);
+       APCM_quantization (xM, xMc, &mant, &expon, xmaxc) ;
+       APCM_inverse_quantization (xMc, mant, expon, xMp) ;
 
-       RPE_grid_positioning( *Mc, xMp, e );
+       RPE_grid_positioning (*Mc, xMp, e) ;
 
 }
 
 void Gsm_RPE_Decoding (
-       /*-struct gsm_state     * S,-*/
-
-       word            xmaxcr,
-       word            Mcr,
-       word            * xMcr,  /* [0..12], 3 bits             IN      */
-       word            * erp    /* [0..39]                     OUT     */
+       int16_t                 xmaxcr,
+       int16_t         Mcr,
+       int16_t         * xMcr, /* [0..12], 3 bits              IN      */
+       int16_t         * erp   /* [0..39]                      OUT     */
 )
 {
-       word    expon, mant;
-       word    xMp[ 13 ];
-
-       APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &expon, &mant );
-       APCM_inverse_quantization( xMcr, mant, expon, xMp );
-       RPE_grid_positioning( Mcr, xMp, erp );
+       int16_t expon, mant ;
+       int16_t xMp [13] ;
 
+       APCM_quantization_xmaxc_to_exp_mant (xmaxcr, &expon, &mant) ;
+       APCM_inverse_quantization (xMcr, mant, expon, xMp) ;
+       RPE_grid_positioning (Mcr, xMp, erp) ;
 }
index 9048563..e8cdac3 100644 (file)
 /* 4.2.8 */
 
 static void Decoding_of_the_coded_Log_Area_Ratios (
-       word    * LARc,         /* coded log area ratio [0..7]  IN      */
-       word    * LARpp)        /* out: decoded ..                      */
+       int16_t         * LARc,         /* coded log area ratio [0..7]  IN      */
+       int16_t * LARpp)        /* out: decoded ..                      */
 {
-       register word   temp1 /* , temp2 */;
+       register int16_t        temp1 ;
 
        /*  This procedure requires for efficient implementation
         *  two tables.
         *
-        *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+        *  INVA[1..8] = integer((32768 * 8) / real_A[1..8])
         *  MIC[1..8]  = minimum value of the LARc[1..8]
         */
 
@@ -33,33 +33,33 @@ static void Decoding_of_the_coded_Log_Area_Ratios (
 
        /*      for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
         *
-        *              temp1  = GSM_ADD( *LARc, *MIC ) << 10;
+        *              temp1  = GSM_ADD (*LARc, *MIC) << 10;
         *              temp2  = *B << 1;
-        *              temp1  = GSM_SUB( temp1, temp2 );
+        *              temp1  = GSM_SUB(temp1, temp2) ;
         *
-        *              assert(*INVA != MIN_WORD);
+        *              assert(*INVA != MIN_WORD) ;
         *
-        *              temp1  = GSM_MULT_R( *INVA, temp1 );
-        *              *LARpp = GSM_ADD( temp1, temp1 );
+        *              temp1  = GSM_MULT_R (*INVA, temp1) ;
+        *              *LARpp = GSM_ADD (temp1, temp1) ;
         *      }
         */
 
 #undef STEP
-#define        STEP( B, MIC, INVA )    \
-               temp1    = GSM_ADD( *LARc++, MIC ) << 10;       \
-               temp1    = GSM_SUB( temp1, B << 1 );            \
-               temp1    = GSM_MULT_R( INVA, temp1 );           \
-               *LARpp++ = GSM_ADD( temp1, temp1 );
-
-       STEP(      0,  -32,  13107 );
-       STEP(      0,  -32,  13107 );
-       STEP(   2048,  -16,  13107 );
-       STEP(  -2560,  -16,  13107 );
-
-       STEP(     94,   -8,  19223 );
-       STEP(  -1792,   -8,  17476 );
-       STEP(   -341,   -4,  31454 );
-       STEP(  -1144,   -4,  29708 );
+#define        STEP(B, MIC, INVA)      \
+               temp1   = arith_shift_left (GSM_ADD (*LARc++, MIC), 10) ;       \
+               temp1   = GSM_SUB (temp1, B * 2) ;                      \
+               temp1   = GSM_MULT_R (INVA, temp1) ;            \
+               *LARpp++ = GSM_ADD (temp1, temp1) ;
+
+       STEP (0, -32, 13107) ;
+       STEP (0, -32, 13107) ;
+       STEP (2048, -16, 13107) ;
+       STEP (-2560, -16, 13107) ;
+
+       STEP (94, -8, 19223) ;
+       STEP (-1792, -8, 17476) ;
+       STEP (-341, -4, 31454) ;
+       STEP (-1144, -4, 29708) ;
 
        /* NOTE: the addition of *MIC is used to restore
         *       the sign of *LARc.
@@ -67,7 +67,7 @@ static void Decoding_of_the_coded_Log_Area_Ratios (
 }
 
 /* 4.2.9 */
-/* Computation of the quantized reflection coefficients 
+/* Computation of the quantized reflection coefficients
  */
 
 /* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]
@@ -83,88 +83,87 @@ static void Decoding_of_the_coded_Log_Area_Ratios (
  */
 
 static void Coefficients_0_12 (
-       register word * LARpp_j_1,
-       register word * LARpp_j,
-       register word * LARp)
+       register int16_t * LARpp_j_1,
+       register int16_t * LARpp_j,
+       register int16_t * LARp)
 {
-       register int    i;
+       register int    i ;
 
-       for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
-               *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
-               *LARp = GSM_ADD( *LARp,  SASR_W( *LARpp_j_1, 1));
-       }
+       for (i = 1 ; i <= 8 ; i++, LARp++, LARpp_j_1++, LARpp_j++)
+       {       *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 2), SASR_W (*LARpp_j, 2)) ;
+               *LARp = GSM_ADD (*LARp, SASR_W (*LARpp_j_1, 1)) ;
+               }
 }
 
 static void Coefficients_13_26 (
-       register word * LARpp_j_1,
-       register word * LARpp_j,
-       register word * LARp)
+       register int16_t * LARpp_j_1,
+       register int16_t * LARpp_j,
+       register int16_t * LARp)
 {
-       register int i;
-       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
-               *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 1), SASR_W( *LARpp_j, 1 ));
-       }
+       register int i ;
+       for (i = 1 ; i <= 8 ; i++, LARpp_j_1++, LARpp_j++, LARp++)
+               *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 1), SASR_W (*LARpp_j, 1)) ;
 }
 
 static void Coefficients_27_39 (
-       register word * LARpp_j_1,
-       register word * LARpp_j,
-       register word * LARp)
+       register int16_t * LARpp_j_1,
+       register int16_t * LARpp_j,
+       register int16_t * LARp)
 {
-       register int i;
+       register int i ;
 
-       for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
-               *LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
-               *LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j, 1 ));
-       }
+       for (i = 1 ; i <= 8 ; i++, LARpp_j_1++, LARpp_j++, LARp++)
+       {       *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 2), SASR_W (*LARpp_j, 2)) ;
+               *LARp = GSM_ADD (*LARp, SASR_W (*LARpp_j, 1)) ;
+               }
 }
 
 
 static void Coefficients_40_159 (
-       register word * LARpp_j,
-       register word * LARp)
+       register int16_t * LARpp_j,
+       register int16_t * LARp)
 {
-       register int i;
+       register int i ;
 
-       for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
-               *LARp = *LARpp_j;
+       for (i = 1 ; i <= 8 ; i++, LARp++, LARpp_j++)
+               *LARp = *LARpp_j ;
 }
 
 /* 4.2.9.2 */
 
 static void LARp_to_rp (
-       register word * LARp)   /* [0..7] IN/OUT  */
+       register int16_t * LARp)        /* [0..7] IN/OUT  */
 /*
  *  The input of this procedure is the interpolated LARp[0..7] array.
  *  The reflection coefficients, rp[i], are used in the analysis
  *  filter and in the synthesis filter.
  */
 {
-       register int            i;
-       register word           temp;
+       register int            i ;
+       register int16_t                temp ;
 
-       for (i = 1; i <= 8; i++, LARp++) {
-
-               /* temp = GSM_ABS( *LARp );
+       for (i = 1 ; i <= 8 ; i++, LARp++)
+       {       /* temp = GSM_ABS(*LARp) ;
                 *
                 * if (temp < 11059) temp <<= 1;
                 * else if (temp < 20070) temp += 11059;
-                * else temp = GSM_ADD( temp >> 2, 26112 );
+                * else temp = GSM_ADD (temp >> 2, 26112) ;
                 *
                 * *LARp = *LARp < 0 ? -temp : temp;
                 */
 
-               if (*LARp < 0) {
-                       temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+               if (*LARp < 0)
+               {       temp = *LARp == MIN_WORD ? MAX_WORD : - (*LARp) ;
                        *LARp = - ((temp < 11059) ? temp << 1
                                : ((temp < 20070) ? temp + 11059
-                               :  GSM_ADD( (word) (temp >> 2), (word) 26112 )));
-               } else {
-                       temp  = *LARp;
-                       *LARp =    (temp < 11059) ? temp << 1
+                               : GSM_ADD ((int16_t) (temp >> 2), (int16_t) 26112))) ;
+                       }
+               else
+               {       temp = *LARp ;
+                       *LARp = (temp < 11059) ? temp << 1
                                : ((temp < 20070) ? temp + 11059
-                               :  GSM_ADD( (word) (temp >> 2), (word) 26112 ));
-               }
+                               : GSM_ADD ((int16_t) (temp >> 2), (int16_t) 26112)) ;
+                       }
        }
 }
 
@@ -172,9 +171,9 @@ static void LARp_to_rp (
 /* 4.2.10 */
 static void Short_term_analysis_filtering (
        struct gsm_state * S,
-       register word   * rp,   /* [0..7]       IN      */
+       register int16_t        * rp,   /* [0..7]       IN      */
        register int    k_n,    /*   k_end - k_start    */
-       register word   * s     /* [0..n-1]     IN/OUT  */
+       register int16_t        * s     /* [0..n-1]     IN/OUT  */
 )
 /*
  *  This procedure computes the short term residual signal d[..] to be fed
@@ -184,234 +183,230 @@ static void Short_term_analysis_filtering (
  *  coefficient), it is assumed that the computation begins with index
  *  k_start (for arrays d[..] and s[..]) and stops with index k_end
  *  (k_start and k_end are defined in 4.2.9.1).  This procedure also
- *  needs to keep the array u[0..7] in memory for each call.
+ *  needs to keep the array u [0..7] in memory for each call.
  */
 {
-       register word           * u = S->u;
-       register int            i;
-       register word           di, zzz, ui, sav, rpi;
-
-       for (; k_n--; s++) {
-
-               di = sav = *s;
+       register int16_t                * u = S->u ;
+       register int            i ;
+       register int16_t                di, zzz, ui, sav, rpi ;
 
-               for (i = 0; i < 8; i++) {               /* YYY */
+       for ( ; k_n-- ; s++)
+       {       di = sav = *s ;
 
-                       ui    = u[i];
-                       rpi   = rp[i];
-                       u[i]  = sav;
+               for (i = 0 ; i < 8 ; i++)
+               {       /* YYY */
+                       ui      = u [i] ;
+                       rpi     = rp [i] ;
+                       u [i] = sav ;
 
-                       zzz   = GSM_MULT_R(rpi, di);
-                       sav   = GSM_ADD(   ui,  zzz);
+                       zzz     = GSM_MULT_R (rpi, di) ;
+                       sav     = GSM_ADD (ui, zzz) ;
 
-                       zzz   = GSM_MULT_R(rpi, ui);
-                       di    = GSM_ADD(   di,  zzz );
+                       zzz     = GSM_MULT_R (rpi, ui) ;
+                       di      = GSM_ADD (di, zzz) ;
                }
 
-               *s = di;
+               *s = di ;
        }
 }
 
-#if defined(USE_FLOAT_MUL) && defined(FAST)
+#if defined (USE_FLOAT_MUL) && defined (FAST)
 
 static void Fast_Short_term_analysis_filtering (
        struct gsm_state * S,
-       register word   * rp,   /* [0..7]       IN      */
+       register int16_t        * rp,   /* [0..7]       IN      */
        register int    k_n,    /*   k_end - k_start    */
-       register word   * s     /* [0..n-1]     IN/OUT  */
+       register int16_t        * s     /* [0..n-1]     IN/OUT  */
 )
 {
-       register word           * u = S->u;
-       register int            i;
+       register int16_t                * u = S->u ;
+       register int            i ;
 
-       float     uf[8],
-                rpf[8];
+       float uf [8], rpf [8] ;
 
-       register float scalef = 3.0517578125e-5;
-       register float          sav, di, temp;
+       register float scalef = 3.0517578125e-5 ;
+       register float sav, di, temp ;
 
-       for (i = 0; i < 8; ++i) {
-               uf[i]  = u[i];
-               rpf[i] = rp[i] * scalef;
-       }
-       for (; k_n--; s++) {
-               sav = di = *s;
-               for (i = 0; i < 8; ++i) {
-                       register float rpfi = rpf[i];
-                       register float ufi  = uf[i];
-
-                       uf[i] = sav;
-                       temp  = rpfi * di + ufi;
-                       di   += rpfi * ufi;
-                       sav   = temp;
+       for (i = 0 ; i < 8 ; ++i)
+       {       uf [i]  = u [i] ;
+               rpf [i] = rp [i] * scalef ;
+               }
+       for ( ; k_n-- ; s++)
+       {       sav = di = *s ;
+               for (i = 0 ; i < 8 ; i++)
+               {       register float rpfi = rpf [i] ;
+                       register float ufi      = uf [i] ;
+
+                       uf [i]  = sav ;
+                       temp    = rpfi * di + ufi ;
+                       di              += rpfi * ufi ;
+                       sav             = temp ;
                }
-               *s = di;
+               *s = di ;
        }
-       for (i = 0; i < 8; ++i) u[i] = uf[i];
+       for (i = 0 ; i < 8 ; i++) u [i] = uf [i] ;
 }
 #endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
 
 static void Short_term_synthesis_filtering (
        struct gsm_state * S,
-       register word   * rrp,  /* [0..7]       IN      */
+       register int16_t        * rrp,  /* [0..7]       IN      */
        register int    k,      /* k_end - k_start      */
-       register word   * wt,   /* [0..k-1]     IN      */
-       register word   * sr    /* [0..k-1]     OUT     */
+       register int16_t        * wt,   /* [0..k-1]     IN      */
+       register int16_t        * sr    /* [0..k-1]     OUT     */
 )
 {
-       register word           * v = S->v;
-       register int            i;
-       register word           sri, tmp1, tmp2;
-
-       while (k--) {
-               sri = *wt++;
-               for (i = 8; i--;) {
-
-                       /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+       register int16_t                * v = S->v ;
+       register int            i ;
+       register int16_t                sri, tmp1, tmp2 ;
+
+       while (k--)
+       {       sri = *wt++ ;
+               for (i = 8 ; i-- ; )
+               {       /* sri = GSM_SUB(sri, gsm_mult_r(rrp[i], v [i])) ;
                         */
-                       tmp1 = rrp[i];
-                       tmp2 = v[i];
-                       tmp2 =  ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+                       tmp1 = rrp [i] ;
+                       tmp2 = v [i] ;
+                       tmp2 = (tmp1 == MIN_WORD && tmp2 == MIN_WORD
                                ? MAX_WORD
-                               : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
-                                            + 16384) >> 15)) ;
+                               : 0x0FFFF & (((int32_t) tmp1 * (int32_t) tmp2
+                                                       + 16384) >> 15)) ;
 
-                       sri  = GSM_SUB( sri, tmp2 );
+                       sri = GSM_SUB (sri, tmp2) ;
 
-                       /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+                       /* v [i+1] = GSM_ADD (v [i], gsm_mult_r(rrp[i], sri)) ;
                         */
-                       tmp1  = ( tmp1 == MIN_WORD && sri == MIN_WORD
+                       tmp1 = (tmp1 == MIN_WORD && sri == MIN_WORD
                                ? MAX_WORD
-                               : 0x0FFFF & (( (longword)tmp1 * (longword)sri
-                                            + 16384) >> 15)) ;
+                               : 0x0FFFF & (((int32_t) tmp1 * (int32_t) sri
+                                                       + 16384) >> 15)) ;
 
-                       v[i+1] = GSM_ADD( v[i], tmp1);
+                       v [i + 1] = GSM_ADD (v [i], tmp1) ;
                }
-               *sr++ = v[0] = sri;
+               *sr++ = v [0] = sri ;
        }
 }
 
 
-#if defined(FAST) && defined(USE_FLOAT_MUL)
+#if defined (FAST) && defined (USE_FLOAT_MUL)
 
 static void Fast_Short_term_synthesis_filtering (
        struct gsm_state * S,
-       register word   * rrp,  /* [0..7]       IN      */
+       register int16_t        * rrp,  /* [0..7]       IN      */
        register int    k,      /* k_end - k_start      */
-       register word   * wt,   /* [0..k-1]     IN      */
-       register word   * sr    /* [0..k-1]     OUT     */
+       register int16_t        * wt,   /* [0..k-1]     IN      */
+       register int16_t        * sr    /* [0..k-1]     OUT     */
 )
 {
-       register word           * v = S->v;
-       register int            i;
+       register int16_t                * v = S->v ;
+       register int            i ;
 
-       float va[9], rrpa[8];
-       register float scalef = 3.0517578125e-5, temp;
+       float va [9], rrpa [8] ;
+       register float scalef = 3.0517578125e-5, temp ;
 
-       for (i = 0; i < 8; ++i) {
-               va[i]   = v[i];
-               rrpa[i] = (float)rrp[i] * scalef;
-       }
+       for (i = 0 ; i < 8 ; ++i)
+       {       va [i]  = v [i] ;
+               rrpa [i] = (float) rrp [i] * scalef ;
+               }
        while (k--) {
-               register float sri = *wt++;
-               for (i = 8; i--;) {
-                       sri -= rrpa[i] * va[i];
-                       if     (sri < -32768.) sri = -32768.;
-                       else if (sri > 32767.) sri =  32767.;
-
-                       temp = va[i] + rrpa[i] * sri;
-                       if     (temp < -32768.) temp = -32768.;
-                       else if (temp > 32767.) temp =  32767.;
-                       va[i+1] = temp;
+               register float sri = *wt++ ;
+               for (i = 8 ; i-- ; )
+               {       sri -= rrpa [i] * va [i] ;
+                       if              (sri < -32768.0) sri = -32768.0 ;
+                       else if (sri > 32767.0) sri = 32767.0 ;
+
+                       temp = va [i] + rrpa [i] * sri ;
+                       if              (temp < -32768.0) temp = -32768.0 ;
+                       else if (temp > 32767.0) temp = 32767.0 ;
+                       va [i+1] = temp ;
                }
-               *sr++ = va[0] = sri;
+               *sr++ = va [0] = sri ;
        }
-       for (i = 0; i < 9; ++i) v[i] = va[i];
+       for (i = 0 ; i < 9 ; ++i) v [i] = va [i] ;
 }
 
 #endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
 
 void Gsm_Short_Term_Analysis_Filter (
-
        struct gsm_state * S,
 
-       word    * LARc,         /* coded log area ratio [0..7]  IN      */
-       word    * s             /* signal [0..159]              IN/OUT  */
+       int16_t * LARc,         /* coded log area ratio [0..7]  IN      */
+       int16_t * s                     /* signal [0..159]              IN/OUT  */
 )
 {
-       word            * LARpp_j       = S->LARpp[ S->j      ];
-       word            * LARpp_j_1     = S->LARpp[ S->j ^= 1 ];
+       int16_t         * LARpp_j       = S->LARpp [S->j] ;
+       int16_t         * LARpp_j_1     = S->LARpp [S->j ^= 1] ;
 
-       word            LARp[8];
+       int16_t         LARp [8] ;
 
 #undef FILTER
-#if    defined(FAST) && defined(USE_FLOAT_MUL)
-#      define  FILTER  (* (S->fast                     \
-                          ? Fast_Short_term_analysis_filtering \
-                          : Short_term_analysis_filtering      ))
+#if    defined (FAST) && defined (USE_FLOAT_MUL)
+#      define  FILTER  (* (S->fast                                                             \
+                                       ? Fast_Short_term_analysis_filtering    \
+                                       : Short_term_analysis_filtering))
 
 #else
 #      define  FILTER  Short_term_analysis_filtering
 #endif
 
-       Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+       Decoding_of_the_coded_Log_Area_Ratios (LARc, LARpp_j) ;
 
-       Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 13, s);
+       Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 13, s) ;
 
-       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 14, s + 13);
+       Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 14, s + 13) ;
 
-       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 13, s + 27);
+       Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 13, s + 27) ;
 
-       Coefficients_40_159( LARpp_j, LARp);
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 120, s + 40);
+       Coefficients_40_159 (LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 120, s + 40) ;
 }
 
 void Gsm_Short_Term_Synthesis_Filter (
        struct gsm_state * S,
 
-       word    * LARcr,        /* received log area ratios [0..7] IN  */
-       word    * wt,           /* received d [0..159]             IN  */
+       int16_t * LARcr,        /* received log area ratios [0..7] IN  */
+       int16_t * wt,           /* received d [0..159]             IN  */
 
-       word    * s             /* signal   s [0..159]            OUT  */
+       int16_t * s             /* signal   s [0..159]            OUT  */
 )
 {
-       word            * LARpp_j       = S->LARpp[ S->j     ];
-       word            * LARpp_j_1     = S->LARpp[ S->j ^=1 ];
+       int16_t         * LARpp_j       = S->LARpp [S->j] ;
+       int16_t         * LARpp_j_1     = S->LARpp [S->j ^= 1] ;
 
-       word            LARp[8];
+       int16_t         LARp [8] ;
 
 #undef FILTER
-#if    defined(FAST) && defined(USE_FLOAT_MUL)
+#if defined (FAST) && defined (USE_FLOAT_MUL)
 
-#      define  FILTER  (* (S->fast                     \
-                          ? Fast_Short_term_synthesis_filtering        \
-                          : Short_term_synthesis_filtering     ))
+#      define  FILTER  (* (S->fast                                                     \
+                               ? Fast_Short_term_synthesis_filtering   \
+                               : Short_term_synthesis_filtering))
 #else
 #      define  FILTER  Short_term_synthesis_filtering
 #endif
 
-       Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+       Decoding_of_the_coded_Log_Area_Ratios (LARcr, LARpp_j) ;
 
-       Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 13, wt, s );
+       Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 13, wt, s) ;
 
-       Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 14, wt + 13, s + 13 );
+       Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 14, wt + 13, s + 13) ;
 
-       Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
-       LARp_to_rp( LARp );
-       FILTER( S, LARp, 13, wt + 27, s + 27 );
+       Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 13, wt + 27, s + 27) ;
 
-       Coefficients_40_159( LARpp_j, LARp );
-       LARp_to_rp( LARp );
-       FILTER(S, LARp, 120, wt + 40, s + 40);
+       Coefficients_40_159 (LARpp_j, LARp) ;
+       LARp_to_rp (LARp) ;
+       FILTER (S, LARp, 120, wt + 40, s + 40) ;
 }
index 8b83f78..30590af 100644 (file)
 /*  Table 4.1  Quantization of the Log.-Area Ratios
  */
 /* i                1      2      3        4      5      6        7       8 */
-word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};
-word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};
-word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };
-word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };
+int16_t gsm_A [8]      = { 20480,      20480,  20480,  20480,  13964,  15360,  8534,   9036 } ;
+int16_t gsm_B [8]      = {             0,              0,      2048,   -2560,  94,             -1792,  -341,   -1144 } ;
+int16_t gsm_MIC [8] = { -32,   -32,    -16,    -16,    -8,             -8,             -4,             -4 } ;
+int16_t gsm_MAC [8] = { 31,    31,             15,             15,             7,              7,              3,              3 } ;
 
 
 /*  Table 4.2  Tabulation  of 1/A[1..8]
  */
-word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };
+int16_t gsm_INVA [8] = { 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 } ;
 
 
 /*   Table 4.3a  Decision level of the LTP gain quantizer
  */
 /*  bc               0         1         2          3                  */
-word gsm_DLB[4] = {  6554,    16384,   26214,     32767        };
+int16_t gsm_DLB [4] = { 6554, 16384,   26214,  32767 } ;
 
 
 /*   Table 4.3b   Quantization levels of the LTP gain quantizer
  */
 /* bc                0          1        2          3                  */
-word gsm_QLB[4] = {  3277,    11469,   21299,     32767        };
+int16_t gsm_QLB [4] = { 3277,  11469,  21299,          32767   } ;
 
 
 /*   Table 4.4  Coefficients of the weighting filter
  */
 /* i               0      1   2    3   4      5      6     7   8   9    10  */
-word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+int16_t gsm_H [11] = { -134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 } ;
 
 
-/*   Table 4.5          Normalized inverse mantissa used to compute xM/xmax 
+/*   Table 4.5          Normalized inverse mantissa used to compute xM/xmax
  */
 /* i                   0        1    2      3      4      5     6      7   */
-word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+int16_t gsm_NRFAC [8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 } ;
 
 
 /*   Table 4.6  Normalized direct mantissa used to compute xM/xmax
  */
 /* i                  0      1       2      3      4      5      6      7   */
-word gsm_FAC[8]        = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
+int16_t gsm_FAC [8]    = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 } ;
index 7834e28..b197e28 100644 (file)
@@ -2,16 +2,13 @@
 
 AUTOMAKE_OPTIONS = subdir-objects
 
-INCLUDES = @EXTERNAL_CFLAGS@
+AM_CPPFLAGS = $(EXTERNAL_CFLAGS)
 
 lib_LTLIBRARIES = libsndfile.la
 include_HEADERS = sndfile.hh
 nodist_include_HEADERS = sndfile.h
 
-noinst_LTLIBRARIES =  GSM610/libgsm.la G72x/libg72x.la libcommon.la
-
-OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@
-OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
+noinst_LTLIBRARIES =  GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la libcommon.la
 
 SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static
 
@@ -27,16 +24,16 @@ check_PROGRAMS = test_main G72x/g72x_test
 
 COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
                double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \
-               interleave.c strings.c dither.c broadcast.c audio_detect.c \
-               ima_oki_adpcm.c ima_oki_adpcm.h chunk.c ogg.c chanmap.c \
+               interleave.c strings.c dither.c cart.c broadcast.c audio_detect.c \
+               ima_oki_adpcm.c ima_oki_adpcm.h alac.c chunk.c ogg.c chanmap.c \
                windows.c id3.c $(WIN_VERSION_FILE)
 
 FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \
                macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \
                sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \
-               ogg_vorbis.c ogg_speex.c ogg_pcm.c
+               ogg_vorbis.c ogg_speex.c ogg_pcm.c ogg_opus.c
 
-CLEANFILES = *~
+CLEANFILES = *~ *.exe G72x/*.exe error.dat
 
 if USE_WIN_VERSION_FILE
 WIN_VERSION_FILE = version-metadata.rc
@@ -46,11 +43,11 @@ endif
 
 #===============================================================================
 # MinGW requires -no-undefined if a DLL is to be built.
-libsndfile_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@
+libsndfile_la_LDFLAGS = -no-undefined -version-info  $(SHARED_VERSION_INFO) $(SHLIB_VERSION_ARG)
 libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS)
 nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS)
-libsndfile_la_LIBADD = libcommon.la GSM610/libgsm.la G72x/libg72x.la \
-               @EXTERNAL_LIBS@ -lm
+libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la \
+               libcommon.la $(EXTERNAL_LIBS) -lm
 
 libcommon_la_SOURCES = $(COMMON)
 
@@ -63,24 +60,31 @@ GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \
                GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \
                GSM610/rpe.c GSM610/short_term.c GSM610/table.c
 
-G72x_libg72x_la_SOURCES = $(COMMON)G72x/g72x.h G72x/g72x_priv.h \
+G72x_libg72x_la_SOURCES = G72x/g72x.h G72x/g72x_priv.h \
                G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c
 
-#======================================================================
+ALAC_libalac_la_SOURCES = ALAC/ALACAudioTypes.h ALAC/ALACBitUtilities.h \
+               ALAC/EndianPortable.h ALAC/aglib.h ALAC/dplib.h ALAC/matrixlib.h \
+               ALAC/alac_codec.h ALAC/shift.h \
+               ALAC/ALACBitUtilities.c ALAC/ag_dec.c \
+               ALAC/ag_enc.c ALAC/dp_dec.c ALAC/dp_enc.c ALAC/matrix_dec.c \
+               ALAC/matrix_enc.c ALAC/alac_decoder.c ALAC/alac_encoder.c
+
+#===============================================================================
 # Test programs.
 
 test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \
                                        test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \
-                                       test_strncpy_crlf.c test_broadcast_var.c
+                                       test_strncpy_crlf.c test_broadcast_var.c test_cart_var.c
 test_main_LDADD = libcommon.la
 
 G72x_g72x_test_SOURCES = G72x/g72x_test.c
 G72x_g72x_test_LDADD = G72x/libg72x.la
 
 test_endswap.c: test_endswap.def test_endswap.tpl
-       autogen --writable test_endswap.def
+       cd $(srcdir) && autogen --writable test_endswap.def && cd $(abs_builddir)
 
-genfiles : test_endswap.c $(SYMBOL_FILES)
+genfiles : $(SYMBOL_FILES) test_endswap.c
 
 check :
        @if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi
@@ -96,19 +100,19 @@ checkprograms : $(check_PROGRAMS)
 # end user to create these files.
 
 Symbols.gnu-binutils: create_symbols_file.py
-       ./create_symbols_file.py linux $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py linux $(VERSION) > $@
 
 Symbols.darwin: create_symbols_file.py
-       ./create_symbols_file.py darwin $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py darwin $(VERSION) > $@
 
 libsndfile-1.def: create_symbols_file.py
-       ./create_symbols_file.py win32 $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py win32 $(VERSION) > $@
 
 Symbols.os2: create_symbols_file.py
-       ./create_symbols_file.py os2 $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py os2 $(VERSION) > $@
 
 Symbols.static: create_symbols_file.py
-       ./create_symbols_file.py static $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py static $(VERSION) > $@
 
 # Fake dependancy to force the creation of these files.
 sndfile.o : $(SYMBOL_FILES)
index c2fdc4d..4fe8aab 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -38,24 +92,22 @@ host_triplet = @host@
 target_triplet = @target@
 check_PROGRAMS = test_main$(EXEEXT) G72x/g72x_test$(EXEEXT)
 subdir = src
-DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(srcdir)/config.h.in $(srcdir)/sndfile.h.in \
-       $(srcdir)/version-metadata.rc.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+       $(noinst_HEADERS) $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = version-metadata.rc sndfile.h
@@ -81,17 +133,30 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
        "$(DESTDIR)$(includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
-G72x_libg72x_la_LIBADD =
+ALAC_libalac_la_LIBADD =
 am__dirstamp = $(am__leading_dot)dirstamp
+am_ALAC_libalac_la_OBJECTS = ALAC/ALACBitUtilities.lo ALAC/ag_dec.lo \
+       ALAC/ag_enc.lo ALAC/dp_dec.lo ALAC/dp_enc.lo \
+       ALAC/matrix_dec.lo ALAC/matrix_enc.lo ALAC/alac_decoder.lo \
+       ALAC/alac_encoder.lo
+ALAC_libalac_la_OBJECTS = $(am_ALAC_libalac_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+G72x_libg72x_la_LIBADD =
 am_G72x_libg72x_la_OBJECTS = G72x/g721.lo G72x/g723_16.lo \
        G72x/g723_24.lo G72x/g723_40.lo G72x/g72x.lo
 G72x_libg72x_la_OBJECTS = $(am_G72x_libg72x_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
 GSM610_libgsm_la_LIBADD =
 am_GSM610_libgsm_la_OBJECTS = GSM610/add.lo GSM610/code.lo \
        GSM610/decode.lo GSM610/gsm_create.lo GSM610/gsm_decode.lo \
@@ -104,23 +169,25 @@ libcommon_la_LIBADD =
 am__libcommon_la_SOURCES_DIST = common.c file_io.c command.c pcm.c \
        ulaw.c alaw.c float32.c double64.c ima_adpcm.c ms_adpcm.c \
        gsm610.c dwvw.c vox_adpcm.c interleave.c strings.c dither.c \
-       broadcast.c audio_detect.c ima_oki_adpcm.c ima_oki_adpcm.h \
-       chunk.c ogg.c chanmap.c windows.c id3.c version-metadata.rc
+       cart.c broadcast.c audio_detect.c ima_oki_adpcm.c \
+       ima_oki_adpcm.h alac.c chunk.c ogg.c chanmap.c windows.c id3.c \
+       version-metadata.rc
 @USE_WIN_VERSION_FILE_TRUE@am__objects_1 = version-metadata.lo
 am__objects_2 = common.lo file_io.lo command.lo pcm.lo ulaw.lo alaw.lo \
        float32.lo double64.lo ima_adpcm.lo ms_adpcm.lo gsm610.lo \
        dwvw.lo vox_adpcm.lo interleave.lo strings.lo dither.lo \
-       broadcast.lo audio_detect.lo ima_oki_adpcm.lo chunk.lo ogg.lo \
-       chanmap.lo windows.lo id3.lo $(am__objects_1)
+       cart.lo broadcast.lo audio_detect.lo ima_oki_adpcm.lo alac.lo \
+       chunk.lo ogg.lo chanmap.lo windows.lo id3.lo $(am__objects_1)
 am_libcommon_la_OBJECTS = $(am__objects_2)
 libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
-libsndfile_la_DEPENDENCIES = libcommon.la GSM610/libgsm.la \
-       G72x/libg72x.la
+am__DEPENDENCIES_1 =
+libsndfile_la_DEPENDENCIES = GSM610/libgsm.la G72x/libg72x.la \
+       ALAC/libalac.la libcommon.la $(am__DEPENDENCIES_1)
 am__objects_3 = sndfile.lo aiff.lo au.lo avr.lo caf.lo dwd.lo flac.lo \
        g72x.lo htk.lo ircam.lo macbinary3.lo macos.lo mat4.lo mat5.lo \
        nist.lo paf.lo pvf.lo raw.lo rx2.lo sd2.lo sds.lo svx.lo \
        txw.lo voc.lo wve.lo w64.lo wav_w64.lo wav.lo xi.lo mpc2k.lo \
-       rf64.lo ogg_vorbis.lo ogg_speex.lo ogg_pcm.lo
+       rf64.lo ogg_vorbis.lo ogg_speex.lo ogg_pcm.lo ogg_opus.lo
 am__objects_4 =
 am_libsndfile_la_OBJECTS = $(am__objects_3) $(am__objects_4)
 nodist_libsndfile_la_OBJECTS = $(am__objects_4)
@@ -136,9 +203,22 @@ am_test_main_OBJECTS = test_main.$(OBJEXT) test_conversions.$(OBJEXT) \
        test_float.$(OBJEXT) test_endswap.$(OBJEXT) \
        test_audio_detect.$(OBJEXT) test_log_printf.$(OBJEXT) \
        test_file_io.$(OBJEXT) test_ima_oki_adpcm.$(OBJEXT) \
-       test_strncpy_crlf.$(OBJEXT) test_broadcast_var.$(OBJEXT)
+       test_strncpy_crlf.$(OBJEXT) test_broadcast_var.$(OBJEXT) \
+       test_cart_var.$(OBJEXT)
 test_main_OBJECTS = $(am_test_main_OBJECTS)
 test_main_DEPENDENCIES = libcommon.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@
 depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
 am__depfiles_maybe = depfiles
@@ -149,36 +229,58 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
-       $(libcommon_la_SOURCES) $(libsndfile_la_SOURCES) \
-       $(nodist_libsndfile_la_SOURCES) $(G72x_g72x_test_SOURCES) \
-       $(test_main_SOURCES)
-DIST_SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
-       $(am__libcommon_la_SOURCES_DIST) $(libsndfile_la_SOURCES) \
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(ALAC_libalac_la_SOURCES) $(G72x_libg72x_la_SOURCES) \
+       $(GSM610_libgsm_la_SOURCES) $(libcommon_la_SOURCES) \
+       $(libsndfile_la_SOURCES) $(nodist_libsndfile_la_SOURCES) \
        $(G72x_g72x_test_SOURCES) $(test_main_SOURCES)
+DIST_SOURCES = $(ALAC_libalac_la_SOURCES) $(G72x_libg72x_la_SOURCES) \
+       $(GSM610_libgsm_la_SOURCES) $(am__libcommon_la_SOURCES_DIST) \
+       $(libsndfile_la_SOURCES) $(G72x_g72x_test_SOURCES) \
+       $(test_main_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) \
        $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+       $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(srcdir)/sndfile.h.in $(srcdir)/version-metadata.rc.in \
+       $(top_srcdir)/Cfg/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -219,13 +321,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -289,7 +392,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -328,7 +433,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -340,9 +444,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -356,11 +462,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = subdir-objects
-INCLUDES = @EXTERNAL_CFLAGS@
+AM_CPPFLAGS = $(EXTERNAL_CFLAGS)
 lib_LTLIBRARIES = libsndfile.la
 include_HEADERS = sndfile.hh
 nodist_include_HEADERS = sndfile.h
-noinst_LTLIBRARIES = GSM610/libgsm.la G72x/libg72x.la libcommon.la
+noinst_LTLIBRARIES = GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la libcommon.la
 SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static
 EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \
                        $(SYMBOL_FILES) create_symbols_file.py binheader_writef_check.py \
@@ -371,26 +477,26 @@ EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \
 noinst_HEADERS = common.h sfconfig.h sfendian.h wav_w64.h sf_unistd.h ogg.h chanmap.h
 COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
                double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \
-               interleave.c strings.c dither.c broadcast.c audio_detect.c \
-               ima_oki_adpcm.c ima_oki_adpcm.h chunk.c ogg.c chanmap.c \
+               interleave.c strings.c dither.c cart.c broadcast.c audio_detect.c \
+               ima_oki_adpcm.c ima_oki_adpcm.h alac.c chunk.c ogg.c chanmap.c \
                windows.c id3.c $(WIN_VERSION_FILE)
 
 FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \
                macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \
                sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \
-               ogg_vorbis.c ogg_speex.c ogg_pcm.c
+               ogg_vorbis.c ogg_speex.c ogg_pcm.c ogg_opus.c
 
-CLEANFILES = *~
+CLEANFILES = *~ *.exe G72x/*.exe error.dat
 @USE_WIN_VERSION_FILE_FALSE@WIN_VERSION_FILE = 
 @USE_WIN_VERSION_FILE_TRUE@WIN_VERSION_FILE = version-metadata.rc
 
 #===============================================================================
 # MinGW requires -no-undefined if a DLL is to be built.
-libsndfile_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@
+libsndfile_la_LDFLAGS = -no-undefined -version-info  $(SHARED_VERSION_INFO) $(SHLIB_VERSION_ARG)
 libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS)
 nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS)
-libsndfile_la_LIBADD = libcommon.la GSM610/libgsm.la G72x/libg72x.la \
-               @EXTERNAL_LIBS@ -lm
+libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la ALAC/libalac.la \
+               libcommon.la $(EXTERNAL_LIBS) -lm
 
 libcommon_la_SOURCES = $(COMMON)
 
@@ -402,15 +508,22 @@ GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \
                GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \
                GSM610/rpe.c GSM610/short_term.c GSM610/table.c
 
-G72x_libg72x_la_SOURCES = $(COMMON)G72x/g72x.h G72x/g72x_priv.h \
+G72x_libg72x_la_SOURCES = G72x/g72x.h G72x/g72x_priv.h \
                G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c
 
+ALAC_libalac_la_SOURCES = ALAC/ALACAudioTypes.h ALAC/ALACBitUtilities.h \
+               ALAC/EndianPortable.h ALAC/aglib.h ALAC/dplib.h ALAC/matrixlib.h \
+               ALAC/alac_codec.h ALAC/shift.h \
+               ALAC/ALACBitUtilities.c ALAC/ag_dec.c \
+               ALAC/ag_enc.c ALAC/dp_dec.c ALAC/dp_enc.c ALAC/matrix_dec.c \
+               ALAC/matrix_enc.c ALAC/alac_decoder.c ALAC/alac_encoder.c
 
-#======================================================================
+
+#===============================================================================
 # Test programs.
 test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \
                                        test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \
-                                       test_strncpy_crlf.c test_broadcast_var.c
+                                       test_strncpy_crlf.c test_broadcast_var.c test_cart_var.c
 
 test_main_LDADD = libcommon.la
 G72x_g72x_test_SOURCES = G72x/g72x_test.c
@@ -432,7 +545,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -452,10 +564,8 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 
 config.h: stamp-h1
-       @if test ! -f $@; then \
-         rm -f stamp-h1; \
-         $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-       else :; fi
+       @test -f $@ || rm -f stamp-h1
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
        @rm -f stamp-h1
@@ -471,9 +581,9 @@ version-metadata.rc: $(top_builddir)/config.status $(srcdir)/version-metadata.rc
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 sndfile.h: $(top_builddir)/config.status $(srcdir)/sndfile.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -481,6 +591,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
        }
@@ -496,21 +608,48 @@ uninstall-libLTLIBRARIES:
 
 clean-libLTLIBRARIES:
        -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-         test "$$dir" != "$$p" || dir=.; \
-         echo "rm -f \"$${dir}/so_locations\""; \
-         rm -f "$${dir}/so_locations"; \
-       done
+       @list='$(lib_LTLIBRARIES)'; \
+       locs=`for p in $$list; do echo $$p; done | \
+             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+             sort -u`; \
+       test -z "$$locs" || { \
+         echo rm -f $${locs}; \
+         rm -f $${locs}; \
+       }
 
 clean-noinstLTLIBRARIES:
        -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-         test "$$dir" != "$$p" || dir=.; \
-         echo "rm -f \"$${dir}/so_locations\""; \
-         rm -f "$${dir}/so_locations"; \
-       done
+       @list='$(noinst_LTLIBRARIES)'; \
+       locs=`for p in $$list; do echo $$p; done | \
+             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+             sort -u`; \
+       test -z "$$locs" || { \
+         echo rm -f $${locs}; \
+         rm -f $${locs}; \
+       }
+ALAC/$(am__dirstamp):
+       @$(MKDIR_P) ALAC
+       @: > ALAC/$(am__dirstamp)
+ALAC/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) ALAC/$(DEPDIR)
+       @: > ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/ALACBitUtilities.lo: ALAC/$(am__dirstamp) \
+       ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/ag_dec.lo: ALAC/$(am__dirstamp) ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/ag_enc.lo: ALAC/$(am__dirstamp) ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/dp_dec.lo: ALAC/$(am__dirstamp) ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/dp_enc.lo: ALAC/$(am__dirstamp) ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/matrix_dec.lo: ALAC/$(am__dirstamp) \
+       ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/matrix_enc.lo: ALAC/$(am__dirstamp) \
+       ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/alac_decoder.lo: ALAC/$(am__dirstamp) \
+       ALAC/$(DEPDIR)/$(am__dirstamp)
+ALAC/alac_encoder.lo: ALAC/$(am__dirstamp) \
+       ALAC/$(DEPDIR)/$(am__dirstamp)
+
+ALAC/libalac.la: $(ALAC_libalac_la_OBJECTS) $(ALAC_libalac_la_DEPENDENCIES) $(EXTRA_ALAC_libalac_la_DEPENDENCIES) ALAC/$(am__dirstamp)
+       $(AM_V_CCLD)$(LINK)  $(ALAC_libalac_la_OBJECTS) $(ALAC_libalac_la_LIBADD) $(LIBS)
 G72x/$(am__dirstamp):
        @$(MKDIR_P) G72x
        @: > G72x/$(am__dirstamp)
@@ -522,7 +661,8 @@ G72x/g723_16.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
 G72x/g723_24.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
 G72x/g723_40.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
 G72x/g72x.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
-G72x/libg72x.la: $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_DEPENDENCIES) G72x/$(am__dirstamp)
+
+G72x/libg72x.la: $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_DEPENDENCIES) $(EXTRA_G72x_libg72x_la_DEPENDENCIES) G72x/$(am__dirstamp)
        $(AM_V_CCLD)$(LINK)  $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_LIBADD) $(LIBS)
 GSM610/$(am__dirstamp):
        @$(MKDIR_P) GSM610
@@ -555,11 +695,14 @@ GSM610/short_term.lo: GSM610/$(am__dirstamp) \
        GSM610/$(DEPDIR)/$(am__dirstamp)
 GSM610/table.lo: GSM610/$(am__dirstamp) \
        GSM610/$(DEPDIR)/$(am__dirstamp)
-GSM610/libgsm.la: $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_DEPENDENCIES) GSM610/$(am__dirstamp)
+
+GSM610/libgsm.la: $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_DEPENDENCIES) $(EXTRA_GSM610_libgsm_la_DEPENDENCIES) GSM610/$(am__dirstamp)
        $(AM_V_CCLD)$(LINK)  $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_LIBADD) $(LIBS)
-libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) 
+
+libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) $(EXTRA_libcommon_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(LINK)  $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS)
-libsndfile.la: $(libsndfile_la_OBJECTS) $(libsndfile_la_DEPENDENCIES) 
+
+libsndfile.la: $(libsndfile_la_OBJECTS) $(libsndfile_la_DEPENDENCIES) $(EXTRA_libsndfile_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(libsndfile_la_LINK) -rpath $(libdir) $(libsndfile_la_OBJECTS) $(libsndfile_la_LIBADD) $(LIBS)
 
 clean-checkPROGRAMS:
@@ -572,65 +715,36 @@ clean-checkPROGRAMS:
        rm -f $$list
 G72x/g72x_test.$(OBJEXT): G72x/$(am__dirstamp) \
        G72x/$(DEPDIR)/$(am__dirstamp)
-G72x/g72x_test$(EXEEXT): $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_DEPENDENCIES) G72x/$(am__dirstamp)
+
+G72x/g72x_test$(EXEEXT): $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_DEPENDENCIES) $(EXTRA_G72x_g72x_test_DEPENDENCIES) G72x/$(am__dirstamp)
        @rm -f G72x/g72x_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_LDADD) $(LIBS)
-test_main$(EXEEXT): $(test_main_OBJECTS) $(test_main_DEPENDENCIES) 
+
+test_main$(EXEEXT): $(test_main_OBJECTS) $(test_main_DEPENDENCIES) $(EXTRA_test_main_DEPENDENCIES) 
        @rm -f test_main$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_main_OBJECTS) $(test_main_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
-       -rm -f G72x/g721.$(OBJEXT)
-       -rm -f G72x/g721.lo
-       -rm -f G72x/g723_16.$(OBJEXT)
-       -rm -f G72x/g723_16.lo
-       -rm -f G72x/g723_24.$(OBJEXT)
-       -rm -f G72x/g723_24.lo
-       -rm -f G72x/g723_40.$(OBJEXT)
-       -rm -f G72x/g723_40.lo
-       -rm -f G72x/g72x.$(OBJEXT)
-       -rm -f G72x/g72x.lo
-       -rm -f G72x/g72x_test.$(OBJEXT)
-       -rm -f GSM610/add.$(OBJEXT)
-       -rm -f GSM610/add.lo
-       -rm -f GSM610/code.$(OBJEXT)
-       -rm -f GSM610/code.lo
-       -rm -f GSM610/decode.$(OBJEXT)
-       -rm -f GSM610/decode.lo
-       -rm -f GSM610/gsm_create.$(OBJEXT)
-       -rm -f GSM610/gsm_create.lo
-       -rm -f GSM610/gsm_decode.$(OBJEXT)
-       -rm -f GSM610/gsm_decode.lo
-       -rm -f GSM610/gsm_destroy.$(OBJEXT)
-       -rm -f GSM610/gsm_destroy.lo
-       -rm -f GSM610/gsm_encode.$(OBJEXT)
-       -rm -f GSM610/gsm_encode.lo
-       -rm -f GSM610/gsm_option.$(OBJEXT)
-       -rm -f GSM610/gsm_option.lo
-       -rm -f GSM610/long_term.$(OBJEXT)
-       -rm -f GSM610/long_term.lo
-       -rm -f GSM610/lpc.$(OBJEXT)
-       -rm -f GSM610/lpc.lo
-       -rm -f GSM610/preprocess.$(OBJEXT)
-       -rm -f GSM610/preprocess.lo
-       -rm -f GSM610/rpe.$(OBJEXT)
-       -rm -f GSM610/rpe.lo
-       -rm -f GSM610/short_term.$(OBJEXT)
-       -rm -f GSM610/short_term.lo
-       -rm -f GSM610/table.$(OBJEXT)
-       -rm -f GSM610/table.lo
+       -rm -f ALAC/*.$(OBJEXT)
+       -rm -f ALAC/*.lo
+       -rm -f G72x/*.$(OBJEXT)
+       -rm -f G72x/*.lo
+       -rm -f GSM610/*.$(OBJEXT)
+       -rm -f GSM610/*.lo
 
 distclean-compile:
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aiff.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alac.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alaw.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/au.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_detect.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/broadcast.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cart.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chanmap.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunk.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Plo@am__quote@
@@ -658,6 +772,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_adpcm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nist.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_opus.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_pcm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_speex.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_vorbis.Plo@am__quote@
@@ -674,6 +789,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svx.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_audio_detect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_broadcast_var.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cart_var.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_conversions.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_endswap.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_file_io.Po@am__quote@
@@ -692,6 +808,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wve.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/ALACBitUtilities.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/ag_dec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/ag_enc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/alac_decoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/alac_encoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/dp_dec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/dp_enc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/matrix_dec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ALAC/$(DEPDIR)/matrix_enc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g721.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g723_16.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g723_24.Plo@am__quote@
@@ -717,40 +842,41 @@ distclean-compile:
 @am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
 @am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
 @am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
 @am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
 @am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
 @am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
 @am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
 @am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Plo
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
 
 clean-libtool:
        -rm -rf .libs _libs
+       -rm -rf ALAC/.libs ALAC/_libs
        -rm -rf G72x/.libs G72x/_libs
        -rm -rf GSM610/.libs GSM610/_libs
 install-includeHEADERS: $(include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -764,13 +890,14 @@ uninstall-includeHEADERS:
        @$(NORMAL_UNINSTALL)
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(includedir)" && rm -f $$files
+       dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
 install-nodist_includeHEADERS: $(nodist_include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
        @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -784,30 +911,17 @@ uninstall-nodist_includeHEADERS:
        @$(NORMAL_UNINSTALL)
        @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       test -n "$$files" || exit 0; \
-       echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-       cd "$(DESTDIR)$(includedir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+       dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -819,15 +933,11 @@ TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -836,6 +946,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -888,10 +1013,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -900,6 +1030,8 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f ALAC/$(DEPDIR)/$(am__dirstamp)
+       -rm -f ALAC/$(am__dirstamp)
        -rm -f G72x/$(DEPDIR)/$(am__dirstamp)
        -rm -f G72x/$(am__dirstamp)
        -rm -f GSM610/$(DEPDIR)/$(am__dirstamp)
@@ -914,7 +1046,7 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
        clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+       -rm -rf ./$(DEPDIR) ALAC/$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-hdr distclean-tags
@@ -960,7 +1092,7 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+       -rm -rf ./$(DEPDIR) ALAC/$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -982,14 +1114,14 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
 
 .MAKE: all check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
        clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
-       clean-libtool clean-noinstLTLIBRARIES ctags distclean \
-       distclean-compile distclean-generic distclean-hdr \
-       distclean-libtool distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am \
+       clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-hdr distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
        install-includeHEADERS install-info install-info-am \
        install-libLTLIBRARIES install-man \
        install-nodist_includeHEADERS install-pdf install-pdf-am \
@@ -997,14 +1129,16 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
        installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am uninstall-includeHEADERS \
+       tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
        uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
 
+.PRECIOUS: Makefile
+
 
 test_endswap.c: test_endswap.def test_endswap.tpl
-       autogen --writable test_endswap.def
+       cd $(srcdir) && autogen --writable test_endswap.def && cd $(abs_builddir)
 
-genfiles : test_endswap.c $(SYMBOL_FILES)
+genfiles : $(SYMBOL_FILES) test_endswap.c
 
 check :
        @if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi
@@ -1020,19 +1154,19 @@ checkprograms : $(check_PROGRAMS)
 # end user to create these files.
 
 Symbols.gnu-binutils: create_symbols_file.py
-       ./create_symbols_file.py linux $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py linux $(VERSION) > $@
 
 Symbols.darwin: create_symbols_file.py
-       ./create_symbols_file.py darwin $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py darwin $(VERSION) > $@
 
 libsndfile-1.def: create_symbols_file.py
-       ./create_symbols_file.py win32 $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py win32 $(VERSION) > $@
 
 Symbols.os2: create_symbols_file.py
-       ./create_symbols_file.py os2 $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py os2 $(VERSION) > $@
 
 Symbols.static: create_symbols_file.py
-       ./create_symbols_file.py static $(VERSION) > $@
+       python $(srcdir)/create_symbols_file.py static $(VERSION) > $@
 
 # Fake dependancy to force the creation of these files.
 sndfile.o : $(SYMBOL_FILES)
index a671460..3c1d1e7 100644 (file)
@@ -34,4 +34,10 @@ _sf_version_string
 _sf_open_fd
 _sf_open_virtual
 _sf_write_sync
+_sf_set_chunk
+_sf_get_chunk_size
+_sf_get_chunk_data
+_sf_get_chunk_iterator
+_sf_next_chunk_iterator
+_sf_current_byterate
 
index 93da6d6..63c7310 100644 (file)
@@ -37,6 +37,12 @@ libsndfile.so.1.0
     sf_open_fd ;
     sf_open_virtual ;
     sf_write_sync ;
+    sf_set_chunk ;
+    sf_get_chunk_size ;
+    sf_get_chunk_data ;
+    sf_get_chunk_iterator ;
+    sf_next_chunk_iterator ;
+    sf_current_byterate ;
   local:
     * ;
 } ;
index 118ceba..f2fdfed 100644 (file)
@@ -40,4 +40,10 @@ _sf_version_string    @68
 _sf_open_fd           @70
 _sf_open_virtual      @80
 _sf_write_sync        @90
+_sf_set_chunk         @100
+_sf_get_chunk_size    @101
+_sf_get_chunk_data    @102
+_sf_get_chunk_iterator @103
+_sf_next_chunk_iterator @104
+_sf_current_byterate  @110
 
index a0e8d62..6b83a72 100644 (file)
@@ -33,3 +33,9 @@ sf_open_fd
 sf_wchar_open
 sf_open_virtual
 sf_write_sync
+sf_set_chunk
+sf_get_chunk_size
+sf_get_chunk_data
+sf_get_chunk_iterator
+sf_next_chunk_iterator
+sf_current_byterate
index 0113ba6..a4c9b66 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2005 David Viens <davidv@plogue.com>
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -185,9 +185,7 @@ typedef struct
 } MARK_ID_POS ;
 
 typedef struct
-{      PRIV_CHUNK4 chunk4 ;
-
-       sf_count_t      comm_offset ;
+{      sf_count_t      comm_offset ;
        sf_count_t      ssnd_offset ;
 
        int chanmap_tag ;
@@ -224,6 +222,11 @@ static int aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) ;
 
 static unsigned int marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize) ;
 
+static int aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ;
+static SF_CHUNK_ITERATOR * aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ;
+static int aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+static int aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+
 /*------------------------------------------------------------------------------
 ** Public function.
 */
@@ -243,6 +246,11 @@ aiff_open (SF_PRIVATE *psf)
        if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
        {       if ((error = aiff_read_header (psf, &comm_fmt)))
                        return error ;
+
+               psf->next_chunk_iterator = aiff_next_chunk_iterator ;
+               psf->get_chunk_size = aiff_get_chunk_size ;
+               psf->get_chunk_data = aiff_get_chunk_data ;
+
                psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
                } ;
 
@@ -266,12 +274,13 @@ aiff_open (SF_PRIVATE *psf)
                        psf->sf.frames = 0 ;
                        } ;
 
-               psf->str_flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
+               psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
 
                if ((error = aiff_write_header (psf, SF_FALSE)))
                        return error ;
 
-               psf->write_header = aiff_write_header ;
+               psf->write_header       = aiff_write_header ;
+               psf->set_chunk          = aiff_set_chunk ;
                } ;
 
        psf->container_close = aiff_close ;
@@ -364,17 +373,18 @@ static unsigned int
 marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize)
 {      int i ;
 
-    for (i = 0 ; i < marksize ; i++)
+       for (i = 0 ; i < marksize ; i++)
                if (m [i].markerID == n)
                        return m [i].position ;
-    return 0 ;
+       return 0 ;
 } /* marker_to_position */
 
 static int
 aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
 {      SSND_CHUNK      ssnd_fmt ;
        AIFF_PRIVATE *paiff ;
-       unsigned        marker, dword, FORMsize, SSNDsize, bytesread ;
+       BUF_UNION       ubuf ;
+       unsigned        chunk_size = 0, FORMsize, SSNDsize, bytesread ;
        int                     k, found_chunk = 0, done = 0, error = 0 ;
        char            *cptr ;
        int                     instr_found = 0, mark_found = 0, mark_count = 0 ;
@@ -401,54 +411,62 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
        **      one and then check for the mandatory chunks at the end.
        */
        while (! done)
-       {       psf_binheader_readf (psf, "m", &marker) ;
+       {       unsigned        marker ;
+               size_t jump = chunk_size & 1 ;
+
+               marker = chunk_size = 0 ;
+               psf_binheader_readf (psf, "Ejm4", jump, &marker, &chunk_size) ;
+               if (marker == 0)
+               {       sf_count_t pos = psf_ftell (psf) ;
+                       psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ;
+                       break ;
+                       } ;
 
                if (psf->file.mode == SFM_RDWR && (found_chunk & HAVE_SSND))
                        return SFE_AIFF_RW_SSND_NOT_LAST ;
 
+               psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ;
+
                switch (marker)
                {       case FORM_MARKER :
                                        if (found_chunk)
                                                return SFE_AIFF_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &FORMsize) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf->headindex - 8, FORMsize) ;
+                                       FORMsize = chunk_size ;
+
+                                       found_chunk |= HAVE_FORM ;
+                                       psf_binheader_readf (psf, "m", &marker) ;
+                                       switch (marker)
+                                       {       case AIFC_MARKER :
+                                               case AIFF_MARKER :
+                                                       found_chunk |= (marker == AIFC_MARKER) ? (HAVE_AIFC | HAVE_AIFF) : HAVE_AIFF ;
+                                                       break ;
+                                               default :
+                                                       break ;
+                                               } ;
 
                                        if (psf->fileoffset > 0 && psf->filelength > FORMsize + 8)
                                        {       /* Set file length. */
                                                psf->filelength = FORMsize + 8 ;
-                                               psf_log_printf (psf, "FORM : %u\n", FORMsize) ;
+                                               psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ;
                                                }
-                                       else if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (dword))
-                                       {       dword = psf->filelength - 2 * sizeof (dword) ;
-                                               psf_log_printf (psf, "FORM : %u (should be %u)\n", FORMsize, dword) ;
-                                               FORMsize = dword ;
+                                       else if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (chunk_size))
+                                       {       chunk_size = psf->filelength - 2 * sizeof (chunk_size) ;
+                                               psf_log_printf (psf, "FORM : %u (should be %u)\n %M\n", FORMsize, chunk_size, marker) ;
+                                               FORMsize = chunk_size ;
                                                }
                                        else
-                                               psf_log_printf (psf, "FORM : %u\n", FORMsize) ;
-                                       found_chunk |= HAVE_FORM ;
+                                               psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ;
+                                       /* Set this to 0, so we don't jump a byte when parsing the next marker. */
+                                       chunk_size = 0 ;
                                        break ;
 
-                       case AIFC_MARKER :
-                       case AIFF_MARKER :
-                                       if ((found_chunk & HAVE_FORM) == 0)
-                                               return SFE_AIFF_AIFF_NO_FORM ;
-                                       psf_log_printf (psf, " %M\n", marker) ;
-                                       found_chunk |= (marker == AIFC_MARKER) ? (HAVE_AIFC | HAVE_AIFF) : HAVE_AIFF ;
-                                       break ;
 
                        case COMM_MARKER :
-                                       paiff->comm_offset = psf_ftell (psf) - 4 ;
-                                       error = aiff_read_comm_chunk (psf, comm_fmt) ;
-                                       pchk4_store (&paiff->chunk4, marker, paiff->comm_offset, comm_fmt->size) ;
-
-
-                                       psf->sf.samplerate = tenbytefloat2int (comm_fmt->sampleRate) ;
-                                       psf->sf.frames = comm_fmt->numSampleFrames ;
-                                       psf->sf.channels = comm_fmt->numChannels ;
-                                       psf->bytewidth = BITWIDTH2BYTES (comm_fmt->sampleSize) ;
-
-                                       if (error)
+                                       paiff->comm_offset = psf_ftell (psf) - 8 ;
+                                       chunk_size += chunk_size & 1 ;
+                                       comm_fmt->size = chunk_size ;
+                                       if ((error = aiff_read_comm_chunk (psf, comm_fmt)) != 0)
                                                return error ;
 
                                        found_chunk |= HAVE_COMM ;
@@ -459,12 +477,9 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                        if ((found_chunk & (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) != (HAVE_FORM | HAVE_AIFF | HAVE_COMM))
                                                return SFE_AIFF_PEAK_B4_COMM ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf->headindex - 8, dword) ;
-
-                                       psf_log_printf (psf, "%M : %d\n", marker, dword) ;
-                                       if (dword != AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))
-                                       {       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ;
+                                       if (chunk_size != AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))
+                                       {       psf_binheader_readf (psf, "j", chunk_size) ;
                                                psf_log_printf (psf, "*** File PEAK chunk too big.\n") ;
                                                return SFE_WAV_BAD_PEAK ;
                                                } ;
@@ -483,18 +498,18 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                        psf_log_printf (psf, "  time stamp : %d\n", psf->peak_info->timestamp) ;
                                        psf_log_printf (psf, "    Ch   Position       Value\n") ;
 
-                                       cptr = psf->u.cbuf ;
-                                       for (dword = 0 ; dword < (unsigned) psf->sf.channels ; dword++)
+                                       cptr = ubuf.cbuf ;
+                                       for (k = 0 ; k < psf->sf.channels ; k++)
                                        {       float value ;
                                                unsigned int position ;
 
                                                psf_binheader_readf (psf, "Ef4", &value, &position) ;
-                                               psf->peak_info->peaks [dword].value = value ;
-                                               psf->peak_info->peaks [dword].position = position ;
+                                               psf->peak_info->peaks [k].value = value ;
+                                               psf->peak_info->peaks [k].position = position ;
 
-                                               snprintf (cptr, sizeof (psf->u.scbuf), "    %2d   %-12" PRId64 "   %g\n",
-                                                               dword, psf->peak_info->peaks [dword].position, psf->peak_info->peaks [dword].value) ;
-                                               cptr [sizeof (psf->u.scbuf) - 1] = 0 ;
+                                               snprintf (cptr, sizeof (ubuf.scbuf), "    %2d   %-12" PRId64 "   %g\n",
+                                                               k, psf->peak_info->peaks [k].position, psf->peak_info->peaks [k].value) ;
+                                               cptr [sizeof (ubuf.scbuf) - 1] = 0 ;
                                                psf_log_printf (psf, "%s", cptr) ;
                                                } ;
 
@@ -505,9 +520,9 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                        if ((found_chunk & HAVE_AIFC) && (found_chunk & HAVE_FVER) == 0)
                                                psf_log_printf (psf, "*** Valid AIFC files should have an FVER chunk.\n") ;
 
-                                       paiff->ssnd_offset = psf_ftell (psf) - 4 ;
-                                       psf_binheader_readf (psf, "E444", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
-                                       pchk4_store (&paiff->chunk4, marker, paiff->ssnd_offset, SSNDsize) ;
+                                       paiff->ssnd_offset = psf_ftell (psf) - 8 ;
+                                       SSNDsize = chunk_size ;
+                                       psf_binheader_readf (psf, "E44", &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
 
                                        psf->datalength = SSNDsize - sizeof (ssnd_fmt) ;
                                        psf->dataoffset = psf_ftell (psf) ;
@@ -543,155 +558,146 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                                break ;
 
                                        /* Seek to end of SSND chunk. */
-                                       psf_fseek (psf, psf->dataoffset + psf->datalength + (SSNDsize & 1), SEEK_SET) ;
+                                       psf_fseek (psf, psf->dataoffset + psf->datalength, SEEK_SET) ;
                                        break ;
 
                        case c_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.scbuf))
-                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf))
+                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ;
                                                return SFE_INTERNAL ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
-                                       cptr [dword] = 0 ;
+                                       cptr = ubuf.cbuf ;
+                                       psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ;
+                                       cptr [chunk_size] = 0 ;
 
-                                       psf_sanitize_string (cptr, dword) ;
+                                       psf_sanitize_string (cptr, chunk_size) ;
 
                                        psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
                                        psf_store_string (psf, SF_STR_COPYRIGHT, cptr) ;
+                                       chunk_size += chunk_size & 1 ;
                                        break ;
 
                        case AUTH_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 1)
-                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1)
+                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ;
                                                return SFE_INTERNAL ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
-                                       cptr [dword] = 0 ;
+                                       cptr = ubuf.cbuf ;
+                                       psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ;
+                                       cptr [chunk_size] = 0 ;
                                        psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
                                        psf_store_string (psf, SF_STR_ARTIST, cptr) ;
+                                       chunk_size += chunk_size & 1 ;
                                        break ;
 
                        case COMT_MARKER :
                                {       unsigned short count, id, len ;
-                                       unsigned int timestamp ;
+                                       unsigned int timestamp, bytes ;
 
-                                       psf_binheader_readf (psf, "E42", &dword, &count) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       psf_log_printf (psf, " %M : %d\n  count  : %d\n", marker, dword, count) ;
-                                       dword += (dword & 1) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       dword -= 2 ;
+                                       bytes = chunk_size ;
+                                       bytes -= psf_binheader_readf (psf, "E2", &count) ;
+                                       psf_log_printf (psf, " %M : %d\n  count  : %d\n", marker, chunk_size, count) ;
 
                                        for (k = 0 ; k < count ; k++)
-                                       {       dword -= psf_binheader_readf (psf, "E422", &timestamp, &id, &len) ;
+                                       {       bytes -= psf_binheader_readf (psf, "E422", &timestamp, &id, &len) ;
                                                psf_log_printf (psf, "   time   : 0x%x\n   marker : %x\n   length : %d\n", timestamp, id, len) ;
 
-                                               if (len + 1 > SIGNED_SIZEOF (psf->u.scbuf))
+                                               if (len + 1 > SIGNED_SIZEOF (ubuf.scbuf))
                                                {       psf_log_printf (psf, "\nError : string length (%d) too big.\n", len) ;
                                                        return SFE_INTERNAL ;
                                                        } ;
 
-                                               cptr = psf->u.cbuf ;
-                                               dword -= psf_binheader_readf (psf, "b", cptr, len) ;
+                                               cptr = ubuf.cbuf ;
+                                               bytes -= psf_binheader_readf (psf, "b", cptr, len) ;
                                                cptr [len] = 0 ;
                                                psf_log_printf (psf, "   string : %s\n", cptr) ;
                                                } ;
 
-                                       if (dword > 0)
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                       if (bytes > 0)
+                                               psf_binheader_readf (psf, "j", bytes) ;
                                        } ;
                                        break ;
 
                        case APPL_MARKER :
                                {       unsigned appl_marker ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 1)
-                                       {       psf_log_printf (psf, " %M : %d (too big, skipping)\n", marker, dword) ;
-                                               psf_binheader_readf (psf, "j", dword + (dword & 1)) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1)
+                                       {       psf_log_printf (psf, " %M : %u (too big, skipping)\n", marker, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ;
                                                break ;
                                                } ;
 
-                                       if (dword < 4)
-                                       {       psf_log_printf (psf, " %M : %d (too small, skipping)\n", marker, dword) ;
-                                               psf_binheader_readf (psf, "j", dword + (dword & 1)) ;
+                                       if (chunk_size < 4)
+                                       {       psf_log_printf (psf, " %M : %d (too small, skipping)\n", marker, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ;
                                                break ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "mb", &appl_marker, cptr, dword + (dword & 1) - 4) ;
-                                       cptr [dword] = 0 ;
+                                       cptr = ubuf.cbuf ;
+                                       psf_binheader_readf (psf, "mb", &appl_marker, cptr, chunk_size + (chunk_size & 1) - 4) ;
+                                       cptr [chunk_size] = 0 ;
 
-                                       for (k = 0 ; k < (int) dword ; k++)
+                                       for (k = 0 ; k < (int) chunk_size ; k++)
                                                if (! psf_isprint (cptr [k]))
                                                {       cptr [k] = 0 ;
                                                        break ;
                                                        } ;
 
-                                       psf_log_printf (psf, " %M : %d\n  AppSig : %M\n  Name   : %s\n", marker, dword, appl_marker, cptr) ;
+                                       psf_log_printf (psf, " %M : %d\n  AppSig : %M\n  Name   : %s\n", marker, chunk_size, appl_marker, cptr) ;
                                        psf_store_string (psf, SF_STR_SOFTWARE, cptr) ;
+                                       chunk_size += chunk_size & 1 ;
                                        } ;
                                        break ;
 
                        case NAME_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 2)
-                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2)
+                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ;
                                                return SFE_INTERNAL ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
-                                       cptr [dword] = 0 ;
+                                       cptr = ubuf.cbuf ;
+                                       psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ;
+                                       cptr [chunk_size] = 0 ;
                                        psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
                                        psf_store_string (psf, SF_STR_TITLE, cptr) ;
+                                       chunk_size += chunk_size & 1 ;
                                        break ;
 
                        case ANNO_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword == 0)
+                                       if (chunk_size == 0)
                                                break ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 2)
-                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2)
+                                       {       psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ;
                                                return SFE_INTERNAL ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
-                                       cptr [dword] = 0 ;
+                                       cptr = ubuf.cbuf ;
+                                       psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ;
+                                       cptr [chunk_size] = 0 ;
                                        psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
                                        psf_store_string (psf, SF_STR_COMMENT, cptr) ;
+                                       chunk_size += chunk_size & 1 ;
                                        break ;
 
                        case INST_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       if (dword != SIZEOF_INST_CHUNK)
-                                       {       psf_log_printf (psf, " %M : %d (should be %d)\n", marker, dword, SIZEOF_INST_CHUNK) ;
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                       if (chunk_size != SIZEOF_INST_CHUNK)
+                                       {       psf_log_printf (psf, " %M : %d (should be %d)\n", marker, chunk_size, SIZEOF_INST_CHUNK) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                } ;
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+                                       psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ;
                                        {       unsigned char bytes [6] ;
                                                short gain ;
 
@@ -752,18 +758,14 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                        break ;
 
                        case basc_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       psf_log_printf (psf, " basc : %u\n", dword) ;
+                                       psf_log_printf (psf, " basc : %u\n", chunk_size) ;
 
-                                       if ((error = aiff_read_basc_chunk (psf, dword)))
+                                       if ((error = aiff_read_basc_chunk (psf, chunk_size)))
                                                return error ;
                                        break ;
 
                        case MARK_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+                                       psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ;
                                        {       unsigned short mark_id, n = 0 ;
                                                unsigned int position ;
 
@@ -778,7 +780,7 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                                if (paiff->markstr == NULL)
                                                        return SFE_MALLOC_FAILED ;
 
-                                               for (n = 0 ; n < mark_count && bytesread < dword ; n++)
+                                               for (n = 0 ; n < mark_count && bytesread < chunk_size ; n++)
                                                {       unsigned int pstr_len ;
                                                        unsigned char ch ;
 
@@ -787,22 +789,22 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
 
                                                        pstr_len = (ch & 1) ? ch : ch + 1 ;
 
-                                                       if (pstr_len < sizeof (psf->u.scbuf) - 1)
-                                                       {       bytesread += psf_binheader_readf (psf, "b", psf->u.scbuf, pstr_len) ;
-                                                               psf->u.scbuf [pstr_len] = 0 ;
+                                                       if (pstr_len < sizeof (ubuf.scbuf) - 1)
+                                                       {       bytesread += psf_binheader_readf (psf, "b", ubuf.scbuf, pstr_len) ;
+                                                               ubuf.scbuf [pstr_len] = 0 ;
                                                                }
                                                        else
-                                                       {       unsigned int read_len = pstr_len - (sizeof (psf->u.scbuf) - 1) ;
-                                                               bytesread += psf_binheader_readf (psf, "bj", psf->u.scbuf, read_len, pstr_len - read_len) ;
-                                                               psf->u.scbuf [sizeof (psf->u.scbuf) - 1] = 0 ;
+                                                       {       unsigned int read_len = pstr_len - (sizeof (ubuf.scbuf) - 1) ;
+                                                               bytesread += psf_binheader_readf (psf, "bj", ubuf.scbuf, read_len, pstr_len - read_len) ;
+                                                               ubuf.scbuf [sizeof (ubuf.scbuf) - 1] = 0 ;
                                                                }
 
-                                                       psf_log_printf (psf, "   Name     : %s\n", psf->u.scbuf) ;
+                                                       psf_log_printf (psf, "   Name     : %s\n", ubuf.scbuf) ;
 
                                                        paiff->markstr [n].markerID = mark_id ;
                                                        paiff->markstr [n].position = position ;
                                                        /*
-                                                       **      TODO if psf->u.scbuf is equal to
+                                                       **      TODO if ubuf.scbuf is equal to
                                                        **      either Beg_loop, Beg loop or beg loop and spam
                                                        **      if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
                                                        **              return SFE_MALLOC_FAILED ;
@@ -810,7 +812,7 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                                        } ;
                                                } ;
                                        mark_found++ ;
-                                       psf_binheader_readf (psf, "j", dword - bytesread) ;
+                                       psf_binheader_readf (psf, "j", chunk_size - bytesread) ;
                                        break ;
 
                        case FVER_MARKER :
@@ -818,77 +820,85 @@ aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
                                        /* Fall through to next case. */
 
                        case SFX_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
-
-                                       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ;
+                                       psf_binheader_readf (psf, "j", chunk_size) ;
                                        break ;
 
                        case NONE_MARKER :
                                        /* Fix for broken AIFC files with incorrect COMM chunk length. */
-                                       {       unsigned char byte ;
-                                               psf_binheader_readf (psf, "1", &byte) ;
-                                               dword = byte ;
-                                               psf_binheader_readf (psf, "j", dword) ;
-                                       }
+                                       chunk_size = (chunk_size >> 24) - 3 ;
+                                       psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ;
+                                       psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
                                        break ;
 
                        case CHAN_MARKER :
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
-
-                                       if (dword < 12)
-                                       {       psf_log_printf (psf, " %M : %d (should be >= 12)\n", marker, dword) ;
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                       if (chunk_size < 12)
+                                       {       psf_log_printf (psf, " %M : %d (should be >= 12)\n", marker, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                }
 
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+                                       psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ;
 
-                                       if ((error = aiff_read_chanmap (psf, dword)))
+                                       if ((error = aiff_read_chanmap (psf, chunk_size)))
                                                return error ;
                                        break ;
 
                        default :
+                                       if (chunk_size >= 0xffff0000)
+                                       {       done = SF_TRUE ;
+                                               psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
+                                               break ;
+                                               } ;
+
                                        if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
                                                && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
-                                       {       psf_binheader_readf (psf, "E4", &dword) ;
-                                               psf_log_printf (psf, " %M : %d (unknown marker)\n", marker, dword) ;
+                                       {       psf_log_printf (psf, " %M : %u (unknown marker)\n", marker, chunk_size) ;
 
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                } ;
-                                       if ((dword = psf_ftell (psf)) & 0x03)
-                                       {       psf_log_printf (psf, "  Unknown chunk marker %X at position %d. Resyncing.\n", marker, dword - 4) ;
 
+                                       if (psf_ftell (psf) & 0x03)
+                                       {       psf_log_printf (psf, "  Unknown chunk marker at position %D. Resynching.\n", psf_ftell (psf) - 8) ;
                                                psf_binheader_readf (psf, "j", -3) ;
                                                break ;
                                                } ;
                                        psf_log_printf (psf, "*** Unknown chunk marker %X at position %D. Exiting parser.\n", marker, psf_ftell (psf)) ;
-                                       done = 1 ;
+                                       done = SF_TRUE ;
                                        break ;
                        } ;     /* switch (marker) */
 
+               if (chunk_size >= psf->filelength)
+               {       psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ;
+                       break ;
+                       } ;
+
                if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND))
                        break ;
 
-               if (psf_ftell (psf) >= psf->filelength - (2 * SIGNED_SIZEOF (dword)))
+               if (psf_ftell (psf) >= psf->filelength - (2 * SIGNED_SIZEOF (int32_t)))
                        break ;
                } ; /* while (1) */
 
        if (instr_found && mark_found)
        {       int j ;
 
-               for (j = 0 ; j<psf->instrument->loop_count ; j ++)
+               for (j = 0 ; j < psf->instrument->loop_count ; j ++)
                {       if (j < ARRAY_LEN (psf->instrument->loops))
                        {       psf->instrument->loops [j].start = marker_to_position (paiff->markstr, psf->instrument->loops [j].start, mark_count) ;
                                psf->instrument->loops [j].end = marker_to_position (paiff->markstr, psf->instrument->loops [j].end, mark_count) ;
                                psf->instrument->loops [j].mode = SF_LOOP_FORWARD ;
                                } ;
-                       } ;
+                       } ;
                } ;
 
+       if (psf->sf.channels < 1)
+               return SFE_CHANNEL_COUNT_ZERO ;
+
+       if (psf->sf.channels >= SF_MAX_CHANNELS)
+               return SFE_CHANNEL_COUNT ;
+
        if (! (found_chunk & HAVE_FORM))
                return SFE_AIFF_NO_FORM ;
 
@@ -923,25 +933,22 @@ aiff_close (SF_PRIVATE *psf)
 
 static int
 aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
-{      int error = 0, bytesread, subformat ;
-
-       psf->u.scbuf [0] = 0 ;
+{      BUF_UNION       ubuf ;
+       int subformat, samplerate ;
 
-       bytesread = psf_binheader_readf (psf, "E4", &(comm_fmt->size)) ;
+       ubuf.scbuf [0] = 0 ;
 
        /* The COMM chunk has an int aligned to an odd word boundary. Some
        ** procesors are not able to deal with this (ie bus fault) so we have
        ** to take special care.
        */
-       comm_fmt->size += comm_fmt->size & 1 ;
 
-       bytesread +=
        psf_binheader_readf (psf, "E242b", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames),
-                       &(comm_fmt->sampleSize), &(comm_fmt->sampleRate), SIGNED_SIZEOF (comm_fmt->sampleRate)) ;
+                               &(comm_fmt->sampleSize), &(comm_fmt->sampleRate), SIGNED_SIZEOF (comm_fmt->sampleRate)) ;
 
        if (comm_fmt->size > 0x10000 && (comm_fmt->size & 0xffff) == 0)
        {       psf_log_printf (psf, " COMM : %d (0x%x) *** should be ", comm_fmt->size, comm_fmt->size) ;
-               comm_fmt->size = ENDSWAP_INT (comm_fmt->size) ;
+               comm_fmt->size = ENDSWAP_32 (comm_fmt->size) ;
                psf_log_printf (psf, "%d (0x%x)\n", comm_fmt->size, comm_fmt->size) ;
                }
        else
@@ -950,21 +957,23 @@ aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
        if (comm_fmt->size == SIZEOF_AIFF_COMM)
                comm_fmt->encoding = NONE_MARKER ;
        else if (comm_fmt->size == SIZEOF_AIFC_COMM_MIN)
-               bytesread += psf_binheader_readf (psf, "Em", &(comm_fmt->encoding)) ;
+               psf_binheader_readf (psf, "Em", &(comm_fmt->encoding)) ;
        else if (comm_fmt->size >= SIZEOF_AIFC_COMM)
        {       unsigned char encoding_len ;
                unsigned read_len ;
 
-               bytesread += psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ;
+               psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ;
 
-               comm_fmt->size = SF_MIN (sizeof (psf->u.scbuf), make_size_t (comm_fmt->size)) ;
-               memset (psf->u.scbuf, 0, comm_fmt->size) ;
+               comm_fmt->size = SF_MIN (sizeof (ubuf.scbuf), make_size_t (comm_fmt->size)) ;
+               memset (ubuf.scbuf, 0, comm_fmt->size) ;
                read_len = comm_fmt->size - SIZEOF_AIFC_COMM + 1 ;
-               bytesread += psf_binheader_readf (psf, "b", psf->u.scbuf, read_len) ;
-               psf->u.scbuf [read_len + 1] = 0 ;
+               psf_binheader_readf (psf, "b", ubuf.scbuf, read_len) ;
+               ubuf.scbuf [read_len + 1] = 0 ;
                } ;
 
-       psf_log_printf (psf, "  Sample Rate : %d\n", tenbytefloat2int (comm_fmt->sampleRate)) ;
+       samplerate = tenbytefloat2int (comm_fmt->sampleRate) ;
+
+       psf_log_printf (psf, "  Sample Rate : %d\n", samplerate) ;
        psf_log_printf (psf, "  Frames      : %u%s\n", comm_fmt->numSampleFrames, (comm_fmt->numSampleFrames == 0 && psf->filelength > 104) ? " (Should not be 0)" : "") ;
        psf_log_printf (psf, "  Channels    : %d\n", comm_fmt->numChannels) ;
 
@@ -982,6 +991,11 @@ aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
 
        subformat = s_bitwidth_to_subformat (comm_fmt->sampleSize) ;
 
+       psf->sf.samplerate = samplerate ;
+       psf->sf.frames = comm_fmt->numSampleFrames ;
+       psf->sf.channels = comm_fmt->numChannels ;
+       psf->bytewidth = BITWIDTH2BYTES (comm_fmt->sampleSize) ;
+
        psf->endian = SF_ENDIAN_BIG ;
 
        switch (comm_fmt->encoding)
@@ -1058,74 +1072,68 @@ aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
 
                default :
                        psf_log_printf (psf, "AIFC : Unimplemented format : %M\n", comm_fmt->encoding) ;
-                       error = SFE_UNIMPLEMENTED ;
+                       return SFE_UNIMPLEMENTED ;
                } ;
 
-       if (! psf->u.scbuf [0])
+       if (! ubuf.scbuf [0])
                psf_log_printf (psf, "  Encoding    : %M\n", comm_fmt->encoding) ;
        else
-               psf_log_printf (psf, "  Encoding    : %M => %s\n", comm_fmt->encoding, psf->u.scbuf) ;
+               psf_log_printf (psf, "  Encoding    : %M => %s\n", comm_fmt->encoding, ubuf.scbuf) ;
 
-       return error ;
+       return 0 ;
 } /* aiff_read_comm_chunk */
 
 
 /*==========================================================================================
 */
 
-static int
-aiff_rewrite_header (SF_PRIVATE *psf, AIFF_PRIVATE * paiff)
+static void
+aiff_rewrite_header (SF_PRIVATE *psf)
 {
        /* Assuming here that the header has already been written and just
        ** needs to be corrected for new data length. That means that we
        ** only change the length fields of the FORM and SSND chunks ;
        ** everything else can be skipped over.
        */
-       int k, ch ;
-       int comm_size, comm_frames ;
+       int k, ch, comm_size, comm_frames ;
 
        psf_fseek (psf, 0, SEEK_SET) ;
        psf_fread (psf->header, psf->dataoffset, 1, psf) ;
 
        psf->headindex = 0 ;
 
-       for (k = 0 ; k < paiff->chunk4.count ; k++)
-       {       switch (paiff->chunk4.l [k].chunk)
-               {       case FORM_MARKER :
-                               psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
-                               break ;
+       /* FORM chunk. */
+       psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
 
-                       case COMM_MARKER :
-                               psf->headindex = paiff->chunk4.l [k].offset ;
-                               comm_frames = psf->sf.frames ;
-                               comm_size = paiff->chunk4.l [k].len ;
-                               psf_binheader_writef (psf, "Em42t4", COMM_MARKER, comm_size, psf->sf.channels, comm_frames) ;
-                               break ;
+       /* COMM chunk. */
+       if ((k = psf_find_read_chunk_m32 (&psf->rchunks, COMM_MARKER)) >= 0)
+       {       psf->headindex = psf->rchunks.chunks [k].offset - 8 ;
+               comm_frames = psf->sf.frames ;
+               comm_size = psf->rchunks.chunks [k].len ;
+               psf_binheader_writef (psf, "Em42t4", COMM_MARKER, comm_size, psf->sf.channels, comm_frames) ;
+               } ;
 
-                       case SSND_MARKER :
-                               psf->headindex = paiff->chunk4.l [k].offset ;
-                               psf_binheader_writef (psf, "Etm8", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK) ;
-                               break ;
+       /* PEAK chunk. */
+       if ((k = psf_find_read_chunk_m32 (&psf->rchunks, PEAK_MARKER)) >= 0)
+       {       psf->headindex = psf->rchunks.chunks [k].offset - 8 ;
+               psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+               psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
+               for (ch = 0 ; ch < psf->sf.channels ; ch++)
+                       psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [ch].value, psf->peak_info->peaks [ch].position) ;
+               } ;
 
-                       case PEAK_MARKER :
-                               psf->headindex = paiff->chunk4.l [k].offset ;
-                               psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
-                               psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
-                               for (ch = 0 ; ch < psf->sf.channels ; ch++)
-                                       psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [ch].value, psf->peak_info->peaks [ch].position) ;
-                               break ;
 
-                       default :
-                               /* There are a whole bunch of chunks we should just ignore. */
-                               break ;
-                       } ;
+       /* SSND chunk. */
+       if ((k = psf_find_read_chunk_m32 (&psf->rchunks, SSND_MARKER)) >= 0)
+       {       psf->headindex = psf->rchunks.chunks [k].offset - 8 ;
+               psf_binheader_writef (psf, "Etm8", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK) ;
                } ;
 
        /* Header mangling complete so write it out. */
        psf_fseek (psf, 0, SEEK_SET) ;
        psf_fwrite (psf->header, psf->headindex, 1, psf) ;
 
-       return ;
+       return ;
 } /* aiff_rewrite_header */
 
 static int
@@ -1133,7 +1141,7 @@ aiff_write_header (SF_PRIVATE *psf, int calc_length)
 {      sf_count_t              current ;
        AIFF_PRIVATE    *paiff ;
        unsigned char   comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ;
-       unsigned int    comm_type, comm_size, comm_encoding, comm_frames = 0 ;
+       unsigned int    comm_type, comm_size, comm_encoding, comm_frames = 0, uk ;
        int                             k, endian, has_data = SF_FALSE ;
        short                   bit_width ;
 
@@ -1156,11 +1164,11 @@ aiff_write_header (SF_PRIVATE *psf, int calc_length)
                        psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
                } ;
 
-       if (psf->file.mode == SFM_RDWR && psf->dataoffset > 0 && paiff->chunk4.count > 0)
-       {       int err = aiff_rewrite_header (psf, paiff) ;
+       if (psf->file.mode == SFM_RDWR && psf->dataoffset > 0 && psf->rchunks.count > 0)
+       {       aiff_rewrite_header (psf) ;
                if (current > 0)
                        psf_fseek (psf, current, SEEK_SET) ;
-               return err ;
+               return 0 ;
                } ;
 
        endian = SF_ENDIAN (psf->sf.format) ;
@@ -1415,7 +1423,7 @@ aiff_write_header (SF_PRIVATE *psf, int calc_length)
                                        m [3].markerID, m [3].position, 8, "end loop", make_size_t (9)) ;
                } ;
 
-       if (psf->str_flags & SF_STR_LOCATE_START)
+       if (psf->strings.flags & SF_STR_LOCATE_START)
                aiff_write_strings (psf, SF_STR_LOCATE_START) ;
 
        if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
@@ -1425,6 +1433,10 @@ aiff_write_header (SF_PRIVATE *psf, int calc_length)
                        psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
                } ;
 
+       /* Write custom headers. */
+       for (uk = 0 ; uk < psf->wchunks.used ; uk++)
+               psf_binheader_writef (psf, "Em4b", psf->wchunks.chunks [uk].mark32, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ;
+
        /* Write SSND chunk. */
        paiff->ssnd_offset = psf->headindex ;
        psf_binheader_writef (psf, "Etm844", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK, 0, 0) ;
@@ -1471,7 +1483,7 @@ aiff_write_tailer (SF_PRIVATE *psf)
                        psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
                } ;
 
-       if (psf->str_flags & SF_STR_LOCATE_END)
+       if (psf->strings.flags & SF_STR_LOCATE_END)
                aiff_write_strings (psf, SF_STR_LOCATE_END) ;
 
        /* Write the tailer. */
@@ -1486,37 +1498,37 @@ aiff_write_strings (SF_PRIVATE *psf, int location)
 {      int     k, slen ;
 
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
-       {       if (psf->strings [k].type == 0)
+       {       if (psf->strings.data [k].type == 0)
                        break ;
 
-               if (psf->strings [k].flags != location)
+               if (psf->strings.data [k].flags != location)
                        continue ;
 
-               switch (psf->strings [k].type)
+               switch (psf->strings.data [k].type)
                {       case SF_STR_SOFTWARE :
-                               slen = strlen (psf->strings [k].str) ;
-                               psf_binheader_writef (psf, "Em4mb", APPL_MARKER, slen + 4, m3ga_MARKER, psf->strings [k].str, make_size_t (slen + (slen & 1))) ;
+                               slen = strlen (psf->strings.storage + psf->strings.data [k].offset) ;
+                               psf_binheader_writef (psf, "Em4mb", APPL_MARKER, slen + 4, m3ga_MARKER, psf->strings.storage + psf->strings.data [k].offset, make_size_t (slen + (slen & 1))) ;
                                break ;
 
                        case SF_STR_TITLE :
-                               psf_binheader_writef (psf, "EmS", NAME_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "EmS", NAME_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_COPYRIGHT :
-                               psf_binheader_writef (psf, "EmS", c_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "EmS", c_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_ARTIST :
-                               psf_binheader_writef (psf, "EmS", AUTH_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "EmS", AUTH_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_COMMENT :
-                               psf_binheader_writef (psf, "EmS", ANNO_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "EmS", ANNO_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        /*
                        case SF_STR_DATE :
-                               psf_binheader_writef (psf, "Ems", ICRD_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "Ems", ICRD_MARKER, psf->strings.data [k].str) ;
                                break ;
                        */
                        } ;
@@ -1541,8 +1553,6 @@ aiff_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (d
                        break ;
        } ;
 
-
-
        return 0 ;
 } /* aiff_command */
 
@@ -1621,7 +1631,7 @@ uint2tenbytefloat (unsigned int num, unsigned char *bytes)
                return ;
                } ;
 
-       for (count = 0 ; count <= 32 ; count ++)
+       for (count = 0 ; count < 32 ; count ++)
        {       if (num & mask)
                        break ;
                mask >>= 1 ;
@@ -1736,3 +1746,49 @@ aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword)
        return 0 ;
 } /* aiff_read_chanmap */
 
+/*==============================================================================
+*/
+
+static int
+aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info)
+{      return psf_save_write_chunk (&psf->wchunks, chunk_info) ;
+} /* aiff_set_chunk */
+
+static SF_CHUNK_ITERATOR *
+aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator)
+{      return psf_next_chunk_iterator (&psf->rchunks, iterator) ;
+} /* aiff_next_chunk_iterator */
+
+static int
+aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      int indx ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       chunk_info->datalen = psf->rchunks.chunks [indx].len ;
+
+       return SFE_NO_ERROR ;
+} /* aiff_get_chunk_size */
+
+static int
+aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      sf_count_t pos ;
+       int indx ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       if (chunk_info->data == NULL)
+               return SFE_BAD_CHUNK_DATA_PTR ;
+
+       chunk_info->id_size = psf->rchunks.chunks [indx].id_size ;
+       memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ;
+
+       pos = psf_ftell (psf) ;
+       psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ;
+       psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ;
+       psf_fseek (psf, pos, SEEK_SET) ;
+
+       return SFE_NO_ERROR ;
+} /* aiff_get_chunk_data */
diff --git a/src/alac.c b/src/alac.c
new file mode 100644 (file)
index 0000000..460b526
--- /dev/null
@@ -0,0 +1,999 @@
+/*
+** Copyright (C) 2011-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include       "sfconfig.h"
+
+#include       <stdio.h>
+#include       <stdlib.h>
+#include       <string.h>
+#include       <math.h>
+#include       <errno.h>
+
+#include       "sndfile.h"
+#include       "sfendian.h"
+#include       "common.h"
+#include       "ALAC/alac_codec.h"
+#include       "ALAC/ALACBitUtilities.h"
+
+#define                ALAC_MAX_FRAME_SIZE             8192
+#define                ALAC_BYTE_BUFFER_SIZE   0x20000
+
+
+typedef struct
+{      uint32_t        current, count, allocated ;
+       uint32_t        packet_size [] ;
+} PAKT_INFO ;
+
+typedef struct
+{      sf_count_t      input_data_pos ;
+
+       PAKT_INFO       * pakt_info ;
+
+       int                     channels, final_write_block ;
+
+       uint32_t        frames_this_block, partial_block_frames, frames_per_block ;
+       uint32_t        bits_per_sample, kuki_size ;
+
+
+       /* Can't have a decoder and an encoder at the same time so stick
+       ** them in an un-named union.
+       */
+       union
+       {       ALAC_DECODER decoder ;
+               ALAC_ENCODER encoder ;
+       } ;
+
+       char enctmpname [512] ;
+       FILE *enctmp ;
+
+       int     buffer  [] ;
+
+} ALAC_PRIVATE ;
+
+/*============================================================================================
+*/
+
+static int alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ;
+static int alac_writer_init (SF_PRIVATE *psf) ;
+
+static sf_count_t alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ;
+
+static sf_count_t alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t      alac_seek       (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int     alac_close              (SF_PRIVATE *psf) ;
+static int     alac_byterate   (SF_PRIVATE *psf) ;
+
+static int alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ;
+static int alac_encode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ;
+
+static uint32_t alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) ;
+
+static PAKT_INFO * alac_pakt_alloc (uint32_t initial_count) ;
+static PAKT_INFO * alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t pakt_offset) ;
+static PAKT_INFO * alac_pakt_append (PAKT_INFO * info, uint32_t value) ;
+static uint8_t * alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size) ;
+static sf_count_t alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) ;
+
+static const char * alac_error_string (int error) ;
+
+/*============================================================================================
+** ALAC Reader initialisation function.
+*/
+
+int
+alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info)
+{      int error ;
+
+       if ((psf->codec_data = calloc (1, sizeof (ALAC_PRIVATE) + psf->sf.channels * sizeof (int) * ALAC_MAX_FRAME_SIZE)) == NULL)
+               return SFE_MALLOC_FAILED ;
+
+       psf->codec_close = alac_close ;
+
+       switch (psf->file.mode)
+       {       case SFM_RDWR :
+                       return SFE_BAD_MODE_RW ;
+
+               case SFM_READ :
+                       if ((error = alac_reader_init (psf, info)))
+                               return error ;
+                       break ;
+
+               case SFM_WRITE :
+                       if ((error = alac_writer_init (psf)))
+                               return error ;
+                       break ;
+
+               default :
+                       psf_log_printf (psf, "%s : Bad psf->file.mode.\n", __func__) ;
+                       return SFE_INTERNAL ;
+               } ;
+
+       psf->byterate = alac_byterate ;
+
+       return 0 ;
+} /* aiff_alac_init */
+
+void
+alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet)
+{      switch (subformat)
+       {       case SF_FORMAT_ALAC_16 :
+                       *fmt_flags = 1 ;
+                       break ;
+               case SF_FORMAT_ALAC_20 :
+                       *fmt_flags = 2 ;
+                       break ;
+               case SF_FORMAT_ALAC_24 :
+                       *fmt_flags = 3 ;
+                       break ;
+               case SF_FORMAT_ALAC_32 :
+                       *fmt_flags = 4 ;
+                       break ;
+               default :
+                       break ;
+               } ;
+       *frames_per_packet = ALAC_FRAME_LENGTH ;
+} /* alac_get_desc_chunk_items */
+
+static int
+alac_close     (SF_PRIVATE *psf)
+{      ALAC_PRIVATE *plac ;
+       BUF_UNION       ubuf ;
+
+       plac = psf->codec_data ;
+
+       if (psf->file.mode == SFM_WRITE)
+       {       ALAC_ENCODER *penc = &plac->encoder ;
+               SF_CHUNK_INFO chunk_info ;
+               sf_count_t readcount ;
+               uint8_t *kuki_data [plac->kuki_size] ;
+               uint32_t pakt_size = 0, saved_partial_block_frames ;
+
+               plac->final_write_block = 1 ;
+               saved_partial_block_frames = plac->partial_block_frames ;
+
+               /*      If a block has been partially assembled, write it out as the final block. */
+               if (plac->partial_block_frames && plac->partial_block_frames < plac->frames_per_block)
+                       alac_encode_block (psf, plac) ;
+
+               plac->partial_block_frames = saved_partial_block_frames ;
+
+               alac_get_magic_cookie (penc, kuki_data, &plac->kuki_size) ;
+
+               memset (&chunk_info, 0, sizeof (chunk_info)) ;
+               chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "kuki") ;
+               chunk_info.data = kuki_data ;
+               chunk_info.datalen = plac->kuki_size ;
+               psf_save_write_chunk (&psf->wchunks, &chunk_info) ;
+
+               memset (&chunk_info, 0, sizeof (chunk_info)) ;
+               chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ;
+               chunk_info.data = alac_pakt_encode (psf, &pakt_size) ;
+               chunk_info.datalen = pakt_size ;
+               psf_save_write_chunk (&psf->wchunks, &chunk_info) ;
+
+               free (chunk_info.data) ;
+               chunk_info.data = NULL ;
+
+               psf->write_header (psf, 1) ;
+
+               if (plac->enctmp != NULL)
+               {       fseek (plac->enctmp, 0, SEEK_SET) ;
+
+                       while ((readcount = fread (ubuf.ucbuf, 1, sizeof (ubuf.ucbuf), plac->enctmp)) > 0)
+                               psf_fwrite (ubuf.ucbuf, 1, readcount, psf) ;
+                       fclose (plac->enctmp) ;
+                       remove (plac->enctmpname) ;
+                       } ;
+               } ;
+
+       if (plac->pakt_info)
+               free (plac->pakt_info) ;
+       plac->pakt_info = NULL ;
+
+       return 0 ;
+} /* alac_close */
+
+static int
+alac_byterate  (SF_PRIVATE *psf)
+{
+       if (psf->file.mode == SFM_READ)
+               return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ;
+
+       return -1 ;
+} /* alac_byterate */
+
+/*============================================================================================
+** ALAC initialisation Functions.
+*/
+
+static int
+alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info)
+{      ALAC_PRIVATE    *plac ;
+       uint32_t                kuki_size ;
+       int                             error ;
+       union                   { uint8_t kuki [512] ; uint32_t alignment ; } u ;
+
+       if (info == NULL)
+       {       psf_log_printf (psf, "%s : ALAC_DECODER_INFO is NULL.\n", __func__) ;
+               return SFE_INTERNAL ;
+               } ;
+
+       if (info->frames_per_packet > ALAC_MAX_FRAME_SIZE)
+       {       psf_log_printf (psf, "*** Error : frames_per_packet (%u) is too big. ***\n", info->frames_per_packet) ;
+               return SFE_INTERNAL ;
+               } ;
+
+       plac = psf->codec_data ;
+
+       plac->channels                  = psf->sf.channels ;
+       plac->frames_per_block  = info->frames_per_packet ;
+       plac->bits_per_sample   = info->bits_per_sample ;
+
+       if (plac->pakt_info != NULL)
+               free (plac->pakt_info) ;
+       plac->pakt_info = alac_pakt_read_decode (psf, info->pakt_offset) ;
+
+
+       if (plac->pakt_info == NULL)
+       {       psf_log_printf (psf, "%s : alac_pkt_read() returns NULL.\n", __func__) ;
+               return SFE_MALLOC_FAILED ;
+               } ;
+
+       /* Read in the ALAC cookie data and pass it to the init function. */
+       kuki_size = alac_kuki_read (psf, info->kuki_offset, u.kuki, sizeof (u.kuki)) ;
+
+       if ((error = alac_decoder_init (&plac->decoder, u.kuki, kuki_size)) != ALAC_noErr)
+       {       psf_log_printf (psf, "*** alac_decoder_init() returned %s. ***\n", alac_error_string (error)) ;
+               return SFE_INTERNAL ;
+               } ;
+
+
+       if (plac->decoder.mNumChannels != (unsigned) psf->sf.channels)
+       {       psf_log_printf (psf, "*** Initialized decoder has %u channels, but it should be %d. ***\n", plac->decoder.mNumChannels, psf->sf.channels) ;
+               return SFE_INTERNAL ;
+               } ;
+
+       switch (info->bits_per_sample)
+       {       case 16 :
+               case 20 :
+               case 24 :
+               case 32 :
+                       psf->read_short         = alac_read_s ;
+                       psf->read_int           = alac_read_i ;
+                       psf->read_float         = alac_read_f ;
+                       psf->read_double        = alac_read_d ;
+                       break ;
+
+               default :
+                       printf ("%s : info->bits_per_sample %u\n", __func__, info->bits_per_sample) ;
+                       return SFE_UNSUPPORTED_ENCODING ;
+               } ;
+
+       psf->codec_close        = alac_close ;
+       psf->seek                       = alac_seek ;
+
+       psf->sf.frames          = alac_reader_calc_frames (psf, plac) ;
+       alac_seek (psf, SFM_READ, 0) ;
+
+       return 0 ;
+} /* alac_reader_init */
+
+static int
+alac_writer_init (SF_PRIVATE *psf)
+{      ALAC_PRIVATE    *plac ;
+       uint32_t                alac_format_flags = 0 ;
+
+       plac = psf->codec_data ;
+
+       if (psf->file.mode != SFM_WRITE)
+               return SFE_BAD_MODE_RW ;
+
+       plac->channels  = psf->sf.channels ;
+       plac->kuki_size = alac_get_magic_cookie_size (psf->sf.channels) ;
+
+       psf->write_short        = alac_write_s ;
+       psf->write_int          = alac_write_i ;
+       psf->write_float        = alac_write_f ;
+       psf->write_double       = alac_write_d ;
+
+       switch (SF_CODEC (psf->sf.format))
+       {       case SF_FORMAT_ALAC_16 :
+                       alac_format_flags       = 1 ;
+                       plac->bits_per_sample = 16 ;
+                       break ;
+
+               case SF_FORMAT_ALAC_20 :
+                       alac_format_flags       = 2 ;
+                       plac->bits_per_sample = 20 ;
+                       break ;
+
+               case SF_FORMAT_ALAC_24 :
+                       alac_format_flags       = 3 ;
+                       plac->bits_per_sample = 24 ;
+                       break ;
+
+               case SF_FORMAT_ALAC_32 :
+                       alac_format_flags       = 4 ;
+                       plac->bits_per_sample = 32 ;
+                       break ;
+
+               default :
+                       psf_log_printf (psf, "%s : Can't figure out bits per sample.\n", __func__) ;
+                       return SFE_UNIMPLEMENTED ;
+               } ;
+
+       plac->frames_per_block = ALAC_FRAME_LENGTH ;
+
+       plac->pakt_info = alac_pakt_alloc (2000) ;
+
+       if ((plac->enctmp = psf_open_tmpfile (plac->enctmpname, sizeof (plac->enctmpname))) == NULL)
+       {       psf_log_printf (psf, "Error : Failed to open temp file '%s' : \n", plac->enctmpname, strerror (errno)) ;
+               return SFE_ALAC_FAIL_TMPFILE ;
+               } ;
+
+       alac_encoder_init (&plac->encoder, psf->sf.samplerate, psf->sf.channels, alac_format_flags, ALAC_FRAME_LENGTH) ;
+
+       return 0 ;
+} /* alac_writer_init */
+
+/*============================================================================================
+** ALAC block decoder and encoder.
+*/
+
+static inline uint32_t
+alac_reader_next_packet_size (PAKT_INFO * info)
+{      if (info->current >= info->count)
+               return 0 ;
+       return info->packet_size [info->current++] ;
+} /* alac_reader_next_packet_size */
+
+static sf_count_t
+alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac)
+{      sf_count_t      frames = 0 ;
+       uint32_t        current_pos = 1, blocks = 0 ;
+
+       plac->pakt_info->current = 0 ;
+
+       while (current_pos < psf->filelength && current_pos > 0)
+       {       current_pos = alac_reader_next_packet_size (plac->pakt_info) ;
+               blocks = current_pos > 0 ? blocks + 1 : blocks ;
+               } ;
+
+       if (blocks == 0)
+               return 0 ;
+
+       /* Only count full blocks. */
+       frames = plac->frames_per_block * (blocks - 1) ;
+
+       alac_seek (psf, SFM_READ, frames) ;
+       alac_decode_block (psf, plac) ;
+       frames += plac->frames_this_block ;
+
+       plac->pakt_info->current = 0 ;
+
+       return frames ;
+} /* alac_reader_calc_frames */
+
+static int
+alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac)
+{      ALAC_DECODER *pdec = &plac->decoder ;
+       uint8_t         byte_buffer [psf->sf.channels * ALAC_BYTE_BUFFER_SIZE] ;
+       uint32_t        packet_size ;
+       BitBuffer       bit_buffer ;
+
+       packet_size = alac_reader_next_packet_size (plac->pakt_info) ;
+       if (packet_size == 0)
+       {       if (plac->pakt_info->current < plac->pakt_info->count)
+                       psf_log_printf (psf, "packet_size is 0 (%d of %d)\n", plac->pakt_info->current, plac->pakt_info->count) ;
+               return 0 ;
+               } ;
+
+       psf_fseek (psf, plac->input_data_pos, SEEK_SET) ;
+
+       if (packet_size > sizeof (byte_buffer))
+       {       psf_log_printf (psf, "%s : bad packet_size (%u)\n", __func__, packet_size) ;
+               return 0 ;
+               } ;
+
+       if ((packet_size != psf_fread (byte_buffer, 1, packet_size, psf)))
+               return 0 ;
+
+       BitBufferInit (&bit_buffer, byte_buffer, packet_size) ;
+
+       plac->input_data_pos += packet_size ;
+       plac->frames_this_block = 0 ;
+       alac_decode (pdec, &bit_buffer, plac->buffer, plac->frames_per_block, &plac->frames_this_block) ;
+
+       plac->partial_block_frames = 0 ;
+
+       return 1 ;
+} /* alac_decode_block */
+
+
+static int
+alac_encode_block (SF_PRIVATE * psf, ALAC_PRIVATE *plac)
+{      ALAC_ENCODER *penc = &plac->encoder ;
+       uint8_t byte_buffer [psf->sf.channels * ALAC_BYTE_BUFFER_SIZE] ;
+       uint32_t num_bytes = 0 ;
+
+       alac_encode (penc, plac->partial_block_frames, plac->buffer, byte_buffer, &num_bytes) ;
+
+       if (fwrite (byte_buffer, 1, num_bytes, plac->enctmp) != num_bytes)
+               return 0 ;
+       if ((plac->pakt_info = alac_pakt_append (plac->pakt_info, num_bytes)) == NULL)
+               return 0 ;
+
+       plac->partial_block_frames = 0 ;
+
+       return 1 ;
+} /* alac_encode_block */
+
+/*============================================================================================
+** ALAC read functions.
+*/
+
+static sf_count_t
+alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, readcount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       while (len > 0)
+       {       if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0)
+                       break ;
+
+               readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ;
+               readcount = readcount > len ? len : readcount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < readcount ; k++)
+                       ptr [total + k] = iptr [k] >> 16 ;
+
+               plac->partial_block_frames += readcount / plac->channels ;
+               total += readcount ;
+               len -= readcount ;
+               } ;
+
+       return total ;
+} /* alac_read_s */
+
+static sf_count_t
+alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, readcount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       while (len > 0)
+       {       if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0)
+                       break ;
+
+               readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ;
+               readcount = readcount > len ? len : readcount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < readcount ; k++)
+                       ptr [total + k] = iptr [k] ;
+
+               plac->partial_block_frames += readcount / plac->channels ;
+               total += readcount ;
+               len -= readcount ;
+               } ;
+
+       return total ;
+} /* alac_read_i */
+
+static sf_count_t
+alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, readcount ;
+       sf_count_t      total = 0 ;
+       float           normfact ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+       while (len > 0)
+       {       if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0)
+                       break ;
+
+               readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ;
+               readcount = readcount > len ? len : readcount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < readcount ; k++)
+                       ptr [total + k] = normfact * iptr [k] ;
+
+               plac->partial_block_frames += readcount / plac->channels ;
+               total += readcount ;
+               len -= readcount ;
+               } ;
+
+       return total ;
+} /* alac_read_f */
+
+static sf_count_t
+alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, readcount ;
+       sf_count_t      total = 0 ;
+       double          normfact ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+       while (len > 0)
+       {       if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0)
+                       break ;
+
+               readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ;
+               readcount = readcount > len ? len : readcount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < readcount ; k++)
+                       ptr [total + k] = normfact * iptr [k] ;
+
+               plac->partial_block_frames += readcount / plac->channels ;
+               total += readcount ;
+               len -= readcount ;
+               } ;
+
+       return total ;
+} /* alac_read_d */
+
+/*============================================================================================
+*/
+
+static sf_count_t
+alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{      ALAC_PRIVATE *plac ;
+       int                     newblock, newsample ;
+
+       if (! psf->codec_data)
+               return 0 ;
+       plac = (ALAC_PRIVATE*) psf->codec_data ;
+
+       if (psf->datalength < 0 || psf->dataoffset < 0)
+       {       psf->error = SFE_BAD_SEEK ;
+               return PSF_SEEK_ERROR ;
+               } ;
+
+       if (offset == 0)
+       {       psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+               plac->frames_this_block = 0 ;
+               plac->input_data_pos = psf->dataoffset ;
+               plac->pakt_info->current = 0 ;
+               return 0 ;
+               } ;
+
+       if (offset < 0 || offset > plac->pakt_info->count * plac->frames_per_block)
+       {       psf->error = SFE_BAD_SEEK ;
+               return  PSF_SEEK_ERROR ;
+               } ;
+
+       newblock        = offset / plac->frames_per_block ;
+       newsample       = offset % plac->frames_per_block ;
+
+       if (mode == SFM_READ)
+       {       plac->input_data_pos = psf->dataoffset + alac_pakt_block_offset (plac->pakt_info, newblock) ;
+
+               plac->pakt_info->current = newblock ;
+               alac_decode_block (psf, plac) ;
+               plac->partial_block_frames = newsample ;
+               }
+       else
+       {       /* What to do about write??? */
+               psf->error = SFE_BAD_SEEK ;
+               return  PSF_SEEK_ERROR ;
+               } ;
+
+       return newblock * plac->frames_per_block + newsample ;
+} /* alac_seek */
+
+/*==========================================================================================
+** ALAC Write Functions.
+*/
+
+static sf_count_t
+alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, writecount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       while (len > 0)
+       {       writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ;
+               writecount = (writecount == 0 || writecount > len) ? len : writecount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < writecount ; k++)
+                       iptr [k] = arith_shift_left (ptr [k], 16) ;
+
+               plac->partial_block_frames += writecount / plac->channels ;
+               total += writecount ;
+               len -= writecount ;
+               ptr += writecount ;
+
+               if (plac->partial_block_frames >= plac->frames_per_block)
+                       alac_encode_block (psf, plac) ;
+               } ;
+
+       return total ;
+} /* alac_write_s */
+
+static sf_count_t
+alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       int                     *iptr ;
+       int                     k, writecount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       while (len > 0)
+       {       writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ;
+               writecount = (writecount == 0 || writecount > len) ? len : writecount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               for (k = 0 ; k < writecount ; k++)
+                       iptr [k] = ptr [k] ;
+
+               plac->partial_block_frames += writecount / plac->channels ;
+               total += writecount ;
+               len -= writecount ;
+               ptr += writecount ;
+
+               if (plac->partial_block_frames >= plac->frames_per_block)
+                       alac_encode_block (psf, plac) ;
+               } ;
+
+       return total ;
+} /* alac_write_i */
+
+static sf_count_t
+alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       void            (*convert) (const float *, int *t, int, int) ;
+       int                     *iptr ;
+       int                     writecount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       convert = (psf->add_clipping) ? psf_f2i_clip_array : psf_f2i_array ;
+
+       while (len > 0)
+       {       writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ;
+               writecount = (writecount == 0 || writecount > len) ? len : writecount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               convert (ptr, iptr, writecount, psf->norm_float) ;
+
+               plac->partial_block_frames += writecount / plac->channels ;
+               total += writecount ;
+               len -= writecount ;
+               ptr += writecount ;
+
+               if (plac->partial_block_frames >= plac->frames_per_block)
+                       alac_encode_block (psf, plac) ;
+               } ;
+
+       return total ;
+} /* alac_write_f */
+
+static sf_count_t
+alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{      ALAC_PRIVATE *plac ;
+       void            (*convert) (const double *, int *t, int, int) ;
+       int                     *iptr ;
+       int                     writecount ;
+       sf_count_t      total = 0 ;
+
+       if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL)
+               return 0 ;
+
+       convert = (psf->add_clipping) ? psf_d2i_clip_array : psf_d2i_array ;
+
+       while (len > 0)
+       {       writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ;
+               writecount = (writecount == 0 || writecount > len) ? len : writecount ;
+
+               iptr = plac->buffer + plac->partial_block_frames * plac->channels ;
+
+               convert (ptr, iptr, writecount, psf->norm_float) ;
+
+               plac->partial_block_frames += writecount / plac->channels ;
+               total += writecount ;
+               len -= writecount ;
+               ptr += writecount ;
+
+               if (plac->partial_block_frames >= plac->frames_per_block)
+                       alac_encode_block (psf, plac) ;
+               } ;
+
+       return total ;
+} /* alac_write_d */
+
+/*==============================================================================
+** PAKT_INFO handling.
+*/
+
+static PAKT_INFO *
+alac_pakt_alloc (uint32_t initial_count)
+{      PAKT_INFO * info ;
+
+       if ((info = calloc (1, sizeof (PAKT_INFO) + initial_count * sizeof (info->packet_size [0]))) == NULL)
+               return NULL ;
+
+       info->allocated = initial_count ;
+       info->current = 0 ;
+       info->count = 0 ;
+
+       return info ;
+} /* alac_pakt_alloc */
+
+static PAKT_INFO *
+alac_pakt_append (PAKT_INFO * info, uint32_t value)
+{
+       if (info->count >= info->allocated)
+       {       PAKT_INFO * temp ;
+               uint32_t newcount = info->allocated + info->allocated / 2 ;
+
+               if ((temp = realloc (info, sizeof (PAKT_INFO) + newcount * sizeof (info->packet_size [0]))) == NULL)
+                       return NULL ;
+
+               info = temp ;
+               info->allocated = newcount ;
+               } ;
+
+       info->packet_size [info->count++] = value ;
+       return info ;
+} /* alac_pakt_append */
+
+static PAKT_INFO *
+alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t UNUSED (pakt_offset))
+{      SF_CHUNK_INFO chunk_info ;
+       PAKT_INFO * info = NULL ;
+       uint8_t *pakt_data = NULL ;
+       uint32_t bcount, value = 1, pakt_size ;
+       SF_CHUNK_ITERATOR * chunk_iterator ;
+
+
+       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+       snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ;
+       chunk_info.id_size = 4 ;
+
+       if ((chunk_iterator = psf_get_chunk_iterator (psf, chunk_info.id)) == NULL)
+       {       printf ("%s %d : no chunk iterator found\n\n", __func__, __LINE__) ;
+               free (chunk_info.data) ;
+               chunk_info.data = NULL ;
+               return NULL ;
+               } ;
+
+       psf->get_chunk_size (psf, chunk_iterator, &chunk_info) ;
+
+       pakt_size = chunk_info.datalen ;
+       chunk_info.data = pakt_data = malloc (pakt_size + 5) ;
+
+       if ((bcount = psf->get_chunk_data (psf, chunk_iterator, &chunk_info)) != SF_ERR_NO_ERROR)
+       {       printf ("%s %d : %s\n\n", __func__, __LINE__, sf_error_number (bcount)) ;
+               while (chunk_iterator)
+                       chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ;
+               free (chunk_info.data) ;
+               chunk_info.data = NULL ;
+               return NULL ;
+               } ;
+
+       while (chunk_iterator)
+               chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ;
+
+       info = alac_pakt_alloc (pakt_size / 4) ;
+
+       /* Start at 24 bytes in, skipping over the 'pakt' chunks header. */
+       for (bcount = 24 ; bcount < pakt_size && value != 0 ; )
+       {       uint8_t byte ;
+               int32_t count = 0 ;
+
+               value = 0 ;
+               do
+               {       byte = pakt_data [bcount + count] ;
+                       value = (value << 7) + (byte & 0x7F) ;
+
+                       count ++ ;
+                       if (count > 5 || bcount + count > pakt_size)
+                       {       printf ("%s %d : Ooops! count %d    bcount %d\n", __func__, __LINE__, count, bcount) ;
+                               value = 0 ;
+                               break ;
+                               } ;
+                       }
+                       while (byte & 0x80) ;
+
+               bcount += count ;
+
+               if ((info = alac_pakt_append (info, value)) == NULL)
+                       goto FreeExit ;
+               } ;
+
+       free (pakt_data) ;
+
+       return info ;
+
+FreeExit :
+       free (pakt_data) ;
+       free (info) ;
+       return NULL ;
+} /* alac_pakt_read_decode */
+
+static uint8_t *
+alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size_out)
+{      const ALAC_PRIVATE *plac ;
+       const PAKT_INFO *info ;
+       uint8_t *data ;
+       uint32_t k, allocated, pakt_size ;
+
+       plac = psf->codec_data ;
+       info = plac->pakt_info ;
+
+       allocated = 100 + 2 * info->count ;
+       if ((data = calloc (1, allocated)) == NULL)
+               return NULL ;
+
+       psf_put_be64 (data, 0, info->count) ;
+       psf_put_be64 (data, 8, psf->sf.frames) ;
+       psf_put_be32 (data, 20, kALACDefaultFramesPerPacket - plac->partial_block_frames) ;
+
+       /* Real 'pakt' data starts after 24 byte header. */
+       pakt_size = 24 ;
+
+       for (k = 0 ; k < info->count ; k++)
+       {       int32_t value = info->packet_size [k] ;
+
+               if ((value & 0x7f) == value)
+               {       data [pakt_size++] = value ;
+                       continue ;
+                       } ;
+
+               if ((value & 0x3fff) == value)
+               {       data [pakt_size++] = (value >> 7) | 0x80 ;
+                       data [pakt_size++] = value & 0x7f ;
+                       continue ;
+                       } ;
+
+               if ((value & 0x1fffff) == value)
+               {       data [pakt_size++] = (value >> 14) | 0x80 ;
+                       data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ;
+                       data [pakt_size++] = value & 0x7f ;
+                       continue ;
+               } ;
+
+               if ((value & 0x0fffffff) == value)
+               {       data [pakt_size++] = (value >> 21) | 0x80 ;
+                       data [pakt_size++] = ((value >> 14) & 0x7f) | 0x80 ;
+                       data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ;
+                       data [pakt_size++] = value & 0x7f ;
+                       continue ;
+                       } ;
+
+               *pakt_size_out = 0 ;
+               free (data) ;
+               return NULL ;
+               } ;
+
+       *pakt_size_out = pakt_size ;
+       return data ;
+} /* alac_pakt_encode */
+
+static sf_count_t
+alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block)
+{      sf_count_t offset = 0 ;
+       uint32_t k ;
+
+       for (k = 0 ; k < block ; k++)
+               offset += info->packet_size [k] ;
+
+       return offset ;
+} /* alac_pakt_block_offset */
+
+static uint32_t
+alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen)
+{      uint32_t marker ;
+       uint64_t kuki_size ;
+
+       if (psf_fseek (psf, kuki_offset, SEEK_SET) != kuki_offset)
+               return 0 ;
+
+       psf_fread (&marker, 1, sizeof (marker), psf) ;
+       if (marker != MAKE_MARKER ('k', 'u', 'k', 'i'))
+               return 0 ;
+
+       psf_fread (&kuki_size, 1, sizeof (kuki_size), psf) ;
+       kuki_size = BE2H_64 (kuki_size) ;
+
+       if (kuki_size == 0 || kuki_size > kuki_maxlen)
+       {       psf_log_printf (psf, "%s : Bad size (%D) of 'kuki' chunk.\n", __func__, kuki_size) ;
+               return 0 ;
+               } ;
+
+       psf_fread (kuki, 1, kuki_size, psf) ;
+
+       return kuki_size ;
+} /* alac_kuki_read */
+
+#define CASE_NAME(x)   case x : return #x ; break ;
+
+static const char *
+alac_error_string (int error)
+{      static char errstr [128] ;
+       switch (error)
+       {       CASE_NAME (kALAC_UnimplementedError) ;
+               CASE_NAME (kALAC_FileNotFoundError) ;
+               CASE_NAME (kALAC_ParamError) ;
+               CASE_NAME (kALAC_MemFullError) ;
+               CASE_NAME (fALAC_FrameLengthError) ;
+
+               /* Added for libsndfile */
+               CASE_NAME (kALAC_BadBitWidth) ;
+               CASE_NAME (kALAC_IncompatibleVersion) ;
+               CASE_NAME (kALAC_BadSpecificConfigSize) ;
+               CASE_NAME (kALAC_ZeroChannelCount) ;
+               CASE_NAME (kALAC_NumSamplesTooBig) ;
+               CASE_NAME (kALAC_UnsupportedElement) ;
+               default :
+                       break ;
+               } ;
+
+       snprintf (errstr, sizeof (errstr), "Unknown error %d", error) ;
+       return errstr ;
+} /* alac_error_string */
+
index 6d06b4b..063fd1a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -286,7 +286,7 @@ unsigned char alaw_encode [2048 + 1] =
        0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
        0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
        0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a
+       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
 } ; /* alaw_encode */
 
 static inline void
@@ -298,7 +298,7 @@ alaw2s_array (unsigned char *buffer, int count, short *ptr)
 static inline void
 alaw2i_array (unsigned char *buffer, int count, int *ptr)
 {      while (--count >= 0)
-               ptr [count] = alaw_decode [(int) buffer [count]] << 16 ;
+               ptr [count] = ((uint32_t) alaw_decode [(int) buffer [count]]) << 16 ;
 } /* alaw2i_array */
 
 static inline void
@@ -358,16 +358,17 @@ d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfa
 
 static sf_count_t
 alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               alaw2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               alaw2s_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -379,16 +380,17 @@ alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               alaw2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               alaw2i_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -400,19 +402,20 @@ alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               alaw2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               alaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -424,18 +427,19 @@ alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double  normfact ;
 
        normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               alaw2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               alaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -450,16 +454,17 @@ alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_write_s2alaw      (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               s2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -471,16 +476,17 @@ alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_write_i2alaw      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               i2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -492,19 +498,20 @@ alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_write_f2alaw      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               f2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -516,19 +523,20 @@ alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 alaw_write_d2alaw      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double  normfact ;
 
        normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               d2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               d2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
index 0ac3bf3..7f76826 100644 (file)
--- a/src/au.c
+++ b/src/au.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -81,8 +81,8 @@ typedef       struct
 {      int             dataoffset ;
        int             datasize ;
        int             encoding ;
-    int                samplerate ;
-    int                channels ;
+       int             samplerate ;
+       int             channels ;
 } AU_FMT ;
 
 
@@ -211,8 +211,6 @@ au_write_header (SF_PRIVATE *psf, int calc_length)
                psf->datalength = psf->filelength - psf->dataoffset ;
                if (psf->dataend)
                        psf->datalength -= psf->filelength - psf->dataend ;
-
-               psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
                } ;
 
        encoding = au_format_to_encoding (SF_CODEC (psf->sf.format)) ;
@@ -439,8 +437,12 @@ au_read_header (SF_PRIVATE *psf)
        {       psf_log_printf (psf, "  Channels    : %d  **** should be >= 1\n", au_fmt.channels) ;
                return SFE_CHANNEL_COUNT_ZERO ;
                }
-       else
-               psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
+       else if (au_fmt.channels > SF_MAX_CHANNELS)
+       {       psf_log_printf (psf, "  Channels    : %d  **** should be <= %d\n", au_fmt.channels, SF_MAX_CHANNELS) ;
+               return SFE_CHANNEL_COUNT ;
+               } ;
+
+       psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
 
        psf->blockwidth = psf->sf.channels * psf->bytewidth ;
 
index 775077e..9cac83b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -60,7 +60,7 @@ audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, in
                        "    be_int_24_32 : %d\n",
                        vote.le_float, vote.be_float, vote.le_int_24_32, vote.be_int_24_32) ;
 
-       if (0) puts (psf->logbuffer) ;
+       if (0) puts (psf->parselog.buf) ;
 
        if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_float > (3 * datalen) / 4)
        {       /* Almost certainly 32 bit floats. */
index dd09b46..a235b0d 100644 (file)
--- a/src/avr.c
+++ b/src/avr.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2004-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -89,8 +89,7 @@ avr_open      (SF_PRIVATE *psf)
                return  SFE_BAD_OPEN_FORMAT ;
 
        if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
-       {       psf->endian = SF_ENDIAN (psf->sf.format) ;
-               psf->endian = SF_ENDIAN_BIG ;
+       {       psf->endian = SF_ENDIAN_BIG ;
 
                if (avr_write_header (psf, SF_FALSE))
                        return psf->error ;
index adfc5f9..6ee609e 100755 (executable)
@@ -48,19 +48,19 @@ def find_binheader_writefs (data):
 def find_format_string (s):
        fmt = re.search ('"([^"]+)"', s)
        if not fmt:
-               print "Bad format in :\n\n\t%s\n\n" % s
+               print ("Bad format in :\n\n\t%s\n\n" % s)
                sys.exit (1)
        fmt = fmt.groups ()
        if len (fmt) != 1:
-               print "Bad format in :\n\n\t%s\n\n" % s
+               print ("Bad format in :\n\n\t%s\n\n" % s)
                sys.exit (1)
        return _whitespace_re.sub ("", fmt [0])
 
 def get_param_list (data):
        dlist = re.search ("\((.+)\)\s*;", data)
        dlist = dlist.groups ()[0]
-       dlist = string.split (dlist, ",")
-       dlist = [string.strip (x) for x in dlist]
+       dlist = dlist.split(",")
+       dlist = [x.strip() for x in dlist]
        return dlist [2:]
 
 def handle_file (fname):
@@ -88,13 +88,14 @@ def handle_file (fname):
                        # print item
                        # print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
 
-                       if string.find (params [param_index + 1], "sizeof") < 0 \
-                                               and string.find (params [param_index + 1], "make_size_t") < 0 \
-                                               and string.find (params [param_index + 1], "strlen") < 0:
-                               if errors == 0: print
-                               print "\n%s :" % fname
-                               print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
-                               print "    %s" % item
+                       # print (params [param_index + 1])
+                       if params [param_index + 1].find ("sizeof") < 0 \
+                                               and params [param_index + 1].find ("make_size_t") < 0 \
+                                               and params [param_index + 1].find ("strlen") < 0:
+                               if errors == 0: sys.stdout.write ("\n")
+                               print ("\n%s :" % fname)
+                               print ("    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1]))
+                               print ("    %s" % item)
                                errors += 1
                        param_index += 2
 
@@ -103,14 +104,14 @@ def handle_file (fname):
 #===============================================================================
 
 if len (sys.argv) > 1:
-       print "\n    binheader_writef_check                   :",
+       sys.stdout.write ("\n    binheader_writef_check                   :")
        sys.stdout.flush ()
        errors = 0
        for fname in sys.argv [1:]:
                errors += handle_file (fname)
        if errors > 0:
-               print "\nErrors : %d\n" % errors
+               print ("\nErrors : %d\n" % errors)
                sys.exit (1)
 
-print "ok\n"
+print ("ok\n")
 
index 975ee84..128a6a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2006 Paul Davis <paul@linuxaudiosystems.com>
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -60,11 +60,12 @@ broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * info, size_t datas
 
        if (psf->broadcast_16k == NULL)
        {       if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL)
-               {       psf->error = SFE_MALLOC_FAILED   ;
+               {       psf->error = SFE_MALLOC_FAILED ;
                        return SF_FALSE ;
                        } ;
                } ;
 
+       /* Only copy the first part of the struct. */
        memcpy (psf->broadcast_16k, info, offsetof (SF_BROADCAST_INFO, coding_history)) ;
 
        psf_strlcpy_crlf (psf->broadcast_16k->coding_history, info->coding_history, sizeof (psf->broadcast_16k->coding_history), datasize - offsetof (SF_BROADCAST_INFO, coding_history)) ;
@@ -82,7 +83,7 @@ broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * info, size_t datas
 
        /* Force coding_history_size to be even. */
        len = strlen (psf->broadcast_16k->coding_history) ;
-       len += (len & 1) ? 1 : 2 ;
+       len += (len & 1) ? 1 : 0 ;
        psf->broadcast_16k->coding_history_size = len ;
 
        /* Currently writing this version. */
@@ -120,16 +121,16 @@ gen_coding_history (char * added_history, int added_history_max, const SF_INFO *
        **      Parameter            Variable string <allowed option>                 Unit
        **      ==========================================================================================
        **      Coding Algorithm     A=<ANALOGUE, PCM, MPEG1L1, MPEG1L2, MPEG1L3,
-       **                           MPEG2L1, MPEG2L2, MPEG2L3>
+       **                          MPEG2L1, MPEG2L2, MPEG2L3>
        **      Sampling frequency   F=<11000,22050,24000,32000,44100,48000>          [Hz]
        **      Bit-rate             B=<any bit-rate allowed in MPEG 2 (ISO/IEC       [kbit/s per channel]
-       **                           13818-3)>
+       **                          13818-3)>
        **      Word Length          W=<8, 12, 14, 16, 18, 20, 22, 24>                [bits]
        **      Mode                 M=<mono, stereo, dual-mono, joint-stereo>
        **      Text, free string    T=<a free ASCII-text string for in house use.
-       **                           This string should contain no commas (ASCII
-       **                           2Chex). Examples of the contents: ID-No; codec
-       **                           type; A/D type>
+       **                          This string should contain no commas (ASCII
+       **                          2Chex). Examples of the contents: ID-No; codec
+       **                          type; A/D type>
        */
 
        switch (psfinfo->channels)
@@ -179,7 +180,7 @@ gen_coding_history (char * added_history, int added_history_max, const SF_INFO *
                } ;
 
        count = snprintf (added_history, added_history_max,
-                                                       "A=PCM,F=%u,W=%hu,M=%s,T=%s-%s\r\n",
+                                                       "A=PCM,F=%u,W=%d,M=%s,T=%s-%s\r\n",
                                                        psfinfo->samplerate, width, chnstr, PACKAGE, VERSION) ;
 
        if (count >= added_history_max)
index 99e9117..c1893a1 100644 (file)
--- a/src/caf.c
+++ b/src/caf.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2005-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 */
 
 typedef struct
-{      unsigned char srate [8] ;
-       unsigned int fmt_id ;
-       unsigned int fmt_flags ;
-       unsigned int pkt_bytes ;
-       unsigned int pkt_frames ;
-       unsigned int channels_per_frame ;
-       unsigned int bits_per_chan ;
+{      uint8_t         srate [8] ;
+       uint32_t        fmt_id ;
+       uint32_t        fmt_flags ;
+       uint32_t        pkt_bytes ;
+       uint32_t        frames_per_packet ;
+       uint32_t        channels_per_frame ;
+       uint32_t        bits_per_chan ;
 } DESC_CHUNK ;
 
 typedef struct
-{      int chanmap_tag ;
+{      int                     chanmap_tag ;
+
+       ALAC_DECODER_INFO       alac ;
 } CAF_PRIVATE ;
 
 /*------------------------------------------------------------------------------
@@ -98,24 +100,36 @@ static int caf_write_header (SF_PRIVATE *psf, int calc_length) ;
 static int     caf_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
 static int     caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) ;
 
+static int caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ;
+static SF_CHUNK_ITERATOR * caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ;
+static int caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+static int caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+
 /*------------------------------------------------------------------------------
 ** Public function.
 */
 
 int
 caf_open (SF_PRIVATE *psf)
-{      int     subformat, format, error = 0 ;
+{      CAF_PRIVATE * pcaf ;
+       int     subformat, format, error = 0 ;
+
+       if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL)
+               return SFE_MALLOC_FAILED ;
+
+       pcaf = psf->container_data ;
 
        if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
        {       if ((error = caf_read_header (psf)))
                        return error ;
+
+               psf->next_chunk_iterator = caf_next_chunk_iterator ;
+               psf->get_chunk_size = caf_get_chunk_size ;
+               psf->get_chunk_data = caf_get_chunk_data ;
                } ;
 
        subformat = SF_CODEC (psf->sf.format) ;
 
-       if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL)
-               return SFE_MALLOC_FAILED ;
-
        if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
        {       if (psf->is_pipe)
                        return SFE_NO_PIPE_WRITE ;
@@ -133,7 +147,7 @@ caf_open (SF_PRIVATE *psf)
                        psf->sf.frames = 0 ;
                        } ;
 
-               psf->str_flags = SF_STR_ALLOW_START ;
+               psf->strings.flags = SF_STR_ALLOW_START ;
 
                /*
                **      By default, add the peak chunk to floating point files. Default behaviour
@@ -148,7 +162,8 @@ caf_open (SF_PRIVATE *psf)
                if ((error = caf_write_header (psf, SF_FALSE)) != 0)
                        return error ;
 
-               psf->write_header = caf_write_header ;
+               psf->write_header       = caf_write_header ;
+               psf->set_chunk          = caf_set_chunk ;
                } ;
 
        psf->container_close = caf_close ;
@@ -178,6 +193,18 @@ caf_open (SF_PRIVATE *psf)
                case SF_FORMAT_DOUBLE :
                                        error = double64_init (psf) ;
                                        break ;
+
+               case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                                       if (psf->file.mode == SFM_READ)
+                                               /* Only pass the ALAC_DECODER_INFO in read mode. */
+                                               error = alac_init (psf, &pcaf->alac) ;
+                                       else
+                                               error = alac_init (psf, NULL) ;
+                                       break ;
+
                /* Lite remove end */
 
                default :
@@ -220,11 +247,42 @@ caf_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (da
 
 static int
 decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc)
-{      int format ;
+{      int format = SF_FORMAT_CAF ;
 
        psf->sf.channels = desc->channels_per_frame ;
 
-       format = SF_FORMAT_CAF | (psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0) ;
+       if (desc->fmt_id == alac_MARKER)
+       {       CAF_PRIVATE     *pcaf ;
+
+               if ((pcaf = psf->container_data) != NULL)
+               {       switch (desc->fmt_flags)
+                       {       case 1 :
+                                       pcaf->alac.bits_per_sample = 16 ;
+                                       format |= SF_FORMAT_ALAC_16 ;
+                                       break ;
+                               case 2 :
+                                       pcaf->alac.bits_per_sample = 20 ;
+                                       format |= SF_FORMAT_ALAC_20 ;
+                                       break ;
+                               case 3 :
+                                       pcaf->alac.bits_per_sample = 24 ;
+                                       format |= SF_FORMAT_ALAC_24 ;
+                                       break ;
+                               case 4 :
+                                       pcaf->alac.bits_per_sample = 32 ;
+                                       format |= SF_FORMAT_ALAC_32 ;
+                                       break ;
+                               default :
+                                       psf_log_printf (psf, "Bad ALAC format flag value of %d\n", desc->fmt_flags) ;
+                               } ;
+
+                       pcaf->alac.frames_per_packet = desc->frames_per_packet ;
+                       } ;
+
+               return format ;
+               } ;
+
+       format |= psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0 ;
 
        if (desc->fmt_id == lpcm_MARKER && desc->fmt_flags & 1)
        {       /* Floating point data. */
@@ -238,12 +296,7 @@ decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc)
                        } ;
                } ;
 
-       if ((desc->fmt_flags & 1) != 0)
-       {       psf_log_printf (psf, "**** Ooops, 'desc' chunk suggests float data, but other info invalid.\n") ;
-               return 0 ;
-               } ;
-
-       if (desc->fmt_id == lpcm_MARKER)
+       if (desc->fmt_id == lpcm_MARKER && (desc->fmt_flags & 1) == 0)
        {       /* Integer data. */
                if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame)
                {       psf->bytewidth = 4 ;
@@ -273,17 +326,24 @@ decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc)
                return format | SF_FORMAT_ULAW ;
                } ;
 
+       psf_log_printf (psf, "**** Unknown format identifier.\n") ;
+
        return 0 ;
 } /* decode_desc_chunk */
 
 static int
 caf_read_header (SF_PRIVATE *psf)
-{      DESC_CHUNK desc ;
+{      CAF_PRIVATE     *pcaf ;
+       BUF_UNION       ubuf ;
+       DESC_CHUNK desc ;
        sf_count_t chunk_size ;
        double srate ;
        short version, flags ;
        int marker, k, have_data = 0, error ;
 
+       if ((pcaf = psf->container_data) == NULL)
+               return SFE_INTERNAL ;
+
        memset (&desc, 0, sizeof (desc)) ;
 
        /* Set position to start of file to begin reading header. */
@@ -292,10 +352,10 @@ caf_read_header (SF_PRIVATE *psf)
        if (marker != caff_MARKER)
                return SFE_CAF_NOT_CAF ;
 
-       psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, psf->u.ucbuf, 8) ;
-       srate = double64_be_read (psf->u.ucbuf) ;
-       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%5.3f", srate) ;
-       psf_log_printf (psf, "%M : %D\n  Sample rate  : %s\n", marker, chunk_size, psf->u.cbuf) ;
+       psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, ubuf.ucbuf, 8) ;
+       srate = double64_be_read (ubuf.ucbuf) ;
+       snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), "%5.3f", srate) ;
+       psf_log_printf (psf, "%M : %D\n  Sample rate  : %s\n", marker, chunk_size, ubuf.cbuf) ;
        if (marker != desc_MARKER)
                return SFE_CAF_NO_DESC ;
 
@@ -306,11 +366,11 @@ caf_read_header (SF_PRIVATE *psf)
 
        psf->sf.samplerate = lrint (srate) ;
 
-       psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.pkt_frames,
+       psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.frames_per_packet,
                        &desc.channels_per_frame, &desc.bits_per_chan) ;
        psf_log_printf (psf, "  Format id    : %M\n  Format flags : %x\n  Bytes / packet   : %u\n"
                        "  Frames / packet  : %u\n  Channels / frame : %u\n  Bits / channel   : %u\n",
-                       desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
+                       desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.frames_per_packet, desc.channels_per_frame, desc.bits_per_chan) ;
 
        if (desc.channels_per_frame > SF_MAX_CHANNELS)
        {       psf_log_printf (psf, "**** Bad channels per frame value %u.\n", desc.channels_per_frame) ;
@@ -322,14 +382,28 @@ caf_read_header (SF_PRIVATE *psf)
 
        psf->sf.channels = desc.channels_per_frame ;
 
-       while (have_data == 0 && psf_ftell (psf) < psf->filelength - SIGNED_SIZEOF (marker))
-       {       psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ;
+       while (1)
+       {       marker = 0 ;
+               chunk_size = 0 ;
+
+               psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ;
+               if (marker == 0)
+               {       sf_count_t pos = psf_ftell (psf) ;
+                       psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ;
+                       break ;
+                       } ;
+               if (chunk_size < 0)
+               {       psf_log_printf (psf, "%M : %D *** Should be >= 0 ***\n", marker, chunk_size) ;
+                       break ;
+                       } ;
+
+               psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ;
 
                switch (marker)
                {       case peak_MARKER :
                                psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
                                if (chunk_size != CAF_PEAK_CHUNK_SIZE (psf->sf.channels))
-                               {       psf_binheader_readf (psf, "j", (int) chunk_size) ;
+                               {       psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
                                        psf_log_printf (psf, "*** File PEAK chunk %D should be %d.\n", chunk_size, CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
                                        return SFE_CAF_BAD_PEAK ;
                                        } ;
@@ -350,8 +424,8 @@ caf_read_header (SF_PRIVATE *psf)
                                        psf->peak_info->peaks [k].value = value ;
                                        psf->peak_info->peaks [k].position = position ;
 
-                                       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "    %2d   %-12" PRId64 "   %g\n", k, position, value) ;
-                                       psf_log_printf (psf, psf->u.cbuf) ;
+                                       snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), "    %2d   %-12" PRId64 "   %g\n", k, position, value) ;
+                                       psf_log_printf (psf, ubuf.cbuf) ;
                                        } ;
 
                                psf->peak_info->peak_loc = SF_PEAK_START ;
@@ -360,7 +434,7 @@ caf_read_header (SF_PRIVATE *psf)
                        case chan_MARKER :
                                if (chunk_size < 12)
                                {       psf_log_printf (psf, "%M : %D (should be >= 12)\n", marker, chunk_size) ;
-                                       psf_binheader_readf (psf, "j", (int) chunk_size) ;
+                                       psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
                                        break ;
                                        }
 
@@ -372,24 +446,76 @@ caf_read_header (SF_PRIVATE *psf)
 
                        case free_MARKER :
                                psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
-                               psf_binheader_readf (psf, "j", (int) chunk_size) ;
+                               psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
                                break ;
 
                        case data_MARKER :
-                               if (psf->filelength > 0 && chunk_size + psf->headindex != psf->filelength)
-                                       psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, chunk_size + 4) ;
+                               psf_binheader_readf (psf, "E4", &k) ;
+                               if (chunk_size == -1)
+                               {       psf_log_printf (psf, "%M : -1\n") ;
+                                       chunk_size = psf->filelength - psf->headindex ;
+                                       }
+                               else if (psf->filelength > 0 && psf->filelength < psf->headindex + chunk_size - 16)
+                                       psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, psf->filelength - psf->headindex - 8) ;
                                else
                                        psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
-                               psf_binheader_readf (psf, "E4", &k) ;
+
                                psf_log_printf (psf, "  edit : %u\n", k) ;
+
+                               psf->dataoffset = psf->headindex ;
+
+                               /* Subtract the 4 bytes of the 'edit' field above. */
+                               psf->datalength = chunk_size - 4 ;
+
+                               psf_binheader_readf (psf, "j", make_size_t (psf->datalength)) ;
                                have_data = 1 ;
                                break ;
 
+                       case kuki_MARKER :
+                               psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+                               pcaf->alac.kuki_offset = psf_ftell (psf) - 12 ;
+                               psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
+                               break ;
+
+                       case pakt_MARKER :
+                               psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+
+                               psf_binheader_readf (psf, "E8844", &pcaf->alac.packets, &pcaf->alac.valid_frames,
+                                                                       &pcaf->alac.priming_frames, &pcaf->alac.remainder_frames) ;
+
+                               psf_log_printf (psf,
+                                               "  Packets          : %D\n"
+                                               "  Valid frames     : %D\n"
+                                               "  Priming frames   : %d\n"
+                                               "  Remainder frames : %d\n",
+                                               pcaf->alac.packets, pcaf->alac.valid_frames, pcaf->alac.priming_frames,
+                                               pcaf->alac.remainder_frames
+                                               ) ;
+
+                               if (pcaf->alac.packets == 0 && pcaf->alac.valid_frames == 0
+                                                       && pcaf->alac.priming_frames == 0 && pcaf->alac.remainder_frames == 0)
+                                       psf_log_printf (psf, "*** 'pakt' chunk header is all zero.\n") ;
+
+                               pcaf->alac.pakt_offset = psf_ftell (psf) - 12 ;
+                               psf_binheader_readf (psf, "j", make_size_t (chunk_size) - 24) ;
+                               break ;
+
                        default :
-                               psf_log_printf (psf, " %M : %D (skipped)\n", marker, chunk_size) ;
-                               psf_binheader_readf (psf, "j", (int) chunk_size) ;
+                               psf_log_printf (psf, "%M : %D (skipped)\n", marker, chunk_size) ;
+                               psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ;
                                break ;
                        } ;
+
+               if (marker != data_MARKER && chunk_size >= 0xffffff00)
+                       break ;
+
+               if (! psf->sf.seekable && have_data)
+                       break ;
+
+               if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size))
+               {       psf_log_printf (psf, "End\n") ;
+                       break ;
+                       } ;
                } ;
 
        if (have_data == 0)
@@ -397,12 +523,10 @@ caf_read_header (SF_PRIVATE *psf)
                return SFE_MALFORMED_FILE ;
                } ;
 
-       psf_log_printf (psf, "End\n") ;
-
-       psf->dataoffset = psf_ftell (psf) ;
-       psf->datalength = psf->filelength - psf->dataoffset ;
        psf->endian = (desc.fmt_flags & 2) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
 
+       psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
        if ((psf->sf.format = decode_desc_chunk (psf, &desc)) == 0)
                return SFE_UNSUPPORTED_ENCODING ;
 
@@ -417,10 +541,12 @@ caf_read_header (SF_PRIVATE *psf)
 
 static int
 caf_write_header (SF_PRIVATE *psf, int calc_length)
-{      CAF_PRIVATE     *pcaf ;
+{      BUF_UNION       ubuf ;
+       CAF_PRIVATE     *pcaf ;
        DESC_CHUNK desc ;
        sf_count_t current, free_len ;
-       int subformat ;
+       uint32_t uk ;
+       int subformat, append_free_block = SF_TRUE ;
 
        if ((pcaf = psf->container_data) == NULL)
                return SFE_INTERNAL ;
@@ -452,8 +578,8 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
        /* 'desc' marker and chunk size. */
        psf_binheader_writef (psf, "Em8", desc_MARKER, (sf_count_t) (sizeof (DESC_CHUNK))) ;
 
-       double64_be_write (1.0 * psf->sf.samplerate, psf->u.ucbuf) ;
-       psf_binheader_writef (psf, "b", psf->u.ucbuf, make_size_t (8)) ;
+       double64_be_write (1.0 * psf->sf.samplerate, ubuf.ucbuf) ;
+       psf_binheader_writef (psf, "b", ubuf.ucbuf, make_size_t (8)) ;
 
        subformat = SF_CODEC (psf->sf.format) ;
 
@@ -475,7 +601,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_id = lpcm_MARKER ;
                        psf->bytewidth = 1 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 8 ;
                        break ;
@@ -484,7 +610,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_id = lpcm_MARKER ;
                        psf->bytewidth = 2 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 16 ;
                        break ;
@@ -492,7 +618,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                case SF_FORMAT_PCM_24 :
                        psf->bytewidth = 3 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 24 ;
                        desc.fmt_id = lpcm_MARKER ;
@@ -502,7 +628,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_id = lpcm_MARKER ;
                        psf->bytewidth = 4 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 32 ;
                        break ;
@@ -512,7 +638,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_flags |= 1 ;
                        psf->bytewidth = 4 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 32 ;
                        break ;
@@ -522,7 +648,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_flags |= 1 ;
                        psf->bytewidth = 8 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 64 ;
                        break ;
@@ -531,7 +657,7 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_id = alaw_MARKER ;
                        psf->bytewidth = 1 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 8 ;
                        break ;
@@ -540,19 +666,30 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
                        desc.fmt_id = ulaw_MARKER ;
                        psf->bytewidth = 1 ;
                        desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
-                       desc.pkt_frames = 1 ;
+                       desc.frames_per_packet = 1 ;
                        desc.channels_per_frame = psf->sf.channels ;
                        desc.bits_per_chan = 8 ;
                        break ;
 
+               case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       desc.fmt_id = alac_MARKER ;
+                       desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+                       desc.channels_per_frame = psf->sf.channels ;
+                       alac_get_desc_chunk_items (subformat, &desc.fmt_flags, &desc.frames_per_packet) ;
+                       append_free_block = SF_FALSE ;
+                       break ;
+
                default :
                        return SFE_UNIMPLEMENTED ;
                } ;
 
-       psf_binheader_writef (psf, "mE44444", desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
+       psf_binheader_writef (psf, "mE44444", desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.frames_per_packet, desc.channels_per_frame, desc.bits_per_chan) ;
 
 #if 0
-       if (psf->str_flags & SF_STR_LOCATE_START)
+       if (psf->strings.flags & SF_STR_LOCATE_START)
                caf_write_strings (psf, SF_STR_LOCATE_START) ;
 #endif
 
@@ -566,11 +703,17 @@ caf_write_header (SF_PRIVATE *psf, int calc_length)
        if (psf->channel_map && pcaf->chanmap_tag)
                psf_binheader_writef (psf, "Em8444", chan_MARKER, (sf_count_t) 12, pcaf->chanmap_tag, 0, 0) ;
 
-       /* Add free chunk so that the actual audio data starts at a multiple 0x1000. */
-       free_len = 0x1000 - psf->headindex - 16 - 12 ;
-       while (free_len < 0)
-               free_len += 0x1000 ;
-       psf_binheader_writef (psf, "Em8z", free_MARKER, free_len, (int) free_len) ;
+       /* Write custom headers. */
+       for (uk = 0 ; uk < psf->wchunks.used ; uk++)
+               psf_binheader_writef (psf, "m44b", (int) psf->wchunks.chunks [uk].mark32, 0, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ;
+
+       if (append_free_block)
+       {       /* Add free chunk so that the actual audio data starts at a multiple 0x1000. */
+               free_len = 0x1000 - psf->headindex - 16 - 12 ;
+               while (free_len < 0)
+                       free_len += 0x1000 ;
+               psf_binheader_writef (psf, "Em8z", free_MARKER, free_len, (int) free_len) ;
+               } ;
 
        psf_binheader_writef (psf, "Em84", data_MARKER, psf->datalength + 4, 0) ;
 
@@ -604,8 +747,8 @@ caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size)
        if (bytesread < chunk_size)
                psf_binheader_readf (psf, "j", chunk_size - bytesread) ;
 
-       if (map_info->channel_map != NULL)
-       {       size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ;
+       if (map_info && map_info->channel_map != NULL)
+       {       size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xff) * sizeof (psf->channel_map [0]) ;
 
                free (psf->channel_map) ;
 
@@ -618,3 +761,49 @@ caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size)
        return 0 ;
 } /* caf_read_chanmap */
 
+/*==============================================================================
+*/
+
+static int
+caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info)
+{      return psf_save_write_chunk (&psf->wchunks, chunk_info) ;
+} /* caf_set_chunk */
+
+static SF_CHUNK_ITERATOR *
+caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator)
+{      return psf_next_chunk_iterator (&psf->rchunks, iterator) ;
+} /* caf_next_chunk_iterator */
+
+static int
+caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      int indx ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       chunk_info->datalen = psf->rchunks.chunks [indx].len ;
+
+       return SFE_NO_ERROR ;
+} /* caf_get_chunk_size */
+
+static int
+caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      int indx ;
+       sf_count_t pos ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       if (chunk_info->data == NULL)
+               return SFE_BAD_CHUNK_DATA_PTR ;
+
+       chunk_info->id_size = psf->rchunks.chunks [indx].id_size ;
+       memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ;
+
+       pos = psf_ftell (psf) ;
+       psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ;
+       psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ;
+       psf_fseek (psf, pos, SEEK_SET) ;
+
+       return SFE_NO_ERROR ;
+} /* caf_get_chunk_data */
diff --git a/src/cart.c b/src/cart.c
new file mode 100644 (file)
index 0000000..a56ed60
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+** Copyright (C) 2012 Chris Roberts <c.roberts@csrfm.com>
+** Copyright (C) 2006-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006 Paul Davis <paul@linuxaudiosystems.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
+#include "common.h"
+
+
+
+static inline size_t
+cart_min_size (const SF_CART_INFO* info)
+{      if (info == NULL)
+               return 0 ;
+
+       return offsetof (SF_CART_INFO, tag_text) + info->tag_text_size ;
+} /* cart_min_size */
+
+SF_CART_INFO_16K*
+cart_var_alloc (void)
+{      SF_CART_INFO_16K* thing ;
+       thing = malloc (sizeof (SF_CART_INFO_16K)) ;
+       return thing ;
+} /* cart_var_alloc */
+
+int
+cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * info, size_t datasize)
+{      size_t len ;
+
+       if (info == NULL)
+               return SF_FALSE ;
+
+       if (cart_min_size (info) > datasize)
+       {       psf->error = SFE_BAD_CART_INFO_SIZE ;
+               return SF_FALSE ;
+               } ;
+
+       if (datasize >= sizeof (SF_CART_INFO_16K))
+       {       psf->error = SFE_BAD_CART_INFO_TOO_BIG ;
+               return SF_FALSE ;
+               } ;
+
+       if (psf->cart_16k == NULL)
+       {       if ((psf->cart_16k = cart_var_alloc ()) == NULL)
+               {       psf->error = SFE_MALLOC_FAILED ;
+                       return SF_FALSE ;
+                       } ;
+               } ;
+
+       memcpy (psf->cart_16k, info, offsetof (SF_CART_INFO, tag_text)) ;
+       psf_strlcpy_crlf (psf->cart_16k->tag_text, info->tag_text, sizeof (psf->cart_16k->tag_text), datasize - offsetof (SF_CART_INFO, tag_text)) ;
+
+       len = strlen (psf->cart_16k->tag_text) ;
+
+       if (len > 0 && psf->cart_16k->tag_text [len - 1] != '\n')
+               psf_strlcat (psf->cart_16k->tag_text, sizeof (psf->cart_16k->tag_text), "\r\n") ;
+
+       /* Force tag_text_size to be even. */
+       len = strlen (psf->cart_16k->tag_text) ;
+       len += (len & 1) ? 1 : 2 ;
+
+       psf->cart_16k->tag_text_size = len ;
+
+       return SF_TRUE ;
+} /* cart_var_set */
+
+
+int
+cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize)
+{      size_t size ;
+       if (psf->cart_16k == NULL)
+               return SF_FALSE ;
+
+       size = SF_MIN (datasize, cart_min_size ((const SF_CART_INFO *) psf->cart_16k)) ;
+
+       memcpy (data, psf->cart_16k, size) ;
+
+       return SF_TRUE ;
+} /* cart_var_get */
+
+
index 9a9f7f0..c06702c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2009-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -228,7 +228,7 @@ aiff_caf_find_channel_layout_tag (const int *chan_map, int channels)
 {      const AIFF_CAF_CHANNEL_MAP * curr_map ;
        unsigned k, len ;
 
-       if (channels < 1 || channels > ARRAY_LEN (map))
+       if (channels < 1 || channels >= ARRAY_LEN (map))
                return 0 ;
 
        curr_map = map [channels].map ;
@@ -248,7 +248,7 @@ aiff_caf_of_channel_layout_tag (int tag)
        unsigned k, len ;
        int channels = tag & 0xffff ;
 
-       if (channels < 0 || channels > ARRAY_LEN (map))
+       if (channels < 0 || channels >= ARRAY_LEN (map))
                return NULL ;
 
        curr_map = map [channels].map ;
index dc17aae..b661ce5 100644 (file)
@@ -1,5 +1,6 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2012 IOhannes m zmoelnig, IEM <zmoelnig@iem.at>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 #include       "sfendian.h"
 #include       "common.h"
 
+static int64_t
+hash_of_str (const char * str)
+{      int64_t marker = 0 ;
+       int k ;
 
-void
-pchk4_store (PRIV_CHUNK4 * pchk, int marker, sf_count_t offset, sf_count_t len)
-{
-       if (pchk->count >= ARRAY_LEN (pchk->l))
-               return ;
+       for (k = 0 ; str [k] ; k++)
+               marker = marker * 0x7f + ((const uint8_t *) str) [k] ;
 
-       pchk->l [pchk->count].chunk = marker ;
-       pchk->l [pchk->count].offset = offset ;
-       pchk->l [pchk->count].len = len ;
+       return marker ;
+} /* hash_of_str */
 
-       pchk->count ++ ;
+SF_CHUNK_ITERATOR *
+psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str)
+{      const READ_CHUNKS * pchk = &psf->rchunks ;
+       int idx ;
 
-       return ;
-} /* pchk4_store */
+       if (marker_str)
+               idx = psf_find_read_chunk_str (pchk, marker_str) ;
+       else
+               idx = pchk->used > 0 ? 0 : -1 ;
+
+       if (idx < 0)
+               return NULL ;
+
+       if (psf->iterator == NULL)
+       {       psf->iterator = calloc (1, sizeof (SF_CHUNK_ITERATOR)) ;
+               if (psf->iterator == NULL)
+                       return NULL ;
+               } ;
+
+       psf->iterator->sndfile = (SNDFILE *) psf ;
+
+       if (marker_str)
+       {       int64_t hash ;
+               size_t marker_len ;
+               union
+               {       uint32_t marker ;
+                       char str [5] ;
+               } u ;
+
+               snprintf (u.str, sizeof (u.str), "%s", marker_str) ;
+
+               marker_len = strlen (marker_str) ;
+               if (marker_len > 64)
+                       marker_len = 64 ;
+
+               hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ;
+
+               memcpy (psf->iterator->id, marker_str, marker_len) ;
+               psf->iterator->id_size = marker_len ;
+               psf->iterator->hash = hash ;
+               }
+
+       psf->iterator->current = idx ;
+
+       return psf->iterator ;
+} /* psf_get_chunk_iterator */
+
+SF_CHUNK_ITERATOR *
+psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR * iterator)
+{      int64_t hash = iterator->hash ;
+       uint32_t k ;
+
+       iterator->current++ ;
+
+       if (hash)
+       {       for (k = iterator->current ; k < pchk->used ; k++)
+                       if (pchk->chunks [k].hash == hash)
+                       {       iterator->current = k ;
+                               return iterator ;
+                               }
+               }
+       else if (iterator->current < pchk->used)
+               return iterator ;
+
+       /* No match, clear iterator and return NULL */
+       memset (iterator, 0, sizeof (*iterator)) ;
+       return NULL ;
+} /* psf_next_chunk_iterator */
+
+static int
+psf_store_read_chunk (READ_CHUNKS * pchk, const READ_CHUNK * rchunk)
+{      if (pchk->count == 0)
+       {       pchk->used = 0 ;
+               pchk->count = 20 ;
+               pchk->chunks = calloc (pchk->count, sizeof (READ_CHUNK)) ;
+               }
+       else if (pchk->used > pchk->count)
+               return SFE_INTERNAL ;
+       else if (pchk->used == pchk->count)
+       {       READ_CHUNK * old_ptr = pchk->chunks ;
+               int new_count = 3 * (pchk->count + 1) / 2 ;
+
+               pchk->chunks = realloc (old_ptr, new_count * sizeof (READ_CHUNK)) ;
+               if (pchk->chunks == NULL)
+               {       pchk->chunks = old_ptr ;
+                       return SFE_MALLOC_FAILED ;
+                       } ;
+               pchk->count = new_count ;
+               } ;
+
+       pchk->chunks [pchk->used] = *rchunk ;
+
+       pchk->used ++ ;
+
+       return SFE_NO_ERROR ;
+} /* psf_store_read_chunk */
+
+int
+psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len)
+{      READ_CHUNK rchunk ;
+
+       memset (&rchunk, 0, sizeof (rchunk)) ;
+
+       rchunk.hash = marker ;
+       rchunk.mark32 = marker ;
+       rchunk.offset = offset ;
+       rchunk.len = len ;
+
+       rchunk.id_size = 4 ;
+       memcpy (rchunk.id, &marker, rchunk.id_size) ;
+
+       return psf_store_read_chunk (pchk, &rchunk) ;
+} /* psf_store_read_chunk_u32 */
+
+int
+psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker_str)
+{      int64_t hash ;
+       uint32_t k ;
+       union
+       {       uint32_t marker ;
+               char str [5] ;
+       } u ;
+
+       snprintf (u.str, sizeof (u.str), "%s", marker_str) ;
+
+       hash = strlen (marker_str) > 4 ? hash_of_str (marker_str) : u.marker ;
+
+       for (k = 0 ; k < pchk->used ; k++)
+               if (pchk->chunks [k].hash == hash)
+                       return k ;
+
+       return -1 ;
+} /* psf_find_read_chunk_str */
 
 int
-pchk4_find (PRIV_CHUNK4 * pchk, int marker)
-{      int k ;
+psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker)
+{      uint32_t k ;
 
-       for (k = 0 ; k < pchk->count ; k++)
-               if (pchk->l [k].chunk == marker)
+       for (k = 0 ; k < pchk->used ; k++)
+               if (pchk->chunks [k].mark32 == marker)
                        return k ;
 
        return -1 ;
-} /* pchk4_find */
+} /* psf_find_read_chunk_m32 */
+int
+psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker)
+{      if (marker->current < pchk->used)
+               return marker->current ;
+
+       return -1 ;
+} /* psf_find_read_chunk_iterator */
+
+int
+psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker_str, sf_count_t offset, uint32_t len)
+{      READ_CHUNK rchunk ;
+       union
+       {       uint32_t marker ;
+               char str [5] ;
+       } u ;
+       size_t marker_len ;
+
+       memset (&rchunk, 0, sizeof (rchunk)) ;
+       snprintf (u.str, sizeof (u.str), "%s", marker_str) ;
+
+       marker_len = strlen (marker_str) ;
+
+       rchunk.hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ;
+       rchunk.mark32 = u.marker ;
+       rchunk.offset = offset ;
+       rchunk.len = len ;
+
+       rchunk.id_size = marker_len > 64 ? 64 : marker_len ;
+       memcpy (rchunk.id, marker_str, rchunk.id_size) ;
+
+       return psf_store_read_chunk (pchk, &rchunk) ;
+} /* psf_store_read_chunk_str */
+
+int
+psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info)
+{      union
+       {       uint32_t marker ;
+               char str [5] ;
+       } u ;
+       uint32_t len ;
+
+       if (pchk->count == 0)
+       {       pchk->used = 0 ;
+               pchk->count = 20 ;
+               pchk->chunks = calloc (pchk->count, sizeof (WRITE_CHUNK)) ;
+               }
+       else if (pchk->used >= pchk->count)
+       {       WRITE_CHUNK * old_ptr = pchk->chunks ;
+               int new_count = 3 * (pchk->count + 1) / 2 ;
+
+               pchk->chunks = realloc (old_ptr, new_count * sizeof (WRITE_CHUNK)) ;
+               if (pchk->chunks == NULL)
+               {       pchk->chunks = old_ptr ;
+                       return SFE_MALLOC_FAILED ;
+                       } ;
+               } ;
+
+       len = chunk_info->datalen ;
+       while (len & 3) len ++ ;
+
+       snprintf (u.str, sizeof (u.str), "%s", chunk_info->id) ;
+
+       pchk->chunks [pchk->used].hash = strlen (chunk_info->id) > 4 ? hash_of_str (chunk_info->id) : u.marker ;
+       pchk->chunks [pchk->used].mark32 = u.marker ;
+       pchk->chunks [pchk->used].len = len ;
+       pchk->chunks [pchk->used].data = psf_memdup (chunk_info->data, chunk_info->datalen) ;
+
+       pchk->used ++ ;
+
+       return SFE_NO_ERROR ;
+} /* psf_save_write_chunk */
 
index aae2a27..963f6eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -47,6 +47,10 @@ static SF_FORMAT_INFO const simple_formats [] =
                "AU (Sun/Next 8-bit u-law)", "au"
                },
 
+       {       SF_FORMAT_CAF | SF_FORMAT_ALAC_16,
+               "CAF (Apple 16 bit ALAC)", "caf"
+               },
+
        {       SF_FORMAT_CAF | SF_FORMAT_PCM_16,
                "CAF (Apple 16 bit PCM)", "caf"
                },
@@ -115,10 +119,10 @@ static SF_FORMAT_INFO const major_formats [] =
 {
        {       SF_FORMAT_AIFF,         "AIFF (Apple/SGI)",                                             "aiff"  },
        {       SF_FORMAT_AU,           "AU (Sun/NeXT)",                                                "au"    },
-       {       SF_FORMAT_AVR,          "AVR (Audio Visual Research)",                  "avr"   },
-       {       SF_FORMAT_CAF,          "CAF (Apple Core Audio File)",                  "caf"   },
+       {       SF_FORMAT_AVR,          "AVR (Audio Visual Research)",                  "avr"   },
+       {       SF_FORMAT_CAF,          "CAF (Apple Core Audio File)",                  "caf"   },
 #if HAVE_EXTERNAL_LIBS
-       {       SF_FORMAT_FLAC,         "FLAC (FLAC Lossless Audio Codec)",             "flac"  },
+       {       SF_FORMAT_FLAC,         "FLAC (Free Lossless Audio Codec)",             "flac"  },
 #endif
        {       SF_FORMAT_HTK,          "HTK (HMM Tool Kit)",                                   "htk"   },
        {       SF_FORMAT_SVX,          "IFF (Amiga IFF/SVX8/SV16)",                    "iff"   },
@@ -126,11 +130,11 @@ static SF_FORMAT_INFO const major_formats [] =
        {       SF_FORMAT_MAT5,         "MAT5 (GNU Octave 2.1 / Matlab 5.0)",   "mat"   },
        {       SF_FORMAT_MPC2K,        "MPC (Akai MPC 2k)",                                    "mpc"   },
 #if HAVE_EXTERNAL_LIBS
-       {       SF_FORMAT_OGG,          "OGG (OGG Container format)",                   "oga"   },
+       {       SF_FORMAT_OGG,          "OGG (OGG Container format)",                   "oga"   },
 #endif
        {       SF_FORMAT_PAF,          "PAF (Ensoniq PARIS)",                                  "paf"   },
        {       SF_FORMAT_PVF,          "PVF (Portable Voice Format)",                  "pvf"   },
-       {       SF_FORMAT_RAW,          "RAW (header-less)",                                    "raw"   },
+       {       SF_FORMAT_RAW,          "RAW (header-less)",                                    "raw"   },
        {       SF_FORMAT_RF64,         "RF64 (RIFF 64)",                                               "rf64"  },
        {       SF_FORMAT_SD2,          "SD2 (Sound Designer II)",                              "sd2"   },
        {       SF_FORMAT_SDS,          "SDS (Midi Sample Dump Standard)",              "sds"   },
@@ -138,7 +142,7 @@ static SF_FORMAT_INFO const major_formats [] =
        {       SF_FORMAT_VOC,          "VOC (Creative Labs)",                                  "voc"   },
        {       SF_FORMAT_W64,          "W64 (SoundFoundry WAVE 64)",                   "w64"   },
        {       SF_FORMAT_WAV,          "WAV (Microsoft)",                                              "wav"   },
-       {       SF_FORMAT_NIST,         "WAV (NIST Sphere)",                                    "wav"   },
+       {       SF_FORMAT_NIST,         "WAV (NIST Sphere)",                                    "wav"   },
        {       SF_FORMAT_WAVEX,        "WAVEX (Microsoft)",                                    "wav"   },
        {       SF_FORMAT_WVE,          "WVE (Psion Series 3)",                                 "wve"   },
        {       SF_FORMAT_XI,           "XI (FastTracker 2)",                                   "xi"    },
@@ -200,6 +204,11 @@ static SF_FORMAT_INFO subtype_formats [] =
 #if HAVE_EXTERNAL_LIBS
        {       SF_FORMAT_VORBIS,               "Vorbis",                               NULL    },
 #endif
+
+       {       SF_FORMAT_ALAC_16,              "16 bit ALAC",                  NULL    },
+       {       SF_FORMAT_ALAC_20,              "20 bit ALAC",                  NULL    },
+       {       SF_FORMAT_ALAC_24,              "24 bit ALAC",                  NULL    },
+       {       SF_FORMAT_ALAC_32,              "32 bit ALAC",                  NULL    },
 } ; /* subtype_formats */
 
 int
@@ -212,7 +221,9 @@ psf_get_format_subtype (SF_FORMAT_INFO *data)
 {      int indx ;
 
        if (data->format < 0 || data->format >= (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+       {       data->format = 0 ;
                return SFE_BAD_COMMAND_PARAM ;
+               } ;
 
        indx = data->format ;
        memcpy (data, &(subtype_formats [indx]), sizeof (SF_FORMAT_INFO)) ;
@@ -258,7 +269,8 @@ psf_get_format_info (SF_FORMAT_INFO *data)
 
 double
 psf_calc_signal_max (SF_PRIVATE *psf, int normalize)
-{      sf_count_t      position ;
+{      BUF_UNION       ubuf ;
+       sf_count_t      position ;
        double          max_val, temp, *data ;
        int                     k, len, readcount, save_state ;
 
@@ -282,8 +294,9 @@ psf_calc_signal_max (SF_PRIVATE *psf, int normalize)
        /* Go to start of file. */
        sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ;
 
-       data = psf->u.dbuf ;
-       len = ARRAY_LEN (psf->u.dbuf) ;
+       data = ubuf.dbuf ;
+       /* Make sure len is an integer multiple of the channel count. */
+       len = ARRAY_LEN (ubuf.dbuf) - (ARRAY_LEN (ubuf.dbuf) % psf->sf.channels) ;
 
        for (readcount = 1, max_val = 0.0 ; readcount > 0 ; /* nothing */)
        {       readcount = sf_read_double ((SNDFILE*) psf, data, len) ;
@@ -302,7 +315,8 @@ psf_calc_signal_max (SF_PRIVATE *psf, int normalize)
 
 int
 psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize)
-{      sf_count_t      position ;
+{      BUF_UNION       ubuf ;
+       sf_count_t      position ;
        double          temp, *data ;
        int                     k, len, readcount, save_state ;
        int                     chan ;
@@ -323,9 +337,9 @@ psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize)
        position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; /* Get current position in file */
        sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ;                 /* Go to start of file. */
 
-       len = ARRAY_LEN (psf->u.dbuf) ;
+       len = ARRAY_LEN (ubuf.dbuf) - (ARRAY_LEN (ubuf.dbuf) % psf->sf.channels) ;
 
-       data = psf->u.dbuf ;
+       data = ubuf.dbuf ;
 
        chan = 0 ;
        readcount = len ;
index 8aadbab..830c43e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-#include       <config.h>
+#include <config.h>
 
-#include       <stdarg.h>
-#include       <string.h>
-#include       <ctype.h>
-#include       <math.h>
-#include       <time.h>
-#include       <sys/time.h>
-
-#include       "sndfile.h"
-#include       "sfendian.h"
-#include       "common.h"
+#include <stdarg.h>
+#include <string.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <ctype.h>
+#include <math.h>
+#include <time.h>
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
 
 /*-----------------------------------------------------------------------------------------------
-** psf_log_printf allows libsndfile internal functions to print to an internal logbuffer which
+** psf_log_printf allows libsndfile internal functions to print to an internal parselog which
 ** can later be displayed.
 ** The format specifiers are as for printf but without the field width and other modifiers.
-** Printing is performed to the logbuffer char array of the SF_PRIVATE struct.
+** Printing is performed to the parselog char array of the SF_PRIVATE struct.
 ** Printing is done in such a way as to guarantee that the log never overflows the end of the
-** logbuffer array.
+** parselog array.
 */
 
 static inline void
 log_putchar (SF_PRIVATE *psf, char ch)
-{      if (psf->logindex < SIGNED_SIZEOF (psf->logbuffer) - 1)
-       {       psf->logbuffer [psf->logindex++] = ch ;
-               psf->logbuffer [psf->logindex] = 0 ;
+{      if (psf->parselog.indx < SIGNED_SIZEOF (psf->parselog.buf) - 1)
+       {       psf->parselog.buf [psf->parselog.indx++] = ch ;
+               psf->parselog.buf [psf->parselog.indx] = 0 ;
                } ;
        return ;
 } /* log_putchar */
 
 void
 psf_log_printf (SF_PRIVATE *psf, const char *format, ...)
-{      va_list                 ap ;
-       unsigned int    u ;
-       int                             d, tens, shift, width, width_specifier, left_align ;
-       char                    c, *strptr, istr [5], lead_char, sign_char ;
+{      va_list         ap ;
+       uint32_t        u ;
+       int                     d, tens, shift, width, width_specifier, left_align, slen ;
+       char            c, *strptr, istr [5], lead_char, sign_char ;
 
        va_start (ap, format) ;
 
@@ -109,7 +113,8 @@ psf_log_printf (SF_PRIVATE *psf, const char *format, ...)
                                        strptr = va_arg (ap, char *) ;
                                        if (strptr == NULL)
                                                break ;
-                                       width_specifier -= strlen (strptr) ;
+                                       slen = strlen (strptr) ;
+                                       width_specifier = width_specifier >= slen ? width_specifier - slen : 0 ;
                                        if (left_align == SF_FALSE)
                                                while (width_specifier -- > 0)
                                                        log_putchar (psf, ' ') ;
@@ -266,7 +271,7 @@ psf_log_printf (SF_PRIVATE *psf, const char *format, ...)
                                                } ;
                                        shift = 28 ;
                                        width = (width_specifier < 8) ? 8 : width_specifier ;
-                                       while (! ((0xF << shift) & d))
+                                       while (! ((((uint32_t) 0xF) << shift) & d))
                                        {       shift -= 4 ;
                                                width -- ;
                                                } ;
@@ -755,38 +760,38 @@ psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...)
 */
 
 #if (CPU_IS_BIG_ENDIAN == 1)
-#define        GET_MARKER(ptr) (       ((ptr) [0] << 24)       | ((ptr) [1] << 16) |   \
-                                                       ((ptr) [2] << 8)        | ((ptr) [3]) )
+#define        GET_MARKER(ptr) (       (((uint32_t) (ptr) [0]) << 24)  | ((ptr) [1] << 16) |   \
+                                                       ((ptr) [2] << 8)        | ((ptr) [3]))
 
 #elif (CPU_IS_LITTLE_ENDIAN == 1)
 #define        GET_MARKER(ptr) (       ((ptr) [0])                     | ((ptr) [1] << 8) |    \
-                                                       ((ptr) [2] << 16)       | ((ptr) [3] << 24) )
+                                                       ((ptr) [2] << 16)       | (((uint32_t) (ptr) [3]) << 24))
 
 #else
 #      error "Cannot determine endian-ness of processor."
 #endif
 
-#define        GET_LE_SHORT(ptr)       ( ((ptr) [1] << 8) | ((ptr) [0]) )
-#define        GET_BE_SHORT(ptr)       ( ((ptr) [0] << 8) | ((ptr) [1]) )
+#define        GET_LE_SHORT(ptr)       (((ptr) [1] << 8) | ((ptr) [0]))
+#define        GET_BE_SHORT(ptr)       (((ptr) [0] << 8) | ((ptr) [1]))
 
-#define        GET_LE_3BYTE(ptr)       (       ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0]) )
-#define        GET_BE_3BYTE(ptr)       (       ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2]) )
+#define        GET_LE_3BYTE(ptr)       (       ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0]))
+#define        GET_BE_3BYTE(ptr)       (       ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2]))
 
-#define        GET_LE_INT(ptr)         (       ((ptr) [3] << 24)       | ((ptr) [2] << 16) |   \
-                                                               ((ptr) [1] << 8)        | ((ptr) [0]) )
+#define        GET_LE_INT(ptr)         (       ((ptr) [3] << 24)       | ((ptr) [2] << 16) |   \
+                                                               ((ptr) [1] << 8)        | ((ptr) [0]))
 
-#define        GET_BE_INT(ptr)         (       ((ptr) [0] << 24)       | ((ptr) [1] << 16) |   \
-                                                               ((ptr) [2] << 8)        | ((ptr) [3]) )
+#define        GET_BE_INT(ptr)         (       ((ptr) [0] << 24)       | ((ptr) [1] << 16) |   \
+                                                               ((ptr) [2] << 8)        | ((ptr) [3]))
 
-#define        GET_LE_8BYTE(ptr)       (       (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) |   \
-                                                               (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) |   \
-                                                               (((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) |   \
-                                                               (((sf_count_t) (ptr) [1]) << 8 ) | ((ptr) [0]))
+#define        GET_LE_8BYTE(ptr)       (       (((sf_count_t) (ptr) [7]) << 56)        | (((sf_count_t) (ptr) [6]) << 48) |    \
+                                                               (((sf_count_t) (ptr) [5]) << 40)        | (((sf_count_t) (ptr) [4]) << 32) |    \
+                                                               (((sf_count_t) (ptr) [3]) << 24)        | (((sf_count_t) (ptr) [2]) << 16) |    \
+                                                               (((sf_count_t) (ptr) [1]) << 8)         | ((ptr) [0]))
 
-#define        GET_BE_8BYTE(ptr)       (       (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) |   \
-                                                               (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) |   \
-                                                               (((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) |   \
-                                                               (((sf_count_t) (ptr) [6]) << 8 ) | ((ptr) [7]))
+#define        GET_BE_8BYTE(ptr)       (       (((sf_count_t) (ptr) [0]) << 56)        | (((sf_count_t) (ptr) [1]) << 48) |    \
+                                                               (((sf_count_t) (ptr) [2]) << 40)        | (((sf_count_t) (ptr) [3]) << 32) |    \
+                                                               (((sf_count_t) (ptr) [4]) << 24)        | (((sf_count_t) (ptr) [5]) << 16) |    \
+                                                               (((sf_count_t) (ptr) [6]) << 8)         | ((ptr) [7]))
 
 
 
@@ -795,21 +800,16 @@ header_read (SF_PRIVATE *psf, void *ptr, int bytes)
 {      int count = 0 ;
 
        if (psf->headindex >= SIGNED_SIZEOF (psf->header))
-       {       memset (ptr, 0, SIGNED_SIZEOF (psf->header) - psf->headindex) ;
-
-               /* This is the best that we can do. */
-               psf_fseek (psf, bytes, SEEK_CUR) ;
-               return bytes ;
-               } ;
+               return psf_fread (ptr, 1, bytes, psf) ;
 
        if (psf->headindex + bytes > SIGNED_SIZEOF (psf->header))
        {       int most ;
 
-               most = SIGNED_SIZEOF (psf->header) - psf->headindex ;
+               most = SIGNED_SIZEOF (psf->header) - psf->headend ;
                psf_fread (psf->header + psf->headend, 1, most, psf) ;
-               memset ((char *) ptr + most, 0, bytes - most) ;
-
-               psf_fseek (psf, bytes - most, SEEK_CUR) ;
+               memcpy (ptr, psf->header + psf->headend, most) ;
+               psf->headend = psf->headindex += most ;
+               psf_fread ((char *) ptr + most, bytes - most, 1, psf) ;
                return bytes ;
                } ;
 
@@ -817,7 +817,7 @@ header_read (SF_PRIVATE *psf, void *ptr, int bytes)
        {       count = psf_fread (psf->header + psf->headend, 1, bytes - (psf->headend - psf->headindex), psf) ;
                if (count != bytes - (int) (psf->headend - psf->headindex))
                {       psf_log_printf (psf, "Error : psf_fread returned short count.\n") ;
-                       return 0 ;
+                       return count ;
                        } ;
                psf->headend += count ;
                } ;
@@ -831,7 +831,6 @@ header_read (SF_PRIVATE *psf, void *ptr, int bytes)
 static void
 header_seek (SF_PRIVATE *psf, sf_count_t position, int whence)
 {
-
        switch (whence)
        {       case SEEK_SET :
                        if (position > SIGNED_SIZEOF (psf->header))
@@ -880,8 +879,7 @@ header_seek (SF_PRIVATE *psf, sf_count_t position, int whence)
 
 static int
 header_gets (SF_PRIVATE *psf, char *ptr, int bufsize)
-{
-       int             k ;
+{      int             k ;
 
        for (k = 0 ; k < bufsize - 1 ; k++)
        {       if (psf->headindex < psf->headend)
@@ -983,9 +981,9 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
                                        ucptr = (unsigned char*) intptr ;
                                        byte_count += header_read (psf, ucptr, sizeof (int)) ;
                                        if (psf->rwf_endian == SF_ENDIAN_BIG)
-                                               *intptr = GET_BE_INT (ucptr) ;
+                                               *intptr = psf_get_be32 (ucptr, 0) ;
                                        else
-                                               *intptr = GET_LE_INT (ucptr) ;
+                                               *intptr = psf_get_le32 (ucptr, 0) ;
                                        break ;
 
                        case '8' :
@@ -993,9 +991,9 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
                                        *countptr = 0 ;
                                        byte_count += header_read (psf, sixteen_bytes, 8) ;
                                        if (psf->rwf_endian == SF_ENDIAN_BIG)
-                                               countdata = GET_BE_8BYTE (sixteen_bytes) ;
+                                               countdata = psf_get_be64 (sixteen_bytes, 0) ;
                                        else
-                                               countdata = GET_LE_8BYTE (sixteen_bytes) ;
+                                               countdata = psf_get_le64 (sixteen_bytes, 0) ;
                                        *countptr = countdata ;
                                        break ;
 
@@ -1025,7 +1023,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
                                        strptr = va_arg (argptr, char *) ;
                                        size   = strlen (strptr) + 1 ;
                                        size  += (size & 1) ;
-                                       longdata = H2LE_INT (size) ;
+                                       longdata = H2LE_32 (size) ;
                                        get_int (psf, longdata) ;
                                        memcpy (&(psf->header [psf->headindex]), strptr, size) ;
                                        psf->headindex += size ;
@@ -1068,8 +1066,10 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
                        case 'j' :
                                        /* Get the seek position first. */
                                        count = va_arg (argptr, size_t) ;
-                                       header_seek (psf, count, SEEK_CUR) ;
-                                       byte_count += count ;
+                                       if (count)
+                                       {       header_seek (psf, count, SEEK_CUR) ;
+                                               byte_count += count ;
+                                               } ;
                                        break ;
 
                        default :
@@ -1150,7 +1150,10 @@ psf_log_SF_INFO (SF_PRIVATE *psf)
 {      psf_log_printf (psf, "---------------------------------\n") ;
 
        psf_log_printf (psf, " Sample rate :   %d\n", psf->sf.samplerate) ;
-       psf_log_printf (psf, " Frames      :   %D\n", psf->sf.frames) ;
+       if (psf->sf.frames == SF_COUNT_MAX)
+               psf_log_printf (psf, " Frames      :   unknown\n") ;
+       else
+               psf_log_printf (psf, " Frames      :   %D\n", psf->sf.frames) ;
        psf_log_printf (psf, " Channels    :   %d\n", psf->sf.channels) ;
 
        psf_log_printf (psf, " Format      :   0x%X\n", psf->sf.format) ;
@@ -1293,10 +1296,10 @@ u_bitwidth_to_subformat (int bits)
 
 int32_t
 psf_rand_int32 (void)
-{      static int32_t value = -1 ;
+{      static uint64_t value = 0 ;
        int k, count ;
 
-       if (value == -1)
+       if (value == 0)
        {
 #if HAVE_GETTIMEOFDAY
                struct timeval tv ;
@@ -1309,9 +1312,9 @@ psf_rand_int32 (void)
 
        count = 4 + (value & 7) ;
        for (k = 0 ; k < count ; k++)
-               value = 11117 * value + 211231 ;
+               value = (11117 * value + 211231) & 0x7fffffff ;
 
-       return value ;
+       return (int32_t) value ;
 } /* psf_rand_int32 */
 
 void
@@ -1365,6 +1368,28 @@ psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax)
        *dest = 0 ;
 } /* psf_strlcpy_crlf */
 
+sf_count_t
+psf_decode_frame_count (SF_PRIVATE *psf)
+{      sf_count_t count, readlen, total = 0 ;
+       BUF_UNION       ubuf ;
+
+       /* If we're reading from a pipe or the file is too long, just return SF_COUNT_MAX. */
+       if (psf_is_pipe (psf) || psf->datalength > 0x1000000)
+               return SF_COUNT_MAX ;
+
+       psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+       readlen = ARRAY_LEN (ubuf.ibuf) / psf->sf.channels ;
+       readlen *= psf->sf.channels ;
+
+       while ((count = psf->read_int (psf, ubuf.ibuf, readlen)) > 0)
+               total += count ;
+
+       psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+       return total / psf->sf.channels ;
+} /* psf_decode_frame_count */
+
 /*==============================================================================
 */
 
@@ -1463,3 +1488,169 @@ str_of_endianness (int end)
        /* Zero length string for SF_ENDIAN_FILE. */
        return "" ;
 } /* str_of_endianness */
+
+/*==============================================================================
+*/
+
+void
+psf_f2s_array (const float *src, short *dest, int count, int normalize)
+{      float                   normfact ;
+
+       normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+       while (--count >= 0)
+               dest [count] = lrintf (src [count] * normfact) ;
+
+       return ;
+} /* psf_f2s_array */
+
+void
+psf_f2s_clip_array (const float *src, short *dest, int count, int normalize)
+{      float                   normfact, scaled_value ;
+
+       normfact = normalize ? (1.0 * 0x8000) : 1.0 ;
+
+       while (--count >= 0)
+       {       scaled_value = src [count] * normfact ;
+               if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF))
+               {       dest [count] = 0x7FFF ;
+                       continue ;
+                       } ;
+               if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000))
+               {       dest [count] = 0x8000 ;
+                       continue ;
+                       } ;
+
+               dest [count] = lrintf (scaled_value) ;
+               } ;
+
+       return ;
+} /* psf_f2s_clip_array */
+
+void
+psf_d2s_array (const double *src, short *dest, int count, int normalize)
+{      double                  normfact ;
+
+       normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+       while (--count >= 0)
+               dest [count] = lrint (src [count] * normfact) ;
+
+       return ;
+} /* psf_f2s_array */
+
+void
+psf_d2s_clip_array (const double *src, short *dest, int count, int normalize)
+{      double                  normfact, scaled_value ;
+
+       normfact = normalize ? (1.0 * 0x8000) : 1.0 ;
+
+       while (--count >= 0)
+       {       scaled_value = src [count] * normfact ;
+               if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF))
+               {       dest [count] = 0x7FFF ;
+                       continue ;
+                       } ;
+               if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000))
+               {       dest [count] = 0x8000 ;
+                       continue ;
+                       } ;
+
+               dest [count] = lrint (scaled_value) ;
+               } ;
+
+       return ;
+} /* psf_d2s_clip_array */
+
+
+void
+psf_f2i_array (const float *src, int *dest, int count, int normalize)
+{      float                   normfact ;
+
+       normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+       while (--count >= 0)
+               dest [count] = lrintf (src [count] * normfact) ;
+
+       return ;
+} /* psf_f2i_array */
+
+void
+psf_f2i_clip_array (const float *src, int *dest, int count, int normalize)
+{      float                   normfact, scaled_value ;
+
+       normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+
+       while (--count >= 0)
+       {       scaled_value = src [count] * normfact ;
+               if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+               {       dest [count] = 0x7FFFFFFF ;
+                       continue ;
+                       } ;
+               if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+               {       dest [count] = 0x80000000 ;
+                       continue ;
+                       } ;
+
+               dest [count] = lrintf (scaled_value) ;
+               } ;
+
+       return ;
+} /* psf_f2i_clip_array */
+
+void
+psf_d2i_array (const double *src, int *dest, int count, int normalize)
+{      double                  normfact ;
+
+       normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+       while (--count >= 0)
+               dest [count] = lrint (src [count] * normfact) ;
+
+       return ;
+} /* psf_f2i_array */
+
+void
+psf_d2i_clip_array (const double *src, int *dest, int count, int normalize)
+{      double                  normfact, scaled_value ;
+
+       normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+
+       while (--count >= 0)
+       {       scaled_value = src [count] * normfact ;
+               if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+               {       dest [count] = 0x7FFFFFFF ;
+                       continue ;
+                       } ;
+               if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+               {       dest [count] = 0x80000000 ;
+                       continue ;
+                       } ;
+
+               dest [count] = lrint (scaled_value) ;
+               } ;
+
+       return ;
+} /* psf_d2i_clip_array */
+
+FILE *
+psf_open_tmpfile (char * fname, size_t fnamelen)
+{      const char * tmpdir ;
+       FILE * file ;
+
+       if (OS_IS_WIN32)
+               tmpdir = getenv ("TEMP") ;
+       else
+       {       tmpdir = getenv ("TMPDIR") ;
+               tmpdir = tmpdir == NULL ? "/tmp" : tmpdir ;
+               } ;
+
+       if (tmpdir && access (tmpdir, R_OK | W_OK | X_OK) == 0)
+       {       snprintf (fname, fnamelen, "%s/%x%x-alac.tmp", tmpdir, psf_rand_int32 (), psf_rand_int32 ()) ;
+               if ((file = fopen (fname, "wb+")) != NULL)
+                       return file ;
+               } ;
+
+       snprintf (fname, fnamelen, "%x%x-alac.tmp", psf_rand_int32 (), psf_rand_int32 ()) ;
+       if ((file = fopen (fname, "wb+")) != NULL)
+               return file ;
+
+       memset (fname, 0, fnamelen) ;
+       return NULL ;
+} /* psf_open_tmpfile */
index ed57804..12caf53 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 #      define WARN_UNUSED
 #endif
 
-#define        SF_BUFFER_LEN                   (8192*2)
-#define        SF_FILENAME_LEN                 (512)
+#define        SF_BUFFER_LEN                   (8192)
+#define        SF_FILENAME_LEN                 (1024)
 #define SF_SYSERR_LEN                  (256)
 #define SF_MAX_STRINGS                 (32)
-#define SF_STR_BUFFER_LEN              (8192)
-#define        SF_HEADER_LEN                   (4100 + SF_STR_BUFFER_LEN)
+#define        SF_HEADER_LEN                   (12292)
+#define        SF_PARSELOG_LEN                 (2048)
 
 #define        PSF_SEEK_ERROR                  ((sf_count_t) -1)
 
-
 #define        BITWIDTH2BYTES(x)       (((x) + 7) / 8)
 
 /*     For some reason sizeof returns an unsigned  value which causes
 
 #define                NOT(x)                  (! (x))
 
-#if (COMPILER_IS_GCC == 1)
-#define                SF_MAX(x,y)             ({ \
+#if COMPILER_IS_GCC
+#define                SF_MAX(x, y)    ({ \
                                                                typeof (x) sf_max_x1 = (x) ; \
                                                                typeof (y) sf_max_y1 = (y) ; \
                                                                (void) (&sf_max_x1 == &sf_max_y1) ; \
                                                                sf_max_x1 > sf_max_y1 ? sf_max_x1 : sf_max_y1 ; })
 
-#define                SF_MIN(x,y)             ({ \
+#define                SF_MIN(x, y)    ({ \
                                                                typeof (x) sf_min_x2 = (x) ; \
                                                                typeof (y) sf_min_y2 = (y) ; \
                                                                (void) (&sf_min_x2 == &sf_min_y2) ; \
                                                                sf_min_x2 < sf_min_y2 ? sf_min_x2 : sf_min_y2 ; })
 #else
-#define                SF_MAX(a,b)             ((a) > (b) ? (a) : (b))
-#define                SF_MIN(a,b)             ((a) < (b) ? (a) : (b))
+#define                SF_MAX(a, b)    ((a) > (b) ? (a) : (b))
+#define                SF_MIN(a, b)    ((a) < (b) ? (a) : (b))
 #endif
 
 
-#define                SF_MAX_CHANNELS 256
+#define                COMPILE_TIME_ASSERT(e)  (sizeof (struct { int : - !! (e) ; }))
+
+
+#define                SF_MAX_CHANNELS         1024
 
 
 /*
-*      Macros for spliting the format file of SF_INFI into contrainer type,
+*      Macros for spliting the format file of SF_INFO into container type,
 **     codec type and endian-ness.
 */
 #define SF_CONTAINER(x)                ((x) & SF_FORMAT_TYPEMASK)
@@ -173,6 +175,22 @@ enum
 } ;
 
 /*---------------------------------------------------------------------------------------
+*/
+
+typedef struct
+{      unsigned        kuki_offset ;
+       unsigned        pakt_offset ;
+
+       unsigned        bits_per_sample ;
+       unsigned        frames_per_packet ;
+
+       int64_t         packets ;
+       int64_t         valid_frames ;
+       int32_t         priming_frames ;
+       int32_t         remainder_frames ;
+} ALAC_DECODER_INFO ;
+
+/*---------------------------------------------------------------------------------------
 **     PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their
 **     endian encodings are different.
 */
@@ -193,19 +211,8 @@ typedef struct
        /* CAF */
        unsigned int    edit_number ;
 
-#if HAVE_FLEXIBLE_ARRAY
        /* the per channel peak info */
        PEAK_POS                peaks [] ;
-#else
-       /*
-       ** This is not ISO compliant C. It works on some compilers which
-       ** don't support the ISO standard flexible struct array which is
-       ** used above. If your compiler doesn't like this I suggest you find
-       ** youself a 1999 ISO C standards compilant compiler. GCC-3.X is
-       ** highly recommended.
-       */
-       PEAK_POS                peaks [0] ;
-#endif
 } PEAK_INFO ;
 
 static inline PEAK_INFO *
@@ -216,9 +223,44 @@ peak_info_calloc (int channels)
 typedef struct
 {      int             type ;
        int             flags ;
-       char    *str ;
+       size_t  offset ;
 } STR_DATA ;
 
+typedef struct
+{      int64_t         hash ;
+       char            id [64] ;
+       unsigned        id_size ;
+       uint32_t        mark32 ;
+       sf_count_t      offset ;
+       uint32_t        len ;
+} READ_CHUNK ;
+
+typedef struct
+{      int64_t         hash ;
+       uint32_t        mark32 ;
+       uint32_t        len ;
+       void            *data ;
+} WRITE_CHUNK ;
+
+typedef struct
+{      uint32_t        count ;
+       uint32_t        used ;
+       READ_CHUNK      *chunks ;
+} READ_CHUNKS ;
+typedef struct
+{      uint32_t        count ;
+       uint32_t        used ;
+       WRITE_CHUNK     *chunks ;
+} WRITE_CHUNKS ;
+
+struct SF_CHUNK_ITERATOR
+{      uint32_t        current ;
+       int64_t         hash ;
+       char            id [64] ;
+       unsigned        id_size ;
+       SNDFILE         *sndfile ;
+} ;
+
 static inline size_t
 make_size_t (int x)
 {      return (size_t) x ;
@@ -226,12 +268,21 @@ make_size_t (int x)
 
 typedef SF_BROADCAST_INFO_VAR (16 * 1024) SF_BROADCAST_INFO_16K ;
 
+typedef SF_CART_INFO_VAR (16 * 1024) SF_CART_INFO_16K ;
+
 #if SIZEOF_WCHAR_T == 2
 typedef wchar_t        sfwchar_t ;
 #else
 typedef int16_t sfwchar_t ;
 #endif
 
+
+static inline void *
+psf_memdup (const void *src, size_t n)
+{      void * mem = calloc (1, n & 3 ? n + 4 - (n & 3) : n) ;
+       return memcpy (mem, src, n) ;
+} /* psf_memdup */
+
 /*
 **     This version of isprint specifically ignores any locale info. Its used for
 **     determining which characters can be printed in things like hexdumps.
@@ -282,6 +333,24 @@ typedef struct
 } PSF_FILE ;
 
 
+
+typedef union
+{      double                  dbuf    [SF_BUFFER_LEN / sizeof (double)] ;
+#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
+       int64_t                 lbuf    [SF_BUFFER_LEN / sizeof (int64_t)] ;
+#else
+       long                    lbuf    [SF_BUFFER_LEN / sizeof (double)] ;
+#endif
+       float                   fbuf    [SF_BUFFER_LEN / sizeof (float)] ;
+       int                             ibuf    [SF_BUFFER_LEN / sizeof (int)] ;
+       short                   sbuf    [SF_BUFFER_LEN / sizeof (short)] ;
+       char                    cbuf    [SF_BUFFER_LEN / sizeof (char)] ;
+       signed char             scbuf   [SF_BUFFER_LEN / sizeof (signed char)] ;
+       unsigned char   ucbuf   [SF_BUFFER_LEN / sizeof (signed char)] ;
+} BUF_UNION ;
+
+
+
 typedef struct sf_private_tag
 {
        /* Canary in a coal mine. */
@@ -291,49 +360,38 @@ typedef struct sf_private_tag
                char c [16] ;
                } canary ;
 
-       /* Force the compiler to double align the start of buffer. */
-       union
-       {       double                  dbuf    [SF_BUFFER_LEN / sizeof (double)] ;
-#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
-               int64_t                 lbuf    [SF_BUFFER_LEN / sizeof (int64_t)] ;
-#else
-               long                    lbuf    [SF_BUFFER_LEN / sizeof (double)] ;
-#endif
-               float                   fbuf    [SF_BUFFER_LEN / sizeof (float)] ;
-               int                             ibuf    [SF_BUFFER_LEN / sizeof (int)] ;
-               short                   sbuf    [SF_BUFFER_LEN / sizeof (short)] ;
-               char                    cbuf    [SF_BUFFER_LEN / sizeof (char)] ;
-               signed char             scbuf   [SF_BUFFER_LEN / sizeof (signed char)] ;
-               unsigned char   ucbuf   [SF_BUFFER_LEN / sizeof (signed char)] ;
-               } u ;
-
-
        PSF_FILE                file, rsrc ;
 
        char                    syserr          [SF_SYSERR_LEN] ;
 
-       /* logbuffer and logindex should only be changed within the logging functions
+       /* parselog and indx should only be changed within the logging functions
        ** of common.c
        */
-       char                    logbuffer       [SF_BUFFER_LEN] ;
+       struct
+       {       char                    buf     [SF_PARSELOG_LEN] ;
+               int                             indx ;
+       } parselog ;
+
        unsigned char   header          [SF_HEADER_LEN] ; /* Must be unsigned */
        int                             rwf_endian ;    /* Header endian-ness flag. */
 
        /* Storage and housekeeping data for adding/reading strings from
        ** sound files.
        */
-       STR_DATA                strings [SF_MAX_STRINGS] ;
-       char                    str_storage [SF_STR_BUFFER_LEN] ;
-       char                    *str_end ;
-       int                             str_flags ;
+       struct
+       {       STR_DATA        data [SF_MAX_STRINGS] ;
+               char            *storage ;
+               size_t          storage_len ;
+               size_t          storage_used ;
+               uint32_t        flags ;
+       } strings ;
 
        /* Guard value. If this changes the buffers above have overflowed. */
        int                             Magick ;
 
        unsigned                unique_id ;
 
-       /* Index variables for maintaining logbuffer and header above. */
-       int                             logindex ;
+       /* Index variables for maintaining parselog and header above. */
        int                             headindex, headend ;
        int                             has_text ;
 
@@ -370,6 +428,9 @@ typedef struct sf_private_tag
        /* Broadcast (EBU) Info */
        SF_BROADCAST_INFO_16K *broadcast_16k ;
 
+       /* Cart (AES46) Info */
+       SF_CART_INFO_16K *cart_16k ;
+
        /* Channel map data (if present) : an array of ints. */
        int                             *channel_map ;
 
@@ -424,6 +485,7 @@ typedef struct sf_private_tag
        sf_count_t              (*seek)                 (struct sf_private_tag*, int mode, sf_count_t samples_from_start) ;
        int                             (*write_header) (struct sf_private_tag*, int calc_length) ;
        int                             (*command)              (struct sf_private_tag*, int command, void *data, int datasize) ;
+       int                             (*byterate)             (struct sf_private_tag*) ;
 
        /*
        **      Separate close functions for the codec and the container.
@@ -438,6 +500,17 @@ typedef struct sf_private_tag
        int                                     virtual_io ;
        SF_VIRTUAL_IO           vio ;
        void                            *vio_user_data ;
+
+       /* Chunk get/set. */
+       SF_CHUNK_ITERATOR       *iterator ;
+
+       READ_CHUNKS                     rchunks ;
+       WRITE_CHUNKS            wchunks ;
+
+       int                                     (*set_chunk)            (struct sf_private_tag*, const SF_CHUNK_INFO * chunk_info) ;
+       SF_CHUNK_ITERATOR *     (*next_chunk_iterator)  (struct sf_private_tag*, SF_CHUNK_ITERATOR * iterator) ;
+       int                                     (*get_chunk_size)       (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+       int                                     (*get_chunk_data)       (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
 } SF_PRIVATE ;
 
 
@@ -460,6 +533,7 @@ enum
        SFE_BAD_FILE_PTR,
        SFE_BAD_INT_PTR,
        SFE_BAD_STAT_SIZE,
+       SFE_NO_TEMP_DIR,
        SFE_MALLOC_FAILED,
        SFE_UNIMPLEMENTED,
        SFE_BAD_READ_ALIGN,
@@ -499,6 +573,8 @@ enum
        SFE_CMD_HAS_DATA,
        SFE_BAD_BROADCAST_INFO_SIZE,
        SFE_BAD_BROADCAST_INFO_TOO_BIG,
+       SFE_BAD_CART_INFO_SIZE,
+       SFE_BAD_CART_INFO_TOO_BIG,
 
        SFE_STR_NO_SUPPORT,
        SFE_STR_NOT_WRITE,
@@ -523,6 +599,7 @@ enum
        SFE_WAV_BAD_LIST,
        SFE_WAV_ADPCM_NOT4BIT,
        SFE_WAV_ADPCM_CHANNELS,
+       SFE_WAV_ADPCM_SAMPLES,
        SFE_WAV_GSM610_FORMAT,
        SFE_WAV_UNKNOWN_CHUNK,
        SFE_WAV_WVPK_DATA,
@@ -631,6 +708,13 @@ enum
        SFE_VORBIS_ENCODER_BUG,
 
        SFE_RF64_NOT_RF64,
+       SFE_BAD_CHUNK_PTR,
+       SFE_UNKNOWN_CHUNK,
+       SFE_BAD_CHUNK_FORMAT,
+       SFE_BAD_CHUNK_MARKER,
+       SFE_BAD_CHUNK_DATA_PTR,
+       SFE_ALAC_FAIL_TMPFILE,
+       SFE_FILENAME_TOO_LONG,
 
        SFE_MAX_ERROR                   /* This must be last in list. */
 } ;
@@ -642,13 +726,13 @@ int u_bitwidth_to_subformat (int bits) ;
 /*  Functions for reading and writing floats and doubles on processors
 **     with non-IEEE floats/doubles.
 */
-float  float32_be_read         (unsigned char *cptr) ;
-float  float32_le_read         (unsigned char *cptr) ;
+float  float32_be_read         (const unsigned char *cptr) ;
+float  float32_le_read         (const unsigned char *cptr) ;
 void   float32_be_write        (float in, unsigned char *out) ;
 void   float32_le_write        (float in, unsigned char *out) ;
 
-double double64_be_read        (unsigned char *cptr) ;
-double double64_le_read        (unsigned char *cptr) ;
+double double64_be_read        (const unsigned char *cptr) ;
+double double64_le_read        (const unsigned char *cptr) ;
 void   double64_be_write       (double in, unsigned char *out) ;
 void   double64_le_write       (double in, unsigned char *out) ;
 
@@ -662,6 +746,8 @@ int32_t     psf_rand_int32 (void) ;
 void append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) ;
 void psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) ;
 
+sf_count_t psf_decode_frame_count (SF_PRIVATE *psf) ;
+
 /* Functions used when writing file headers. */
 
 int            psf_binheader_writef    (SF_PRIVATE *psf, const char *format, ...) ;
@@ -774,15 +860,16 @@ int               caf_open        (SF_PRIVATE *psf) ;
 int            mpc2k_open      (SF_PRIVATE *psf) ;
 int            rf64_open       (SF_PRIVATE *psf) ;
 
-/* In progress. Do not currently work. */
-
 int            ogg_vorbis_open (SF_PRIVATE *psf) ;
 int            ogg_speex_open  (SF_PRIVATE *psf) ;
 int            ogg_pcm_open    (SF_PRIVATE *psf) ;
+int            ogg_opus_open   (SF_PRIVATE *psf) ;
+int            ogg_open        (SF_PRIVATE *psf) ;
 
 
+/* In progress. Do not currently work. */
+
 int            mpeg_open       (SF_PRIVATE *psf) ;
-int            ogg_open        (SF_PRIVATE *psf) ;
 int            rx2_open        (SF_PRIVATE *psf) ;
 int            txw_open        (SF_PRIVATE *psf) ;
 int            wve_open        (SF_PRIVATE *psf) ;
@@ -804,6 +891,7 @@ int         gsm610_init             (SF_PRIVATE *psf) ;
 int            vox_adpcm_init  (SF_PRIVATE *psf) ;
 int            flac_init               (SF_PRIVATE *psf) ;
 int            g72x_init               (SF_PRIVATE * psf) ;
+int            alac_init               (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ;
 
 int    dither_init             (SF_PRIVATE *psf, int mode) ;
 
@@ -818,18 +906,27 @@ int               interleave_init (SF_PRIVATE *psf) ;
 ** Chunk logging functions.
 */
 
-typedef struct
-{      struct
-       {       int chunk ;
-               sf_count_t offset ;
-               sf_count_t len ;
-       } l [100] ;
+SF_CHUNK_ITERATOR * psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str) ;
+SF_CHUNK_ITERATOR * psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR *iterator) ;
+int            psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len) ;
+int            psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker, sf_count_t offset, uint32_t len) ;
+int            psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info) ;
+int            psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker) ;
+int            psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker) ;
+int            psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker) ;
 
-       int count ;
-} PRIV_CHUNK4 ;
+int            psf_find_write_chunk (WRITE_CHUNKS * pchk, const char * marker) ;
 
-void pchk4_store (PRIV_CHUNK4 * pchk, int marker, sf_count_t offset, sf_count_t len) ;
-int pchk4_find (PRIV_CHUNK4 * pchk, int marker) ;
+static inline int
+fourcc_to_marker (const SF_CHUNK_INFO * chunk_info)
+{      const unsigned char * cptr ;
+
+       if (chunk_info->id_size != 4)
+               return 0 ;
+
+       cptr = (const unsigned char *) chunk_info->id ;
+       return (cptr [3] << 24) + (cptr [2] << 16) + (cptr [1] << 8) + cptr [0] ;
+} /* fourcc_to_marker */
 
 /*------------------------------------------------------------------------------------
 ** Functions that work like OpenBSD's strlcpy/strlcat to replace strncpy/strncat.
@@ -873,6 +970,10 @@ int                broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * data, size_t
 int            broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) ;
 
 
+SF_CART_INFO_16K * cart_var_alloc (void) ;
+int            cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * date, size_t datasize) ;
+int            cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) ;
+
 typedef struct
 {      int channels ;
        int endianness ;
@@ -881,6 +982,10 @@ typedef struct
 int audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) ;
 int id3_skip (SF_PRIVATE * psf) ;
 
+void   alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) ;
+
+FILE * psf_open_tmpfile (char * fname, size_t fnamelen) ;
+
 /*------------------------------------------------------------------------------------
 ** Helper/debug functions.
 */
@@ -915,5 +1020,45 @@ int sf_dither_float               (const SF_DITHER_INFO *dither, const float *in, float *out,
 int sf_dither_double   (const SF_DITHER_INFO *dither, const double *in, double *out, int count) ;
 #endif
 
-#endif /* SNDFILE_COMMON_H */
+/*------------------------------------------------------------------------------------
+** Data conversion functions.
+*/
+
+void psf_f2s_array (const float *src, short *dest, int count, int normalize) ;
+void psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) ;
+
+void psf_d2s_array (const double *src, short *dest, int count, int normalize) ;
+void psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) ;
+
+void psf_f2i_array (const float *src, int *dest, int count, int normalize) ;
+void psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) ;
+
+void psf_d2i_array (const double *src, int *dest, int count, int normalize) ;
+void psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) ;
+
 
+/*------------------------------------------------------------------------------------
+** Left and right shift on int. According to the C standard, the left and right
+** shift operations applied to a negative integer results in undefined behavior.
+** These twp functions work around that.
+*/
+
+#if __GNUC__
+#define ALWAYS_INLINE          __attribute__ ((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
+static inline int32_t ALWAYS_INLINE
+arith_shift_left (int32_t x, int shift)
+{      return (int32_t) (((uint32_t) x) << shift) ;
+} /* arith_shift_left */
+
+static inline int32_t ALWAYS_INLINE
+arith_shift_right (int32_t x, int shift)
+{      if (x >= 0)
+               return x >> shift ;
+       return ~ ((~x) >> shift) ;
+} /* arith_shift_right */
+
+#endif /* SNDFILE_COMMON_H */
index f55a59a..7148607 100644 (file)
@@ -42,9 +42,6 @@
 /* Will be set to 1 if flac, ogg and vorbis are available. */
 #undef HAVE_EXTERNAL_LIBS
 
-/* Set to 1 if the compile supports the struct hack. */
-#undef HAVE_FLEXIBLE_ARRAY
-
 /* Define to 1 if you have the `floor' function. */
 #undef HAVE_FLOOR
 
@@ -57,6 +54,9 @@
 /* Define to 1 if you have the `fstat' function. */
 #undef HAVE_FSTAT
 
+/* Define to 1 if you have the `fstat64' function. */
+#undef HAVE_FSTAT64
+
 /* Define to 1 if you have the `fsync' function. */
 #undef HAVE_FSYNC
 
 /* Define if you have C99's lrintf function. */
 #undef HAVE_LRINTF
 
+/* Define to 1 if you have the `lround' function. */
+#undef HAVE_LROUND
+
 /* Define to 1 if you have the `lseek' function. */
 #undef HAVE_LSEEK
 
+/* Define to 1 if you have the `lseek64' function. */
+#undef HAVE_LSEEK64
+
 /* Define to 1 if you have the `malloc' function. */
 #undef HAVE_MALLOC
 
 /* Define to 1 if you have the `pipe' function. */
 #undef HAVE_PIPE
 
-/* Define to 1 if you have the `pread' function. */
-#undef HAVE_PREAD
-
-/* Define to 1 if you have the `pwrite' function. */
-#undef HAVE_PWRITE
-
 /* Define to 1 if you have the `read' function. */
 #undef HAVE_READ
 
 /* Define to 1 if you have the `setlocale' function. */
 #undef HAVE_SETLOCALE
 
-/* Define to 1 if you have the <sndio.h> header file. */
+/* Set to 1 if <sndio.h> is available. */
 #undef HAVE_SNDIO_H
 
 /* Define to 1 if you have the `snprintf' function. */
 /* Define to 1 if you have the `write' function. */
 #undef HAVE_WRITE
 
+/* The host triplet of the compiled binary. */
+#undef HOST_TRIPLET
+
 /* Define to the sub-directory in which libtool stores uninstalled libraries.
    */
 #undef LT_OBJDIR
 
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
+/* The darwin version, no-zero is valid */
+#undef OSX_DARWIN_VERSION
 
-/* Set to 1 if compiling for MacOSX */
-#undef OS_IS_MACOSX
+/* Set to 1 if compiling for OpenBSD */
+#undef OS_IS_OPENBSD
 
 /* Set to 1 if compiling for Win32 */
 #undef OS_IS_WIN32
 /* Set to long if unknown. */
 #undef TYPEOF_SF_COUNT_T
 
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
 /* Set to 1 to use the native windows API */
 #undef USE_WINDOWS_API
 
 /* Target processor is big endian. */
 #undef WORDS_BIGENDIAN
 
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
 /* Number of bits in a file offset, on hosts where this is settable. */
 #undef _FILE_OFFSET_BITS
 
-/* Define to make fseeko etc. visible, on some hosts. */
-#undef _LARGEFILE_SOURCE
-
 /* Define for large files, on AIX-style hosts. */
 #undef _LARGE_FILES
 
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
+
 /* Set to 1 to use C99 printf/snprintf in MinGW. */
 #undef __USE_MINGW_ANSI_STDIO
index f2cab12..15b1cca 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 
-# Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+# Copyright (C) 2003-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 #
 # All rights reserved.
 #
@@ -39,101 +39,107 @@ import re, sys
 # the ordinal values in the second column.
 
 ALL_SYMBOLS = (
-       (       "sf_command",           1       ),
-       (       "sf_open",                      2       ),
-       (       "sf_close",                     3       ),
-       (       "sf_seek",                      4       ),
-       (       "sf_error",                     7       ),
-       (       "sf_perror",            8       ),
-       (       "sf_error_str",         9       ),
-       (       "sf_error_number",      10      ),
-       (       "sf_format_check",      11      ),
-       (       "sf_read_raw",          16      ),
-       (       "sf_readf_short",       17      ),
-       (       "sf_readf_int",         18      ),
-       (       "sf_readf_float",       19      ),
-       (       "sf_readf_double",      20      ),
-       (       "sf_read_short",        21      ),
-       (       "sf_read_int",          22      ),
-       (       "sf_read_float",        23      ),
-       (       "sf_read_double",       24      ),
-       (       "sf_write_raw",         32      ),
-       (       "sf_writef_short",      33      ),
-       (       "sf_writef_int",        34      ),
-       (       "sf_writef_float",      35      ),
-       (       "sf_writef_double",     36      ),
-       (       "sf_write_short",       37      ),
-       (       "sf_write_int",         38      ),
-       (       "sf_write_float",       39      ),
-       (       "sf_write_double",      40      ),
-       (       "sf_strerror",          50      ),
-       (       "sf_get_string",        60      ),
-       (       "sf_set_string",        61      ),
-       (       "sf_version_string",68  ),
-       (       "sf_open_fd",           70      ),
-       (       "sf_wchar_open",        71  ),
-       (       "sf_open_virtual",      80      ),
-       (       "sf_write_sync",        90      )
+       (       "sf_command",                   1       ),
+       (       "sf_open",                              2       ),
+       (       "sf_close",                             3       ),
+       (       "sf_seek",                              4       ),
+       (       "sf_error",                             7       ),
+       (       "sf_perror",                    8       ),
+       (       "sf_error_str",                 9       ),
+       (       "sf_error_number",              10      ),
+       (       "sf_format_check",              11      ),
+       (       "sf_read_raw",                  16      ),
+       (       "sf_readf_short",               17      ),
+       (       "sf_readf_int",                 18      ),
+       (       "sf_readf_float",               19      ),
+       (       "sf_readf_double",              20      ),
+       (       "sf_read_short",                21      ),
+       (       "sf_read_int",                  22      ),
+       (       "sf_read_float",                23      ),
+       (       "sf_read_double",               24      ),
+       (       "sf_write_raw",                 32      ),
+       (       "sf_writef_short",              33      ),
+       (       "sf_writef_int",                34      ),
+       (       "sf_writef_float",              35      ),
+       (       "sf_writef_double",             36      ),
+       (       "sf_write_short",               37      ),
+       (       "sf_write_int",                 38      ),
+       (       "sf_write_float",               39      ),
+       (       "sf_write_double",              40      ),
+       (       "sf_strerror",                  50      ),
+       (       "sf_get_string",                60      ),
+       (       "sf_set_string",                61      ),
+       (       "sf_version_string",    68      ),
+       (       "sf_open_fd",                   70      ),
+       (       "sf_wchar_open",                71  ),
+       (       "sf_open_virtual",              80      ),
+       (       "sf_write_sync",                90      ),
+       (       "sf_set_chunk",                 100     ),
+       (       "sf_get_chunk_size",    101 ),
+       (       "sf_get_chunk_data",    102 ),
+       (       "sf_get_chunk_iterator",        103 ),
+       (       "sf_next_chunk_iterator",       104 ),
+       (       "sf_current_byterate",  110 )
        )
 
 #-------------------------------------------------------------------------------
 
 def linux_symbols (progname, version):
-       print "# Auto-generated by %s\n" %progname
-       print "libsndfile.so.%s" % version
-       print "{"
-       print "  global:"
+       print ("# Auto-generated by %s\n" %progname)
+       print ("libsndfile.so.%s" % version)
+       print ("{")
+       print ("  global:")
        for name, ordinal in ALL_SYMBOLS:
                if  name == "sf_wchar_open":
                        continue
-               print "    %s ;" % name
-       print "  local:"
-       print "    * ;"
-       print "} ;"
-       print
+               print ("    %s ;" % name)
+       print ("  local:")
+       print ("    * ;")
+       print ("} ;")
+       sys.stdout.write ("\n")
        return
 
 def darwin_symbols (progname, version):
-       print "# Auto-generated by %s\n" %progname
+       print ("# Auto-generated by %s\n" %progname)
        for name, ordinal in ALL_SYMBOLS:
                if  name == "sf_wchar_open":
                        continue
-               print "_%s" % name
-       print
+               print ("_%s" % name)
+       sys.stdout.write ("\n")
        return
 
 def win32_symbols (progname, version, name):
-       print "; Auto-generated by %s\n" %progname
-       print "LIBRARY %s-%s.dll" % (name, re.sub ("\..*", "", version))
-       print "EXPORTS\n"
+       print ("; Auto-generated by %s\n" %progname)
+       print ("LIBRARY %s-%s.dll" % (name, re.sub ("\..*", "", version)))
+       print ("EXPORTS\n")
        for name, ordinal in ALL_SYMBOLS:
-               print "%-20s @%s" % (name, ordinal)
-       print
+               print ("%-20s @%s" % (name, ordinal))
+       sys.stdout.write ("\n")
        return
 
 def os2_symbols (progname, version, name):
-       print "; Auto-generated by %s\n" %progname
-       print "LIBRARY %s%s" % (name, re.sub ("\..*", "", version))
-       print "INITINSTANCE TERMINSTANCE"
-       print "CODE PRELOAD MOVEABLE DISCARDABLE"
-       print "DATA PRELOAD MOVEABLE MULTIPLE NONSHARED"
-       print "EXPORTS\n"
+       print ("; Auto-generated by %s\n" %progname)
+       print ("LIBRARY %s%s" % (name, re.sub ("\..*", "", version)))
+       print ("INITINSTANCE TERMINSTANCE")
+       print ("CODE PRELOAD MOVEABLE DISCARDABLE")
+       print ("DATA PRELOAD MOVEABLE MULTIPLE NONSHARED")
+       print ("EXPORTS\n")
        for name, ordinal in ALL_SYMBOLS:
                if  name == "sf_wchar_open":
                        continue
-               print "_%-20s @%s" % (name, ordinal)
-       print
+               print ("_%-20s @%s" % (name, ordinal))
+       sys.stdout.write ("\n")
        return
 
 def plain_symbols (progname, version, name):
        for name, ordinal in ALL_SYMBOLS:
-               print name
+               print (name)
 
 def no_symbols (os_name):
-       print
-       print "No known way of restricting exported symbols on '%s'." % os_name
-       print "If you know a way, please contact the author."
-       print
+       sys.stdout.write ("\n")
+       print ("No known way of restricting exported symbols on '%s'." % os_name)
+       print ("If you know a way, please contact the author.")
+       sys.stdout.write ("\n")
        return
 
 #-------------------------------------------------------------------------------
@@ -141,17 +147,17 @@ def no_symbols (os_name):
 progname = re.sub (".*[\\/]", "", sys.argv [0])
 
 if len (sys.argv) != 3:
-       print
-       print "Usage : %s <target OS name> <libsndfile version>." % progname
-       print
-       print "    Currently supported values for target OS are:"
-       print "          linux"
-       print "          darwin     (ie MacOSX)"
-       print "          win32      (ie wintendo)"
-       print "          cygwin     (Cygwin on wintendo)"
-       print "          os2        (OS/2)"
-       print "          plain      (plain list of symbols)"
-       print
+       sys.stdout.write ("\n")
+       print ("Usage : %s <target OS name> <libsndfile version>." % progname)
+       sys.stdout.write ("\n")
+       print ("    Currently supported values for target OS are:")
+       print ("          linux")
+       print ("          darwin     (ie MacOSX)")
+       print ("          win32      (ie wintendo)")
+       print ("          cygwin     (Cygwin on wintendo)")
+       print ("          os2        (OS/2)")
+       print ("          plain      (plain list of symbols)")
+       sys.stdout.write ("\n")
        sys.exit (1)
 
 os_name = sys.argv [1]
index 425088b..b318ea8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -91,6 +91,11 @@ int
 double64_init  (SF_PRIVATE *psf)
 {      static int double64_caps ;
 
+       if (psf->sf.channels < 1)
+       {       psf_log_printf (psf, "double64_init : internal error : channels = %d\n", psf->sf.channels) ;
+               return SFE_INTERNAL ;
+               } ;
+
        double64_caps = double64_get_capability (psf) ;
 
        psf->blockwidth = sizeof (double) * psf->sf.channels ;
@@ -276,7 +281,7 @@ double64_init       (SF_PRIVATE *psf)
 */
 
 double
-double64_be_read (unsigned char *cptr)
+double64_be_read (const unsigned char *cptr)
 {      int             exponent, negative, upper, lower ;
        double  dvalue ;
 
@@ -309,7 +314,7 @@ double64_be_read (unsigned char *cptr)
 } /* double64_be_read */
 
 double
-double64_le_read (unsigned char *cptr)
+double64_le_read (const unsigned char *cptr)
 {      int             exponent, negative, upper, lower ;
        double  dvalue ;
 
@@ -554,24 +559,25 @@ f2d_array (const float *src, double *dest, int count)
 
 static sf_count_t
 host_read_d2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      void            (*convert) (const double *, int, short *, double) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, int, short *, double) ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        convert = (psf->add_clipping) ? d2s_clip_array : d2s_array ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, readcount) ;
+                       endswap_double_array (ubuf.dbuf, readcount) ;
 
-               convert (psf->u.dbuf, readcount, ptr + total, scale) ;
+               convert (ubuf.dbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                len -= readcount ;
                if (readcount < bufferlen)
@@ -583,24 +589,25 @@ host_read_d2s     (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 host_read_d2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      void            (*convert) (const double *, int, int *, double) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, int, int *, double) ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        convert = (psf->add_clipping) ? d2i_clip_array : d2i_array ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               convert (psf->u.dbuf, readcount, ptr + total, scale) ;
+               convert (ubuf.dbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                len -= readcount ;
                if (readcount < bufferlen)
@@ -612,20 +619,21 @@ host_read_d2i     (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 host_read_d2f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               d2f_array (psf->u.dbuf, readcount, ptr + total) ;
+               d2f_array (ubuf.dbuf, readcount, ptr + total) ;
                total += readcount ;
                len -= readcount ;
                if (readcount < bufferlen)
@@ -667,26 +675,27 @@ host_read_d       (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               s2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+               s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+                       double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -698,25 +707,26 @@ host_write_s2d    (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+               i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+                       double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -728,23 +738,24 @@ host_write_i2d    (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2d_array (ptr + total, psf->u.dbuf, bufferlen) ;
+               f2d_array (ptr + total, ubuf.dbuf, bufferlen) ;
 
                if (psf->peak_info)
-                       double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+                       double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -756,7 +767,8 @@ host_write_f2d      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_d   (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (psf->peak_info)
@@ -765,15 +777,15 @@ host_write_d      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
        if (psf->data_endswap != SF_TRUE)
                return psf_fwrite (ptr, sizeof (double), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               endswap_double_copy (psf->u.dbuf, ptr + total, bufferlen) ;
+               endswap_double_copy (ubuf.dbuf, ptr + total, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -788,24 +800,25 @@ host_write_d      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_d2s       (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               d2bd_read (psf->u.dbuf, bufferlen) ;
+               d2bd_read (ubuf.dbuf, bufferlen) ;
 
-               d2s_array (psf->u.dbuf, readcount, ptr + total, scale) ;
+               d2s_array (ubuf.dbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -817,24 +830,25 @@ replace_read_d2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_d2i       (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               d2bd_read (psf->u.dbuf, bufferlen) ;
+               d2bd_read (ubuf.dbuf, bufferlen) ;
 
-               d2i_array (psf->u.dbuf, readcount, ptr + total, scale) ;
+               d2i_array (ubuf.dbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -846,22 +860,23 @@ replace_read_d2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_d2f       (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               d2bd_read (psf->u.dbuf, bufferlen) ;
+               d2bd_read (ubuf.dbuf, bufferlen) ;
 
-               memcpy (ptr + total, psf->u.dbuf, bufferlen * sizeof (double)) ;
+               memcpy (ptr + total, ubuf.dbuf, bufferlen * sizeof (double)) ;
 
                total += readcount ;
                if (readcount < bufferlen)
@@ -874,23 +889,24 @@ replace_read_d2f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        /* FIXME : This is probably nowhere near optimal. */
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, readcount) ;
+                       endswap_double_array (ubuf.dbuf, readcount) ;
 
-               d2bd_read (psf->u.dbuf, readcount) ;
+               d2bd_read (ubuf.dbuf, readcount) ;
 
-               memcpy (ptr + total, psf->u.dbuf, readcount * sizeof (double)) ;
+               memcpy (ptr + total, ubuf.dbuf, readcount * sizeof (double)) ;
 
                total += readcount ;
                if (readcount < bufferlen)
@@ -903,27 +919,28 @@ replace_read_d    (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_s2d      (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+               s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+                       double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ;
 
-               bd2d_write (psf->u.dbuf, bufferlen) ;
+               bd2d_write (ubuf.dbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -935,27 +952,28 @@ replace_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_i2d      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+               i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+                       double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ;
 
-               bd2d_write (psf->u.dbuf, bufferlen) ;
+               bd2d_write (ubuf.dbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -967,22 +985,23 @@ replace_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_f2d      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2d_array (ptr + total, psf->u.dbuf, bufferlen) ;
+               f2d_array (ptr + total, ubuf.dbuf, bufferlen) ;
 
-               bd2d_write (psf->u.dbuf, bufferlen) ;
+               bd2d_write (ubuf.dbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -994,27 +1013,28 @@ replace_write_f2d        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_d        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        /* FIXME : This is probably nowhere near optimal. */
        if (psf->peak_info)
                double64_peak_update (psf, ptr, len, 0) ;
 
-       bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.dbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               memcpy (psf->u.dbuf, ptr + total, bufferlen * sizeof (double)) ;
+               memcpy (ubuf.dbuf, ptr + total, bufferlen * sizeof (double)) ;
 
-               bd2d_write (psf->u.dbuf, bufferlen) ;
+               bd2d_write (ubuf.dbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_double_array (psf->u.dbuf, bufferlen) ;
+                       endswap_double_array (ubuf.dbuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
index fba7b0c..af4d9f0 100644 (file)
--- a/src/dwd.c
+++ b/src/dwd.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -122,16 +122,17 @@ typedef struct
 
 static int
 dwd_read_header (SF_PRIVATE *psf)
-{      DWD_HEADER      dwdh ;
+{      BUF_UNION       ubuf ;
+       DWD_HEADER      dwdh ;
 
-       memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
+       memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ;
        /* Set position to start of file to begin reading header. */
-       psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, DWD_IDENTIFIER_LEN) ;
+       psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, DWD_IDENTIFIER_LEN) ;
 
-       if (memcmp (psf->u.cbuf, DWD_IDENTIFIER, DWD_IDENTIFIER_LEN) != 0)
+       if (memcmp (ubuf.cbuf, DWD_IDENTIFIER, DWD_IDENTIFIER_LEN) != 0)
                return SFE_DWD_NO_DWD ;
 
-       psf_log_printf (psf, "Read only : DiamondWare Digitized (.dwd)\n", psf->u.cbuf) ;
+       psf_log_printf (psf, "Read only : DiamondWare Digitized (.dwd)\n", ubuf.cbuf) ;
 
        psf_binheader_readf (psf, "11", &dwdh.major, &dwdh.minor) ;
        psf_binheader_readf (psf, "e4j1", &dwdh.id, 1, &dwdh.compression) ;
@@ -150,9 +151,9 @@ dwd_read_header (SF_PRIVATE *psf)
        else
                psf_log_printf (psf, "None\n") ;
 
-       psf_log_printf (psf, "  Sample Rate   : %d\n  Channels      : %d\n"
-                                                "  Bit Width     : %d\n",
-                                                dwdh.srate, dwdh.channels, dwdh.bitwidth) ;
+       psf_log_printf (psf,    "  Sample Rate   : %d\n  Channels      : %d\n"
+                                                       "  Bit Width     : %d\n",
+                                               dwdh.srate, dwdh.channels, dwdh.bitwidth) ;
 
        switch (dwdh.bitwidth)
        {       case 8 :
index 562f015..0da1326 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -38,7 +38,7 @@
 #include       "common.h"
 
 typedef struct
-{      int             dwm_maxsize, bit_width, max_delta, span ;
+{      int             bit_width, dwm_maxsize, max_delta, span ;
        int             samplecount ;
        int             bit_count, bits, last_delta_width, last_sample ;
        struct
@@ -61,7 +61,8 @@ static sf_count_t dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t le
 static sf_count_t dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
 
 static sf_count_t      dwvw_seek       (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
-static int     dwvw_close      (SF_PRIVATE *psf) ;
+static int     dwvw_close              (SF_PRIVATE *psf) ;
+static int     dwvw_byterate   (SF_PRIVATE *psf) ;
 
 static int     dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) ;
 static int     dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) ;
@@ -93,12 +94,7 @@ dwvw_init (SF_PRIVATE *psf, int bitwidth)
                return SFE_MALLOC_FAILED ;
 
        psf->codec_data = (void*) pdwvw ;
-
        pdwvw->bit_width        = bitwidth ;
-       pdwvw->dwm_maxsize      = bitwidth / 2 ;
-       pdwvw->max_delta        = 1 << (bitwidth - 1) ;
-       pdwvw->span                     = 1 << bitwidth ;
-
        dwvw_read_reset (pdwvw) ;
 
        if (psf->file.mode == SFM_READ)
@@ -117,11 +113,12 @@ dwvw_init (SF_PRIVATE *psf, int bitwidth)
 
        psf->codec_close = dwvw_close ;
        psf->seek = dwvw_seek ;
+       psf->byterate = dwvw_byterate ;
 
-       /* FIXME : This is bogus. */
-       psf->sf.frames = SF_COUNT_MAX ;
-       psf->datalength = psf->sf.frames ;
-       /* EMXIF : This is bogus. */
+       if (psf->file.mode == SFM_READ)
+       {       psf->sf.frames = psf_decode_frame_count (psf) ;
+               dwvw_read_reset (pdwvw) ;
+               } ;
 
        return 0 ;
 } /* dwvw_init */
@@ -174,6 +171,14 @@ dwvw_seek  (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
        return  PSF_SEEK_ERROR ;
 } /* dwvw_seek */
 
+static int
+dwvw_byterate  (SF_PRIVATE *psf)
+{
+       if (psf->file.mode == SFM_READ)
+               return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ;
+
+       return -1 ;
+} /* dwvw_byterate */
 
 /*==============================================================================
 */
@@ -181,6 +186,7 @@ dwvw_seek   (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
 static sf_count_t
 dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
+       BUF_UNION       ubuf ;
        int             *iptr ;
        int             k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -189,8 +195,8 @@ dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
                return 0 ;
        pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
@@ -234,8 +240,9 @@ dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 static sf_count_t
 dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
-       int             *iptr ;
-       int             k, bufferlen, readcount = 0, count ;
+       BUF_UNION       ubuf ;
+       int                     *iptr ;
+       int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
@@ -245,8 +252,8 @@ dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
@@ -265,8 +272,9 @@ dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 static sf_count_t
 dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
-       int             *iptr ;
-       int             k, bufferlen, readcount = 0, count ;
+       BUF_UNION       ubuf ;
+       int                     *iptr ;
+       int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
        double  normfact ;
 
@@ -276,8 +284,8 @@ dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
@@ -307,7 +315,7 @@ dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len)
                delta_width_modifier = dwvw_decode_load_bits (psf, pdwvw, -1) ;
 
                /* Check for end of input bit stream. Break loop if end. */
-               if (delta_width_modifier < 0)
+               if (delta_width_modifier < 0 || (pdwvw->b.end == 0 && count == 0))
                        break ;
 
                if (delta_width_modifier && dwvw_decode_load_bits (psf, pdwvw, 1))
@@ -336,7 +344,7 @@ dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len)
                        sample += pdwvw->span ;
 
                /* Store the sample justifying to the most significant bit. */
-               ptr [count] = sample << (32 - pdwvw->bit_width) ;
+               ptr [count] = arith_shift_left (sample, 32 - pdwvw->bit_width) ;
 
                if (pdwvw->b.end == 0 && pdwvw->bit_count == 0)
                        break ;
@@ -377,7 +385,7 @@ dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count)
                if (bit_count < 8 && pdwvw->b.end == 0)
                        return -1 ;
 
-               pdwvw->bits = (pdwvw->bits << 8) ;
+               pdwvw->bits = arith_shift_left (pdwvw->bits, 8) ;
 
                if (pdwvw->b.index < pdwvw->b.end)
                {       pdwvw->bits |= pdwvw->b.buffer [pdwvw->b.index] ;
@@ -406,13 +414,14 @@ dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count)
 
 static void
 dwvw_read_reset (DWVW_PRIVATE *pdwvw)
-{      pdwvw->samplecount              = 0 ;
-       pdwvw->b.index                  = 0 ;
-       pdwvw->b.end                    = 0 ;
-       pdwvw->bit_count                = 0 ;
-       pdwvw->bits                             = 0 ;
-       pdwvw->last_delta_width = 0 ;
-       pdwvw->last_sample              = 0 ;
+{      int bitwidth = pdwvw->bit_width ;
+
+       memset (pdwvw, 0, sizeof (DWVW_PRIVATE)) ;
+
+       pdwvw->bit_width        = bitwidth ;
+       pdwvw->dwm_maxsize      = bitwidth / 2 ;
+       pdwvw->max_delta        = 1 << (bitwidth - 1) ;
+       pdwvw->span                     = 1 << bitwidth ;
 } /* dwvw_read_reset */
 
 static void
@@ -420,7 +429,7 @@ dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_
 {      int     byte ;
 
        /* Shift the bits into the resevoir. */
-       pdwvw->bits = (pdwvw->bits << new_bits) | (data & ((1 << new_bits) - 1)) ;
+       pdwvw->bits = arith_shift_left (pdwvw->bits, new_bits) | (data & (arith_shift_left (1, new_bits) - 1)) ;
        pdwvw->bit_count += new_bits ;
 
        /* Transfer bit to buffer. */
@@ -461,9 +470,9 @@ dump_bits (DWVW_PRIVATE *pdwvw)
 } /* dump_bits */
 #endif
 
-#define HIGHEST_BIT(x,count)           \
+#define HIGHEST_BIT(x, count)          \
                        {       int y = x ;                     \
-                               (count) = 0 ;           \
+                               (count) = 0 ;           \
                                while (y)                       \
                                {       (count) ++ ;    \
                                        y >>= 1 ;               \
@@ -548,6 +557,7 @@ dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len)
 static sf_count_t
 dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
+       BUF_UNION       ubuf ;
        int             *iptr ;
        int             k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -556,12 +566,12 @@ dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
                return 0 ;
        pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
-                       iptr [k] = ptr [total + k] << 16 ;
+                       iptr [k] = arith_shift_left (ptr [total + k], 16) ;
                count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ;
 
                total += count ;
@@ -601,6 +611,7 @@ dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t
 dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
+       BUF_UNION       ubuf ;
        int                     *iptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -612,8 +623,8 @@ dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -632,6 +643,7 @@ dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 static sf_count_t
 dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 {      DWVW_PRIVATE *pdwvw ;
+       BUF_UNION       ubuf ;
        int                     *iptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -643,8 +655,8 @@ dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index 44f1b5a..7cf8f0c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2003 Ross Bencina <rbencina@iprimus.com.au>
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -121,7 +121,7 @@ psf_open_rsrc (SF_PRIVATE *psf)
                return 0 ;
 
        /* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */
-       snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/rsrc", psf->file.path.c) ;
+       snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/..namedfork/rsrc", psf->file.path.c) ;
        psf->error = SFE_NO_ERROR ;
        if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0)
        {       psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ;
@@ -358,6 +358,9 @@ psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf
 {      sf_count_t total = 0 ;
        ssize_t count ;
 
+       if (bytes == 0 || items == 0)
+               return 0 ;
+
        if (psf->virtual_io)
                return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ;
 
@@ -473,19 +476,22 @@ psf_is_pipe (SF_PRIVATE *psf)
 
 static sf_count_t
 psf_get_filelen_fd (int fd)
-{      struct stat statbuf ;
+{
+#if (SIZEOF_OFF_T == 4 && SIZEOF_SF_COUNT_T == 8 && HAVE_FSTAT64)
+       struct stat64 statbuf ;
 
-       /*
-       ** Sanity check.
-       ** If everything is OK, this will be optimised out.
-       */
-       if (sizeof (statbuf.st_size) == 4 && sizeof (sf_count_t) == 8)
-               return (sf_count_t) -SFE_BAD_STAT_SIZE ;
+       if (fstat64 (fd, &statbuf) == -1)
+               return (sf_count_t) -1 ;
+
+       return statbuf.st_size ;
+#else
+       struct stat statbuf ;
 
        if (fstat (fd, &statbuf) == -1)
                return (sf_count_t) -1 ;
 
        return statbuf.st_size ;
+#endif
 } /* psf_get_filelen_fd */
 
 int
@@ -538,8 +544,8 @@ psf_open_fd (PSF_FILE * pfile)
        ** be optimised out. This is meant to catch the problems caused by
        ** "sfconfig.h" being included after <stdio.h>.
        */
-       if (sizeof (off_t) != sizeof (sf_count_t))
-       {       puts ("\n\n*** Fatal error : sizeof (off_t) != sizeof (sf_count_t)") ;
+       if (sizeof (sf_count_t) != 8)
+       {       puts ("\n\n*** Fatal error : sizeof (sf_count_t) != 8") ;
                puts ("*** This means that libsndfile was not configured correctly.\n") ;
                exit (1) ;
                } ;
@@ -552,12 +558,12 @@ psf_open_fd (PSF_FILE * pfile)
 
                case SFM_WRITE :
                                oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
-                               mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
+                               mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ;
                                break ;
 
                case SFM_RDWR :
                                oflag = O_RDWR | O_CREAT | O_BINARY ;
-                               mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
+                               mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ;
                                break ;
 
                default :
@@ -589,10 +595,10 @@ void
 psf_fsync (SF_PRIVATE *psf)
 {
 #if HAVE_FSYNC
-    if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
-        fsync (psf->file.filedes) ;
+       if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+               fsync (psf->file.filedes) ;
 #else
-    psf = NULL ;
+       psf = NULL ;
 #endif
 } /* psf_fsync */
 
@@ -672,7 +678,7 @@ psf_open_rsrc (SF_PRIVATE *psf)
        psf->error = SFE_NO_ERROR ;
        if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL)
        {       psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ;
-               return SFE_NO_ERROR ;
+               return SFE_NO_ERROR ;
                } ;
 
        /* No resource file found. */
@@ -980,7 +986,7 @@ psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
 /* USE_WINDOWS_API */ sf_count_t
 psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
 {      sf_count_t total = 0 ;
-       ssize_t  count ;
+       ssize_t count ;
        DWORD dwNumberOfBytesWritten ;
 
        if (psf->virtual_io)
@@ -1276,7 +1282,7 @@ psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence)
 /* Win32 */ sf_count_t
 psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
 {      sf_count_t total = 0 ;
-       ssize_t  count ;
+       ssize_t count ;
 
        if (psf->virtual_io)
                return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ;
@@ -1314,7 +1320,7 @@ psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
 /* Win32 */ sf_count_t
 psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
 {      sf_count_t total = 0 ;
-       ssize_t  count ;
+       ssize_t count ;
 
        if (psf->virtual_io)
                return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ;
index 7949b0a..86b61ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2004-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2004 Tobias Gehrig <tgehrig@ira.uka.de>
 **
 ** This program is free software ; you can redistribute it and/or modify
@@ -39,6 +39,8 @@
 ** Private static functions.
 */
 
+#define        FLAC_DEFAULT_COMPRESSION_LEVEL  5
+
 #define ENC_BUFFER_SIZE 8192
 
 typedef enum
@@ -67,6 +69,8 @@ typedef struct
 
        const FLAC__Frame *frame ;
        FLAC__bool bufferbackup ;
+
+       unsigned compression ;
 } FLAC_PRIVATE ;
 
 typedef struct
@@ -75,6 +79,7 @@ typedef struct
 } FLAC_TAG ;
 
 static sf_count_t      flac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int                     flac_byterate (SF_PRIVATE *psf) ;
 static int                     flac_close (SF_PRIVATE *psf) ;
 
 static int                     flac_enc_init (SF_PRIVATE *psf) ;
@@ -147,8 +152,8 @@ i2flac8_array (const int *src, FLAC__int32 *dest, int count)
 static void
 i2flac16_array (const int *src, FLAC__int32 *dest, int count)
 {
-  while (--count >= 0)
-    dest [count] = src [count] >> 16 ;
+       while (--count >= 0)
+               dest [count] = src [count] >> 16 ;
 } /* i2flac16_array */
 
 static void
@@ -219,7 +224,7 @@ flac_buffer_copy (SF_PRIVATE *psf)
                                                        break ;
 
                                                for (j = 0 ; j < frame->header.channels ; j++)
-                                                       retpcm [offset + j] = (buffer [j][pflac->bufferpos]) << shift ;
+                                                       retpcm [offset + j] = ((uint16_t) buffer [j][pflac->bufferpos]) << shift ;
 
                                                pflac->remain -= frame->header.channels ;
                                                pflac->bufferpos++ ;
@@ -238,7 +243,7 @@ flac_buffer_copy (SF_PRIVATE *psf)
                                                break ;
 
                                        for (j = 0 ; j < frame->header.channels ; j++)
-                                               retpcm [offset + j] = buffer [j][pflac->bufferpos] << shift ;
+                                               retpcm [offset + j] = ((uint32_t) buffer [j][pflac->bufferpos]) << shift ;
                                        pflac->remain -= frame->header.channels ;
                                        pflac->bufferpos++ ;
                                        } ;
@@ -300,7 +305,7 @@ sf_flac_read_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__byte
        if (*bytes > 0 && psf->error == 0)
                return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ;
 
-    return FLAC__STREAM_DECODER_READ_STATUS_ABORT ;
+       return FLAC__STREAM_DECODER_READ_STATUS_ABORT ;
 } /* sf_flac_read_callback */
 
 static FLAC__StreamDecoderSeekStatus
@@ -342,7 +347,7 @@ sf_flac_eof_callback (const FLAC__StreamDecoder *UNUSED (decoder), void *client_
        if (psf_ftell (psf) == psf->filelength)
                return SF_TRUE ;
 
-    return SF_FALSE ;
+       return SF_FALSE ;
 } /* sf_flac_eof_callback */
 
 static FLAC__StreamDecoderWriteStatus
@@ -504,7 +509,7 @@ sf_flac_enc_seek_callback (const FLAC__StreamEncoder * UNUSED (encoder), FLAC__u
        if (psf->error)
                return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR ;
 
-    return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ;
+       return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ;
 } /* sf_flac_enc_seek_callback */
 
 static FLAC__StreamEncoderTellStatus
@@ -534,7 +539,7 @@ flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac)
        int     k, string_count = 0 ;
 
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
-       {       if (psf->strings [k].type != 0)
+       {       if (psf->strings.data [k].type != 0)
                        string_count ++ ;
                } ;
 
@@ -546,10 +551,10 @@ flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac)
                return ;
                } ;
 
-       for (k = 0 ; k < SF_MAX_STRINGS && psf->strings [k].type != 0 ; k++)
+       for (k = 0 ; k < SF_MAX_STRINGS && psf->strings.data [k].type != 0 ; k++)
        {       const char * key, * value ;
 
-               switch (psf->strings [k].type)
+               switch (psf->strings.data [k].type)
                {       case SF_STR_SOFTWARE :
                                key = "software" ;
                                break ;
@@ -584,7 +589,7 @@ flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac)
                                continue ;
                        } ;
 
-               value = psf->strings [k].str ;
+               value = psf->strings.storage + psf->strings.data [k].offset ;
 
                FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair (&entry, key, value) ;
                FLAC__metadata_object_vorbiscomment_append_comment (pflac->metadata, entry, /* copy */ SF_FALSE) ;
@@ -629,6 +634,10 @@ flac_open  (SF_PRIVATE *psf)
        FLAC_PRIVATE* pflac = calloc (1, sizeof (FLAC_PRIVATE)) ;
        psf->codec_data = pflac ;
 
+       /* Set the default value here. Over-ridden later if necessary. */
+       pflac->compression = FLAC_DEFAULT_COMPRESSION_LEVEL ;
+
+
        if (psf->file.mode == SFM_RDWR)
                return SFE_BAD_MODE_RW ;
 
@@ -646,7 +655,7 @@ flac_open   (SF_PRIVATE *psf)
                psf->endian = SF_ENDIAN_BIG ;
                psf->sf.seekable = 0 ;
 
-               psf->str_flags = SF_STR_ALLOW_START ;
+               psf->strings.flags = SF_STR_ALLOW_START ;
 
                if ((error = flac_enc_init (psf)))
                        return error ;
@@ -656,14 +665,12 @@ flac_open (SF_PRIVATE *psf)
 
        psf->datalength = psf->filelength ;
        psf->dataoffset = 0 ;
-       psf->blockwidth = 0 ;
-       psf->bytewidth = 1 ;
 
        psf->container_close = flac_close ;
        psf->seek = flac_seek ;
-       psf->command = flac_command ;
+       psf->byterate = flac_byterate ;
 
-       psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+       psf->command = flac_command ;
 
        switch (subformat)
        {       case SF_FORMAT_PCM_S8 : /* 8-bit FLAC.  */
@@ -724,7 +731,7 @@ flac_enc_init (SF_PRIVATE *psf)
        **     "FLAC supports linear sample rates from 1Hz - 655350Hz in 1Hz
        **     increments."
        */
-       if ( psf->sf.samplerate < 1 || psf->sf.samplerate > 655350 )
+       if (psf->sf.samplerate < 1 || psf->sf.samplerate > 655350)
        {       psf_log_printf (psf, "flac sample rate out of range.\n", psf->sf.samplerate) ;
                return SFE_FLAC_BAD_SAMPLE_RATE ;
                } ;
@@ -747,6 +754,8 @@ flac_enc_init (SF_PRIVATE *psf)
                        break ;
                } ;
 
+       if (pflac->fse)
+               FLAC__stream_encoder_delete (pflac->fse) ;
        if ((pflac->fse = FLAC__stream_encoder_new ()) == NULL)
                return SFE_FLAC_NEW_DECODER ;
 
@@ -765,6 +774,11 @@ flac_enc_init (SF_PRIVATE *psf)
                return SFE_FLAC_INIT_DECODER ;
                } ;
 
+       if (! FLAC__stream_encoder_set_compression_level (pflac->fse, pflac->compression))
+       {       psf_log_printf (psf, "FLAC__stream_encoder_set_compression_level (%d) return false.\n", pflac->compression) ;
+               return SFE_FLAC_INIT_DECODER ;
+               } ;
+
        return 0 ;
 } /* flac_enc_init */
 
@@ -773,6 +787,8 @@ flac_read_header (SF_PRIVATE *psf)
 {      FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
 
        psf_fseek (psf, 0, SEEK_SET) ;
+       if (pflac->fsd)
+               FLAC__stream_decoder_delete (pflac->fsd) ;
        if ((pflac->fsd = FLAC__stream_decoder_new ()) == NULL)
                return SFE_FLAC_NEW_DECODER ;
 
@@ -796,9 +812,37 @@ flac_read_header (SF_PRIVATE *psf)
 } /* flac_read_header */
 
 static int
-flac_command (SF_PRIVATE * UNUSED (psf), int UNUSED (command), void * UNUSED (data), int UNUSED (datasize))
-{
-       return 0 ;
+flac_command (SF_PRIVATE * psf, int command, void * data, int datasize)
+{      FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+       double quality ;
+
+       switch (command)
+       {       case SFC_SET_COMPRESSION_LEVEL :
+                       if (data == NULL || datasize != sizeof (double))
+                               return SF_FALSE ;
+
+                       if (psf->have_written)
+                               return SF_FALSE ;
+
+                       /* FLAC compression level is in the range [0, 8] while libsndfile takes
+                       ** values in the range [0.0, 1.0]. Massage the libsndfile value here.
+                       */
+                       quality = (*((double *) data)) * 8.0 ;
+                       /* Clip range. */
+                       pflac->compression = lrint (SF_MAX (0.0, SF_MIN (8.0, quality))) ;
+
+                       psf_log_printf (psf, "%s : Setting SFC_SET_COMPRESSION_LEVEL to %u.\n", __func__, pflac->compression) ;
+
+                       if (flac_enc_init (psf))
+                               return SF_FALSE ;
+
+                       return SF_TRUE ;
+
+               default :
+                       return SF_FALSE ;
+               } ;
+
+       return SF_FALSE ;
 } /* flac_command */
 
 int
@@ -821,9 +865,6 @@ flac_init (SF_PRIVATE *psf)
                psf->write_double       = flac_write_d2flac ;
                } ;
 
-       psf->bytewidth = 1 ;
-       psf->blockwidth = psf->sf.channels ;
-
        if (psf->filelength > psf->dataoffset)
                psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
        else
@@ -962,7 +1003,7 @@ flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                convert (ptr + total, buffer, writecount) ;
-               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels))
                        thiswrite = writecount ;
                else
                        break ;
@@ -1004,7 +1045,7 @@ flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                convert (ptr + total, buffer, writecount) ;
-               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels))
                        thiswrite = writecount ;
                else
                        break ;
@@ -1046,7 +1087,7 @@ flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                convert (ptr + total, buffer, writecount, psf->norm_float) ;
-               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels))
                        thiswrite = writecount ;
                else
                        break ;
@@ -1084,23 +1125,22 @@ f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normaliz
 
 static void
 f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
-{
-  float normfact, scaled_value ;
-
-  normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
-
-  while (--count >= 0) {
-    scaled_value = src [count] * normfact ;
-    if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) {
-      dest [count] = 0x7FFF ;
-      continue ;
-    }
-    if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) {
-      dest [count] = 0x8000 ;
-      continue ;
-    }
-    dest [count] = lrintf (scaled_value) ;
-  }
+{      float normfact, scaled_value ;
+
+       normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
+
+       while (--count >= 0)
+       {       scaled_value = src [count] * normfact ;
+               if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF))
+               {       dest [count] = 0x7FFF ;
+                       continue ;
+                       } ;
+               if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000))
+               {       dest [count] = 0x8000 ;
+                       continue ;
+                       } ;
+               dest [count] = lrintf (scaled_value) ;
+               } ;
 } /* f2flac16_clip_array */
 
 static void
@@ -1178,7 +1218,7 @@ flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                convert (ptr + total, buffer, writecount, psf->norm_double) ;
-               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+               if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels))
                        thiswrite = writecount ;
                else
                        break ;
@@ -1297,12 +1337,19 @@ flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
        pflac->frame = NULL ;
 
        if (psf->file.mode == SFM_READ)
-       {       FLAC__uint64 position ;
-               if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset))
-               {       FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
+       {       if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset))
+                       return offset ;
+
+               if (offset == psf->sf.frames)
+               {       /*
+                       ** If we've been asked to seek to the very end of the file, libFLAC
+                       ** will return an error. However, we know the length of the file so
+                       ** instead of returning an error, we can return the offset.
+                       */
                        return offset ;
                        } ;
 
+               psf->error = SFE_BAD_SEEK ;
                return ((sf_count_t) -1) ;
                } ;
 
@@ -1312,6 +1359,16 @@ flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
        return ((sf_count_t) -1) ;
 } /* flac_seek */
 
+static int
+flac_byterate (SF_PRIVATE *psf)
+{
+       if (psf->file.mode == SFM_READ)
+               return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ;
+
+       return -1 ;
+} /* flac_byterate */
+
+
 #else /* HAVE_EXTERNAL_LIBS */
 
 int
index 4a87cef..100c149 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -88,6 +88,11 @@ int
 float32_init   (SF_PRIVATE *psf)
 {      static int float_caps ;
 
+       if (psf->sf.channels < 1)
+       {       psf_log_printf (psf, "float32_init : internal error : channels = %d\n", psf->sf.channels) ;
+               return SFE_INTERNAL ;
+               } ;
+
        float_caps = float32_get_capability (psf) ;
 
        psf->blockwidth = sizeof (float) * psf->sf.channels ;
@@ -247,7 +252,7 @@ float32_init        (SF_PRIVATE *psf)
 } /* float32_init */
 
 float
-float32_be_read (unsigned char *cptr)
+float32_be_read (const unsigned char *cptr)
 {      int             exponent, mantissa, negative ;
        float   fvalue ;
 
@@ -275,7 +280,7 @@ float32_be_read (unsigned char *cptr)
 } /* float32_be_read */
 
 float
-float32_le_read (unsigned char *cptr)
+float32_le_read (const unsigned char *cptr)
 {      int             exponent, mantissa, negative ;
        float   fvalue ;
 
@@ -505,25 +510,26 @@ d2f_array (const double *src, float *dest, int count)
 
 static sf_count_t
 host_read_f2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      void            (*convert) (const float *, int, short *, float) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, int, short *, float) ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
        convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
 /* Fix me : Need lef2s_array */
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               convert (psf->u.fbuf, readcount, ptr + total, scale) ;
+               convert (ubuf.fbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -535,24 +541,25 @@ host_read_f2s     (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 host_read_f2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      void            (*convert) (const float *, int, int *, float) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, int, int *, float) ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
        convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               convert (psf->u.fbuf, readcount, ptr + total, scale) ;
+               convert (ubuf.fbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -564,20 +571,21 @@ host_read_f2i     (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 host_read_f    (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        if (psf->data_endswap != SF_TRUE)
                return psf_fread (ptr, sizeof (float), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
-               endswap_int_copy ((int*) (ptr + total), psf->u.ibuf, readcount) ;
+               endswap_int_copy ((int*) (ptr + total), ubuf.ibuf, readcount) ;
 
                total += readcount ;
                if (readcount < bufferlen)
@@ -590,21 +598,22 @@ host_read_f       (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 host_read_f2d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
 /* Fix me : Need lef2d_array */
-               f2d_array (psf->u.fbuf, readcount, ptr + total) ;
+               f2d_array (ubuf.fbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -616,26 +625,27 @@ host_read_f2d     (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
 /* Erik */
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+               s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -647,25 +657,26 @@ host_write_s2f    (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+               i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -677,7 +688,8 @@ host_write_i2f      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_f   (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (psf->peak_info)
@@ -686,15 +698,15 @@ host_write_f      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
        if (psf->data_endswap != SF_TRUE)
                return psf_fwrite (ptr, sizeof (float), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               endswap_int_copy (psf->u.ibuf, (const int*) (ptr + total), bufferlen) ;
+               endswap_int_copy (ubuf.ibuf, (const int*) (ptr + total), bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -706,24 +718,25 @@ host_write_f      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
+               d2f_array (ptr + total, ubuf.fbuf, bufferlen) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -738,24 +751,25 @@ host_write_d2f    (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_f2s       (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               bf2f_array (psf->u.fbuf, bufferlen) ;
+               bf2f_array (ubuf.fbuf, bufferlen) ;
 
-               f2s_array (psf->u.fbuf, readcount, ptr + total, scale) ;
+               f2s_array (ubuf.fbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -767,24 +781,25 @@ replace_read_f2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_f2i       (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
        scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               bf2f_array (psf->u.fbuf, bufferlen) ;
+               bf2f_array (ubuf.fbuf, bufferlen) ;
 
-               f2i_array (psf->u.fbuf, readcount, ptr + total, scale) ;
+               f2i_array (ubuf.fbuf, readcount, ptr + total, scale) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -796,24 +811,25 @@ replace_read_f2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        /* FIX THIS */
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               bf2f_array (psf->u.fbuf, bufferlen) ;
+               bf2f_array (ubuf.fbuf, bufferlen) ;
 
-               memcpy (ptr + total, psf->u.fbuf, bufferlen * sizeof (float)) ;
+               memcpy (ptr + total, ubuf.fbuf, bufferlen * sizeof (float)) ;
 
                total += readcount ;
                if (readcount < bufferlen)
@@ -826,22 +842,23 @@ replace_read_f    (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 replace_read_f2d       (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               bf2f_array (psf->u.fbuf, bufferlen) ;
+               bf2f_array (ubuf.fbuf, bufferlen) ;
 
-               f2d_array (psf->u.fbuf, readcount, ptr + total) ;
+               f2d_array (ubuf.fbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -853,27 +870,28 @@ replace_read_f2d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_s2f      (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+               s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
-               f2bf_array (psf->u.fbuf, bufferlen) ;
+               f2bf_array (ubuf.fbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -885,27 +903,28 @@ replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_i2f      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           scale ;
 
        scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+               i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
-               f2bf_array (psf->u.fbuf, bufferlen) ;
+               f2bf_array (ubuf.fbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -917,27 +936,28 @@ replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_f        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        /* FIX THIS */
        if (psf->peak_info)
                float32_peak_update (psf, ptr, len, 0) ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
 
-               memcpy (psf->u.fbuf, ptr + total, bufferlen * sizeof (float)) ;
+               memcpy (ubuf.fbuf, ptr + total, bufferlen * sizeof (float)) ;
 
-               f2bf_array (psf->u.fbuf, bufferlen) ;
+               f2bf_array (ubuf.fbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -949,25 +969,26 @@ replace_write_f   (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 replace_write_d2f      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.fbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
+               d2f_array (ptr + total, ubuf.fbuf, bufferlen) ;
 
                if (psf->peak_info)
-                       float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+                       float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
 
-               f2bf_array (psf->u.fbuf, bufferlen) ;
+               f2bf_array (ubuf.fbuf, bufferlen) ;
 
                if (psf->data_endswap == SF_TRUE)
-                       endswap_int_array (psf->u.ibuf, bufferlen) ;
+                       endswap_int_array (ubuf.ibuf, bufferlen) ;
 
-               writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+               writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
index 99729d3..7b77b4f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -112,8 +112,6 @@ g72x_init (SF_PRIVATE * psf)
                default : return SFE_UNIMPLEMENTED ;
                } ;
 
-       psf->blockwidth = psf->bytewidth = 1 ;
-
        psf->filelength = psf_get_filelen (psf) ;
        if (psf->filelength < psf->dataoffset)
                psf->filelength = psf->dataoffset ;
@@ -134,7 +132,7 @@ g72x_init (SF_PRIVATE * psf)
                psf->read_float         = g72x_read_f ;
                psf->read_double        = g72x_read_d ;
 
-               psf->seek = g72x_seek ;
+               psf->seek = g72x_seek ;
 
                if (psf->datalength % pg72x->blocksize)
                {       psf_log_printf (psf, "*** Odd psf->datalength (%D) should be a multiple of %d\n", psf->datalength, pg72x->blocksize) ;
@@ -253,7 +251,8 @@ g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -262,14 +261,14 @@ g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
                return 0 ;
        pg72x = (G72x_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
+       sptr = ubuf.sbuf ;
        bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = g72x_read_block (psf, pg72x, sptr, readcount) ;
 
                for (k = 0 ; k < readcount ; k++)
-                       ptr [total + k] = sptr [k] << 16 ;
+                       ptr [total + k] = arith_shift_left (sptr [k], 16) ;
 
                total += count ;
                len -= readcount ;
@@ -282,7 +281,8 @@ g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -294,7 +294,7 @@ g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
+       sptr = ubuf.sbuf ;
        bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
@@ -313,7 +313,8 @@ g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -325,7 +326,7 @@ g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
+       sptr = ubuf.sbuf ;
        bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
@@ -491,7 +492,8 @@ g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -500,8 +502,8 @@ g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
                return 0 ;
        pg72x = (G72x_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -518,7 +520,8 @@ g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -530,8 +533,8 @@ g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -549,7 +552,8 @@ g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      G72x_PRIVATE *pg72x ;
+{      BUF_UNION       ubuf ;
+       G72x_PRIVATE *pg72x ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -561,8 +565,8 @@ g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = SF_BUFFER_LEN / sizeof (short) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index b16594e..ff86618 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -194,7 +194,7 @@ gsm610_wav_decode_block     (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
        pgsm610->samplecount = 0 ;
 
        if (pgsm610->blockcount > pgsm610->blocks)
-       {       memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+       {       memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ;
                return 1 ;
                } ;
 
@@ -222,7 +222,7 @@ gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
        pgsm610->samplecount = 0 ;
 
        if (pgsm610->blockcount > pgsm610->blocks)
-       {       memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
+       {       memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ;
                return 1 ;
                } ;
 
@@ -243,7 +243,7 @@ gsm610_read_block   (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len
 
        while (indx < len)
        {       if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= pgsm610->samplesperblock)
-               {       memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ;
+               {       memset (ptr + indx, 0, (len - indx) * sizeof (short)) ;
                        return total ;
                        } ;
 
@@ -290,6 +290,7 @@ gsm610_read_s       (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 static sf_count_t
 gsm610_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -298,13 +299,13 @@ gsm610_read_i     (SF_PRIVATE *psf, int *ptr, sf_count_t len)
                return 0 ;
        pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
                for (k = 0 ; k < readcount ; k++)
-                       ptr [total + k] = sptr [k] << 16 ;
+                       ptr [total + k] = arith_shift_left (sptr [k], 16) ;
 
                total += count ;
                len -= readcount ;
@@ -315,6 +316,7 @@ gsm610_read_i       (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 static sf_count_t
 gsm610_read_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -326,8 +328,8 @@ gsm610_read_f       (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
@@ -343,6 +345,7 @@ gsm610_read_f       (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 static sf_count_t
 gsm610_read_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -354,8 +357,8 @@ gsm610_read_d       (SF_PRIVATE *psf, double *ptr, sf_count_t len)
                return 0 ;
        pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
@@ -441,7 +444,7 @@ gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
        pgsm610->blockcount ++ ;
 
        /* Set samples to zero for next block. */
-       memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+       memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ;
 
        return 1 ;
 } /* gsm610_encode_block */
@@ -452,7 +455,7 @@ gsm610_wav_encode_block     (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
 
        /* Encode the samples. */
        gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
-       gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAV_W64_GSM610_SAMPLES/2, pgsm610->block+WAV_W64_GSM610_BLOCKSIZE/2) ;
+       gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAV_W64_GSM610_SAMPLES / 2, pgsm610->block+WAV_W64_GSM610_BLOCKSIZE / 2) ;
 
        /* Write the block to disk. */
        if ((k = psf_fwrite (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf)) != WAV_W64_GSM610_BLOCKSIZE)
@@ -462,7 +465,7 @@ gsm610_wav_encode_block     (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
        pgsm610->blockcount ++ ;
 
        /* Set samples to zero for next block. */
-       memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+       memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ;
 
        return 1 ;
 } /* gsm610_wav_encode_block */
@@ -517,6 +520,7 @@ gsm610_write_s      (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 static sf_count_t
 gsm610_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -525,8 +529,8 @@ gsm610_write_i      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
                return 0 ;
        pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -542,6 +546,7 @@ gsm610_write_i      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t
 gsm610_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -553,8 +558,8 @@ gsm610_write_f      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -570,6 +575,7 @@ gsm610_write_f      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 static sf_count_t
 gsm610_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 {      GSM610_PRIVATE *pgsm610 ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount = 0, count ;
        sf_count_t      total = 0 ;
@@ -581,8 +587,8 @@ gsm610_write_d      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index a1a189e..2fd0a0b 100644 (file)
--- a/src/id3.c
+++ b/src/id3.c
@@ -40,11 +40,16 @@ id3_skip (SF_PRIVATE * psf)
                offset = (offset << 7) | (buf [8] & 0x7f) ;
                offset = (offset << 7) | (buf [9] & 0x7f) ;
 
-               psf_binheader_readf (psf, "j", make_size_t (offset)) ;
-
                psf_log_printf (psf, "ID3 length : %d\n--------------------\n", offset) ;
 
-               psf->fileoffset = 10 + offset ;
+               /* Never want to jump backwards in a file. */
+               if (offset < 0)
+                       return 0 ;
+
+               /* Calculate new file offset and position ourselves there. */
+               psf->fileoffset += offset + 10 ;
+               psf_binheader_readf (psf, "p", psf->fileoffset) ;
+
                return 1 ;
                } ;
 
index b0763ea..dd11b0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -37,11 +37,7 @@ typedef struct IMA_ADPCM_PRIVATE_tag
        int                             stepindx [2] ;
        unsigned char   *block ;
        short                   *samples ;
-#if HAVE_FLEXIBLE_ARRAY
        short                   data    [] ; /* ISO C99 struct flexible array. */
-#else
-       short                   data    [0] ; /* This is a hack and might not work. */
-#endif
 } IMA_ADPCM_PRIVATE ;
 
 /*============================================================================================
@@ -50,9 +46,9 @@ typedef struct IMA_ADPCM_PRIVATE_tag
 
 static int ima_indx_adjust [16] =
 {      -1, -1, -1, -1,         /* +0 - +3, decrease the step size */
-     2,  4,  6,  8,     /* +4 - +7, increase the step size */
-    -1, -1, -1, -1,            /* -0 - -3, decrease the step size */
-     2,  4,  6,  8,            /* -4 - -7, increase the step size */
+       +2, +4, +6, +8,         /* +4 - +7, increase the step size */
+       -1, -1, -1, -1,         /* -0 - -3, decrease the step size */
+       +2, +4, +6, +8,         /* -4 - -7, increase the step size */
 } ;
 
 static int ima_step_size [89] =
@@ -81,7 +77,8 @@ static sf_count_t ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
 static sf_count_t ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
 
-static sf_count_t      ima_seek        (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static sf_count_t aiff_ima_seek                (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static sf_count_t wav_w64_ima_seek     (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
 
 static int     ima_close       (SF_PRIVATE *psf) ;
 
@@ -128,7 +125,7 @@ wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
                        return error ;
 
        psf->codec_close = ima_close ;
-       psf->seek = ima_seek ;
+       psf->seek = wav_w64_ima_seek ;
 
        return 0 ;
 } /* wav_w64_ima_init */
@@ -149,6 +146,7 @@ aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
                        return error ;
 
        psf->codec_close = ima_close ;
+       psf->seek = aiff_ima_seek ;
 
        return 0 ;
 } /* aiff_ima_init */
@@ -202,8 +200,13 @@ ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
        psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
                                                        psf->filelength - psf->dataoffset ;
 
-    if (pima->blocksize == 0)
-       {       psf_log_printf (psf, "*** Error : pima->blocksize should not be zero.\n") ;
+       if (pima->blocksize <= 0)
+       {       psf_log_printf (psf, "*** Error : pima->blocksize should be > 0.\n") ;
+               return SFE_INTERNAL ;
+               } ;
+
+       if (pima->samplesperblock <= 0)
+       {       psf_log_printf (psf, "*** Error : pima->samplesperblock should be > 0.\n") ;
                return SFE_INTERNAL ;
                } ;
 
@@ -273,7 +276,8 @@ count ++ ;
        {       blockdata = pima->block + chan * 34 ;
                sampledata = pima->samples + chan ;
 
-               predictor = (blockdata [0] << 8) | (blockdata [1] & 0x80) ;
+               /* Sign-extend from 16 bits to 32. */
+               predictor = (int) ((short) ((blockdata [0] << 8) | (blockdata [1] & 0x80))) ;
 
                stepindx = blockdata [1] & 0x7F ;
                stepindx = clamp_ima_step_index (stepindx) ;
@@ -625,6 +629,7 @@ ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 static sf_count_t
 ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -633,13 +638,13 @@ ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
                return 0 ;
        pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = ima_read_block (psf, pima, sptr, readcount) ;
                for (k = 0 ; k < readcount ; k++)
-                       ptr [total + k] = ((int) sptr [k]) << 16 ;
+                       ptr [total + k] = arith_shift_left (sptr [k], 16) ;
                total += count ;
                len -= readcount ;
                if (count != readcount)
@@ -652,6 +657,7 @@ ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 static sf_count_t
 ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -663,8 +669,8 @@ ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = ima_read_block (psf, pima, sptr, readcount) ;
@@ -682,6 +688,7 @@ ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 static sf_count_t
 ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -693,8 +700,8 @@ ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = ima_read_block (psf, pima, sptr, readcount) ;
@@ -710,7 +717,53 @@ ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 } /* ima_read_d */
 
 static sf_count_t
-ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+aiff_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{      IMA_ADPCM_PRIVATE *pima ;
+       int                     newblock, newsample, newblockaiff ;
+
+       if (! psf->codec_data)
+               return 0 ;
+       pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+       if (psf->datalength < 0 || psf->dataoffset < 0)
+       {       psf->error = SFE_BAD_SEEK ;
+               return PSF_SEEK_ERROR ;
+               } ;
+
+       if (offset == 0)
+       {       psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+               pima->blockcount = 0 ;
+               pima->decode_block (psf, pima) ;
+               pima->samplecount = 0 ;
+               return 0 ;
+               } ;
+
+       if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
+       {       psf->error = SFE_BAD_SEEK ;
+               return  PSF_SEEK_ERROR ;
+               } ;
+
+       newblock                = offset / pima->samplesperblock ;
+       newsample               = offset % pima->samplesperblock ;
+       newblockaiff    = newblock * psf->sf.channels ;
+
+       if (mode == SFM_READ)
+       {       psf_fseek (psf, psf->dataoffset + newblockaiff * pima->blocksize, SEEK_SET) ;
+               pima->blockcount = newblockaiff ;
+               pima->decode_block (psf, pima) ;
+               pima->samplecount = newsample ;
+               }
+       else
+       {       /* What to do about write??? */
+               psf->error = SFE_BAD_SEEK ;
+               return  PSF_SEEK_ERROR ;
+               } ;
+
+       return newblock * pima->samplesperblock + newsample ;
+} /* aiff_ima_seek */
+
+static sf_count_t
+wav_w64_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
 {      IMA_ADPCM_PRIVATE *pima ;
        int                     newblock, newsample ;
 
@@ -752,7 +805,7 @@ ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
                } ;
 
        return newblock * pima->samplesperblock + newsample ;
-} /* ima_seek */
+} /* wav_w64_ima_seek */
 
 /*==========================================================================================
 ** IMA ADPCM Write Functions.
@@ -860,6 +913,7 @@ ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 static sf_count_t
 ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -868,8 +922,8 @@ ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
                return 0 ;
        pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
@@ -887,6 +941,7 @@ ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t
 ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -898,8 +953,8 @@ ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
@@ -917,6 +972,7 @@ ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 static sf_count_t
 ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 {      IMA_ADPCM_PRIVATE *pima ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -928,8 +984,8 @@ ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
index 399d2e4..2532160 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (c) 2007 <robs@users.sourceforge.net>
 **
 ** This library is free software; you can redistribute it and/or modify it
@@ -63,7 +63,7 @@ ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type)
        else
        {       state->max_step_index = ARRAY_LEN (oki_steps) - 1 ;
                state->steps = oki_steps ;
-               state->mask = (~0) << 4 ;
+               state->mask = arith_shift_left (~0, 4) ;
                } ;
 
 } /* ima_oki_adpcm_init */
@@ -77,7 +77,7 @@ adpcm_decode (IMA_OKI_ADPCM * state, int code)
        s = ((state->steps [state->step_index] * s) >> 3) & state->mask ;
 
        if (code & 8)
-       s = -s ;
+               s = -s ;
        s += state->last_output ;
 
        if (s < MIN_SAMPLE || s > MAX_SAMPLE)
index ca9d7b4..5f79944 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -287,9 +287,8 @@ interleave_read_double      (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 */
 
 static sf_count_t
-interleave_seek        (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start)
-{      psf = psf ;     mode = mode ;
-
+interleave_seek        (SF_PRIVATE * UNUSED (psf), int UNUSED (mode), sf_count_t samples_from_start)
+{
        /*
        ** Do nothing here. This is a place holder to prevent the default
        ** seek function from being called.
index 4aa1173..47b8c60 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -95,7 +95,7 @@ ircam_open    (SF_PRIVATE *psf)
                if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)
                        psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
 
-               psf->dataoffset = IRCAM_DATA_OFFSET ;
+               psf->dataoffset = IRCAM_DATA_OFFSET ;
 
                if ((error = ircam_write_header (psf, SF_FALSE)))
                        return error ;
@@ -147,11 +147,11 @@ ircam_read_header (SF_PRIVATE *psf)
 
        psf->endian = SF_ENDIAN_LITTLE ;
 
-       if (psf->sf.channels > 256)
+       if (psf->sf.channels > SF_MAX_CHANNELS)
        {       psf_binheader_readf (psf, "Epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ;
 
                /* Sanity checking for endian-ness detection. */
-               if (psf->sf.channels > 256)
+               if (psf->sf.channels > SF_MAX_CHANNELS)
                {       psf_log_printf (psf, "marker: 0x%X\n", marker) ;
                        return SFE_IRCAM_BAD_CHANNELS ;
                        } ;
@@ -163,9 +163,10 @@ ircam_read_header  (SF_PRIVATE *psf)
 
        psf->sf.samplerate = (int) samplerate ;
 
-       psf_log_printf (psf, "  Sample Rate : %d\n"
-                                                "  Channels    : %d\n"
-                                                "  Encoding    : %X => %s\n", psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ;
+       psf_log_printf (psf,    "  Sample Rate : %d\n"
+                                                       "  Channels    : %d\n"
+                                                       "  Encoding    : %X => %s\n",
+                                               psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ;
 
        switch (encoding)
        {       case IRCAM_PCM_16 :
index 93cab02..4194ff3 100644 (file)
@@ -38,4 +38,10 @@ sf_open_fd           @70
 sf_wchar_open        @71
 sf_open_virtual      @80
 sf_write_sync        @90
+sf_set_chunk         @100
+sf_get_chunk_size    @101
+sf_get_chunk_data    @102
+sf_get_chunk_iterator @103
+sf_next_chunk_iterator @104
+sf_current_byterate  @110
 
index 184cc18..3ad71e6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -25,7 +25,7 @@
 #include       "sfendian.h"
 #include       "common.h"
 
-#if (OS_IS_MACOSX == 1)
+#if (OSX_DARWIN_VERSION >= 1)
 
 int
 macbinary3_open (SF_PRIVATE * UNUSED (psf))
@@ -41,5 +41,5 @@ macbinary3_open (SF_PRIVATE * UNUSED (psf))
        return 0 ;
 } /* macbinary3_open */
 
-#endif /* OS_IS_MACOSX */
+#endif /* OSX_DARWIN_VERSION */
 
index 3471e34..0f6604d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -123,9 +123,6 @@ mat4_open   (SF_PRIVATE *psf)
                default : break ;
                } ;
 
-       if (error)
-               return error ;
-
        return error ;
 } /* mat4_open */
 
@@ -206,8 +203,9 @@ mat4_write_header (SF_PRIVATE *psf, int calc_length)
 
 static int
 mat4_read_header (SF_PRIVATE *psf)
-{      int             marker, rows, cols, imag ;
-       unsigned namesize ;
+{      char    buffer [256] ;
+       uint32_t marker, namesize ;
+       int             rows, cols, imag ;
        double  value ;
        const char *marker_str ;
        char    name [64] ;
@@ -244,8 +242,8 @@ mat4_read_header (SF_PRIVATE *psf)
 
        psf_binheader_readf (psf, "d", &value) ;
 
-       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), " Value : %f\n", value) ;
-       psf_log_printf (psf, psf->u.cbuf) ;
+       snprintf (buffer, sizeof (buffer), " Value : %f\n", value) ;
+       psf_log_printf (psf, buffer) ;
 
        if ((rows != 1) || (cols != 1))
                return SFE_MAT4_NO_SAMPLERATE ;
@@ -274,9 +272,13 @@ mat4_read_header (SF_PRIVATE *psf)
 
        psf->dataoffset = psf_ftell (psf) ;
 
-       if (rows == 0 && cols == 0)
+       if (rows == 0)
        {       psf_log_printf (psf, "*** Error : zero channel count.\n") ;
                return SFE_CHANNEL_COUNT_ZERO ;
+               }
+       else if (rows > SF_MAX_CHANNELS)
+       {       psf_log_printf (psf, "*** Error : channel count %d > SF_MAX_CHANNELS.\n", rows) ;
+               return SFE_CHANNEL_COUNT ;
                } ;
 
        psf->sf.channels        = rows ;
index 338477e..164fb29 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -157,6 +157,7 @@ mat5_write_header (SF_PRIVATE *psf, int calc_length)
 {      static const char       *filename = "MATLAB 5.0 MAT-file, written by " PACKAGE "-" VERSION ", " ;
        static const char       *sr_name = "samplerate\0\0\0\0\0\0\0\0\0\0\0" ;
        static const char       *wd_name = "wavedata\0" ;
+       char            buffer [256] ;
        sf_count_t      current, datasize ;
        int                     encoding ;
 
@@ -204,11 +205,11 @@ mat5_write_header (SF_PRIVATE *psf, int calc_length)
        psf->headindex = 0 ;
        psf_fseek (psf, 0, SEEK_SET) ;
 
-       psf_get_date_str (psf->u.cbuf, sizeof (psf->u.scbuf)) ;
-       psf_binheader_writef (psf, "bb", filename, strlen (filename), psf->u.cbuf, strlen (psf->u.cbuf) + 1) ;
+       psf_get_date_str (buffer, sizeof (buffer)) ;
+       psf_binheader_writef (psf, "bb", filename, strlen (filename), buffer, strlen (buffer) + 1) ;
 
-       memset (psf->u.scbuf, ' ', 124 - psf->headindex) ;
-       psf_binheader_writef (psf, "b", psf->u.scbuf, make_size_t (124 - psf->headindex)) ;
+       memset (buffer, ' ', 124 - psf->headindex) ;
+       psf_binheader_writef (psf, "b", buffer, make_size_t (124 - psf->headindex)) ;
 
        psf->rwf_endian = psf->endian ;
 
@@ -257,38 +258,39 @@ mat5_write_header (SF_PRIVATE *psf, int calc_length)
 
 static int
 mat5_read_header (SF_PRIVATE *psf)
-{      char    name [32] ;
+{      char    buffer [256], name [32] ;
        short   version, endian ;
        int             type, flags1, flags2, rows, cols ;
        unsigned size ;
+       int             have_samplerate = 1 ;
 
-       psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, 124) ;
+       psf_binheader_readf (psf, "pb", 0, buffer, 124) ;
 
-       psf->u.scbuf [125] = 0 ;
+       buffer [125] = 0 ;
 
-       if (strlen (psf->u.cbuf) >= 124)
+       if (strlen (buffer) >= 124)
                return SFE_UNIMPLEMENTED ;
 
-       if (strstr (psf->u.cbuf, "MATLAB 5.0 MAT-file") == psf->u.cbuf)
-               psf_log_printf (psf, "%s\n", psf->u.scbuf) ;
+       if (strstr (buffer, "MATLAB 5.0 MAT-file") == buffer)
+               psf_log_printf (psf, "%s\n", buffer) ;
 
 
        psf_binheader_readf (psf, "E22", &version, &endian) ;
 
        if (endian == MI_MARKER)
        {       psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ;
-               if (CPU_IS_LITTLE_ENDIAN) version = ENDSWAP_SHORT (version) ;
+               if (CPU_IS_LITTLE_ENDIAN) version = ENDSWAP_16 (version) ;
                }
        else if (endian == IM_MARKER)
        {       psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ;
-               if (CPU_IS_BIG_ENDIAN) version = ENDSWAP_SHORT (version) ;
+               if (CPU_IS_BIG_ENDIAN) version = ENDSWAP_16 (version) ;
                }
        else
                return SFE_MAT5_BAD_ENDIAN ;
 
        if ((CPU_IS_LITTLE_ENDIAN && endian == IM_MARKER) ||
                        (CPU_IS_BIG_ENDIAN && endian == MI_MARKER))
-               version = ENDSWAP_SHORT (version) ;
+               version = ENDSWAP_16 (version) ;
 
        psf_log_printf (psf, "Version : 0x%04X\n", version) ;
        psf_log_printf (psf, "Endian  : 0x%04X => %s\n", endian,
@@ -317,11 +319,13 @@ mat5_read_header (SF_PRIVATE *psf)
                return SFE_MAT5_NO_BLOCK ;
 
        psf_binheader_readf (psf, "44", &rows, &cols) ;
-       psf_log_printf (psf, "    Rows : %X    Cols : %d\n", rows, cols) ;
+       psf_log_printf (psf, "    Rows : %d    Cols : %d\n", rows, cols) ;
 
        if (rows != 1 || cols != 1)
-               return SFE_MAT5_SAMPLE_RATE ;
-
+       {       if (psf->sf.samplerate == 0)
+                       psf->sf.samplerate = 44100 ;
+               have_samplerate = 0 ;
+               }
        psf_binheader_readf (psf, "4", &type) ;
 
        if (type == MAT5_TYPE_SCHAR)
@@ -355,6 +359,9 @@ mat5_read_header (SF_PRIVATE *psf)
 
        psf_binheader_readf (psf, "44", &type, &size) ;
 
+       if (!have_samplerate)
+               goto skip_samplerate ;
+
        switch (type)
        {       case MAT5_TYPE_DOUBLE :
                                {       double  samplerate ;
@@ -445,6 +452,7 @@ mat5_read_header (SF_PRIVATE *psf)
        psf_binheader_readf (psf, "44", &type, &size) ;
        psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
 
+skip_samplerate :
        /*++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
        if (rows == 0 && cols == 0)
index 7d04f85..2251e53 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 typedef struct
 {      int                             channels, blocksize, samplesperblock, blocks, dataremaining ;
        int                             blockcount ;
+       int                             sync_error ;
        sf_count_t              samplecount ;
        short                   *samples ;
        unsigned char   *block ;
-#if HAVE_FLEXIBLE_ARRAY
        short                   dummydata [] ; /* ISO C99 struct flexible array. */
-#else
-       short                   dummydata [0] ; /* This is a hack an might not work. */
-#endif
 } MSADPCM_PRIVATE ;
 
 /*============================================================================================
@@ -140,12 +137,18 @@ wav_w64_msadpcm_init      (SF_PRIVATE *psf, int blockalign, int samplesperblock)
        if (psf->file.mode == SFM_WRITE)
                samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
 
+       if (blockalign < 7 * psf->sf.channels)
+       {       psf_log_printf (psf, "*** Error blockalign (%d) should be > %d.\n", blockalign, 7 * psf->sf.channels) ;
+               return SFE_INTERNAL ;
+               } ;
+
        pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
 
        if (! (psf->codec_data = calloc (1, pmssize)))
                return SFE_MALLOC_FAILED ;
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
+       pms->sync_error = 0 ;
        pms->samples    = pms->dummydata ;
        pms->block              = (unsigned char*) (pms->dummydata + psf->sf.channels * samplesperblock) ;
 
@@ -153,13 +156,13 @@ wav_w64_msadpcm_init      (SF_PRIVATE *psf, int blockalign, int samplesperblock)
        pms->blocksize  = blockalign ;
        pms->samplesperblock = samplesperblock ;
 
-       if (pms->blocksize == 0)
-       {       psf_log_printf (psf, "*** Error : pms->blocksize should not be zero.\n") ;
+       if (pms->blocksize <= 0)
+       {       psf_log_printf (psf, "*** Error : pms->blocksize should be > 0.\n") ;
                return SFE_INTERNAL ;
                } ;
 
        if (psf->file.mode == SFM_READ)
-       {       pms->dataremaining       = psf->datalength ;
+       {       pms->dataremaining = psf->datalength ;
 
                if (psf->datalength % pms->blocksize)
                        pms->blocks = psf->datalength / pms->blocksize + 1 ;
@@ -174,8 +177,6 @@ wav_w64_msadpcm_init        (SF_PRIVATE *psf, int blockalign, int samplesperblock)
 
                psf->sf.frames = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
 
-               psf_log_printf (psf, " bpred   idelta\n") ;
-
                msadpcm_decode_block (psf, pms) ;
 
                psf->read_short         = msadpcm_read_s ;
@@ -201,14 +202,28 @@ wav_w64_msadpcm_init      (SF_PRIVATE *psf, int blockalign, int samplesperblock)
        return 0 ;
 } /* wav_w64_msadpcm_init */
 
+
+static inline short
+msadpcm_get_bpred (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, unsigned char value)
+{      if (value >= MSADPCM_ADAPT_COEFF_COUNT)
+       {       if (pms->sync_error == 0)
+               {       pms->sync_error = 1 ;
+                       psf_log_printf (psf, "MS ADPCM synchronisation error (%u should be < %u).\n", value, MSADPCM_ADAPT_COEFF_COUNT) ;
+                       } ;
+               return 0 ;
+               } ;
+       return value ;
+} /* msadpcm_get_bpred */
+
+
 static int
 msadpcm_decode_block   (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
 {      int             chan, k, blockindx, sampleindx ;
        short   bytecode, bpred [2], chan_idelta [2] ;
 
-    int predict ;
-    int current ;
-    int idelta ;
+       int predict ;
+       int current ;
+       int idelta ;
 
        pms->blockcount ++ ;
        pms->samplecount = 0 ;
@@ -219,37 +234,30 @@ msadpcm_decode_block      (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
                } ;
 
        if ((k = psf_fread (pms->block, 1, pms->blocksize, psf)) != pms->blocksize)
-               psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+       {       psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+               if (k <= 0)
+                       return 1 ;
+               } ;
 
        /* Read and check the block header. */
 
        if (pms->channels == 1)
-       {       bpred [0] = pms->block [0] ;
-
-               if (bpred [0] >= 7)
-                       psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
+       {       bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ;
 
                chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
                chan_idelta [1] = 0 ;
 
-               psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ;
-
                pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
                pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
                blockindx = 7 ;
                }
        else
-       {       bpred [0] = pms->block [0] ;
-               bpred [1] = pms->block [1] ;
-
-               if (bpred [0] >= 7 || bpred [1] >= 7)
-                       psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
+       {       bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ;
+               bpred [1] = msadpcm_get_bpred (psf, pms, pms->block [1]) ;
 
                chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
                chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
 
-               psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
-
                pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
                pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
 
@@ -277,7 +285,7 @@ msadpcm_decode_block        (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
        sampleindx = 2 * pms->channels ;
        while (blockindx < pms->blocksize)
        {       bytecode = pms->block [blockindx++] ;
-               pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ;
+               pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ;
                pms->samples [sampleindx++] = bytecode & 0x0F ;
                } ;
 
@@ -296,7 +304,7 @@ msadpcm_decode_block        (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
                if (bytecode & 0x8)
                        bytecode -= 0x10 ;
 
-       predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]])
+               predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]])
                                        + (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
                current = (bytecode * idelta) + predict ;
 
@@ -308,7 +316,7 @@ msadpcm_decode_block        (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
                pms->samples [k] = current ;
                } ;
 
-       return 1 ;
+       return 0 ;
 } /* msadpcm_decode_block */
 
 static sf_count_t
@@ -322,7 +330,8 @@ msadpcm_read_block  (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
                        } ;
 
                if (pms->samplecount >= pms->samplesperblock)
-                       msadpcm_decode_block (psf, pms) ;
+                       if (msadpcm_decode_block (psf, pms) != 0)
+                               return total ;
 
                count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
                count = (len - indx > count) ? count : len - indx ;
@@ -349,7 +358,8 @@ msadpcm_read_s      (SF_PRIVATE *psf, short *ptr, sf_count_t len)
        while (len > 0)
        {       readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
 
-               count = msadpcm_read_block (psf, pms, ptr, readcount) ;
+               if ((count = msadpcm_read_block (psf, pms, ptr, readcount)) <= 0)
+                       return -1 ;
 
                total += count ;
                len -= count ;
@@ -363,6 +373,7 @@ msadpcm_read_s      (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -371,13 +382,16 @@ msadpcm_read_i    (SF_PRIVATE *psf, int *ptr, sf_count_t len)
                return 0 ;
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+
+               if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
+                       return -1 ;
+
                for (k = 0 ; k < readcount ; k++)
-                       ptr [total + k] = sptr [k] << 16 ;
+                       ptr [total + k] = arith_shift_left (sptr [k], 16) ;
                total += count ;
                len -= readcount ;
                if (count != readcount)
@@ -389,6 +403,7 @@ msadpcm_read_i      (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
@@ -399,11 +414,14 @@ msadpcm_read_f    (SF_PRIVATE *psf, float *ptr, sf_count_t len)
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+
+               if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
+                       return -1 ;
+
                for (k = 0 ; k < readcount ; k++)
                        ptr [total + k] = normfact * (float) (sptr [k]) ;
                total += count ;
@@ -417,22 +435,25 @@ msadpcm_read_f    (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount = 0, count ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
-       normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
-
        if (! psf->codec_data)
                return 0 ;
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+
+               if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0)
+                       return -1 ;
+
                for (k = 0 ; k < readcount ; k++)
                        ptr [total + k] = normfact * (double) (sptr [k]) ;
                total += count ;
@@ -440,6 +461,7 @@ msadpcm_read_d      (SF_PRIVATE *psf, double *ptr, sf_count_t len)
                if (count != readcount)
                        break ;
                } ;
+
        return total ;
 } /* msadpcm_read_d */
 
@@ -673,6 +695,7 @@ msadpcm_write_s     (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_write_i        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -681,8 +704,8 @@ msadpcm_write_i     (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
                return 0 ;
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -699,6 +722,7 @@ msadpcm_write_i     (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_write_f        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -710,8 +734,8 @@ msadpcm_write_f     (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -728,6 +752,7 @@ msadpcm_write_f     (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 static sf_count_t
 msadpcm_write_d        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 {      MSADPCM_PRIVATE *pms ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -739,8 +764,8 @@ msadpcm_write_d     (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
                return 0 ;
        pms = (MSADPCM_PRIVATE*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index cd3afac..2aa679e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -118,14 +118,12 @@ static char bad_header [] =
 
        static int
 nist_read_header (SF_PRIVATE *psf)
-{      char    *psf_header ;
+{      char    psf_header [NIST_HEADER_LENGTH + 2] ;
        int             bitwidth = 0, count, encoding ;
        unsigned bytes = 0 ;
        char    str [64], *cptr ;
        long    samples ;
 
-       psf_header = psf->u.cbuf ;
-
        if (sizeof (psf->header) <= NIST_HEADER_LENGTH)
                return SFE_INTERNAL ;
 
index d868fdb..7bc4b31 100644 (file)
--- a/src/ogg.c
+++ b/src/ogg.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2007 John ffitch
 **
 ** This program is free software ; you can redistribute it and/or modify
@@ -65,6 +65,9 @@ ogg_open (SF_PRIVATE *psf)
        ogg_stream_clear (&odata->ostream) ;
        psf_fseek (psf, pos, SEEK_SET) ;
 
+       if (SF_ENDIAN (psf->sf.format) != 0)
+               return SFE_BAD_ENDIAN ;
+
        switch (psf->sf.format)
        {       case SF_FORMAT_OGG | SF_FORMAT_VORBIS :
                        return ogg_vorbis_open (psf) ;
@@ -88,7 +91,7 @@ ogg_open (SF_PRIVATE *psf)
                        break ;
                } ;
 
-       psf_log_printf (psf, "%s : mode should be SFM_READ or SFM_WRITE.\n", __func__) ;
+       psf_log_printf (psf, "%s : bad psf->sf.format 0x%x.\n", __func__, psf->sf.format) ;
        return SFE_INTERNAL ;
 } /* ogg_open */
 
@@ -106,7 +109,7 @@ ogg_close (SF_PRIVATE *psf)
 static int
 ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata)
 {      char *buffer ;
-       int      bytes, nn ;
+       int     bytes, nn ;
 
        /* Call this here so it only gets called once, so no memory is leaked. */
        ogg_sync_init (&odata->osync) ;
@@ -220,7 +223,7 @@ ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og)
 
                if (memcmp (og->body, codec_lookup [k].str, codec_lookup [k].len) == 0)
                {       psf_log_printf (psf, "Ogg stream data : %s\n", codec_lookup [k].name) ;
-                       psf_log_printf (psf, "Stream serialno : %010D\n", (int64_t) ogg_page_serialno (og)) ;
+                       psf_log_printf (psf, "Stream serialno : %u\n", (uint32_t) ogg_page_serialno (og)) ;
                        return codec_lookup [k].codec ;
                        } ;
                } ;
diff --git a/src/ogg_opus.c b/src/ogg_opus.c
new file mode 100644 (file)
index 0000000..0824810
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+** Copyright (C) 2013 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS)
+
+#include <ogg/ogg.h>
+
+#include "ogg.h"
+
+typedef struct
+{      int32_t serialno ;
+
+
+       void * state ;
+} OPUS_PRIVATE ;
+
+static int     ogg_opus_read_header (SF_PRIVATE * psf) ;
+static int     ogg_opus_close (SF_PRIVATE *psf) ;
+
+int
+ogg_opus_open (SF_PRIVATE *psf)
+{      OGG_PRIVATE* odata = psf->container_data ;
+       OPUS_PRIVATE* oopus = calloc (1, sizeof (OPUS_PRIVATE)) ;
+       int     error = 0 ;
+
+       if (odata == NULL)
+       {       psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ;
+               return SFE_INTERNAL ;
+               } ;
+
+       psf->codec_data = oopus ;
+       if (oopus == NULL)
+               return SFE_MALLOC_FAILED ;
+
+       if (psf->file.mode == SFM_RDWR)
+               return SFE_BAD_MODE_RW ;
+
+       if (psf->file.mode == SFM_READ)
+       {       /* Call this here so it only gets called once, so no memory is leaked. */
+               ogg_sync_init (&odata->osync) ;
+
+               if ((error = ogg_opus_read_header (psf)))
+                       return error ;
+
+#if 0
+               psf->read_short         = ogg_opus_read_s ;
+               psf->read_int           = ogg_opus_read_i ;
+               psf->read_float         = ogg_opus_read_f ;
+               psf->read_double        = ogg_opus_read_d ;
+               psf->sf.frames          = ogg_opus_length (psf) ;
+#endif
+               } ;
+
+       psf->codec_close = ogg_opus_close ;
+
+       if (psf->file.mode == SFM_WRITE)
+       {
+#if 0
+               /* Set the default oopus quality here. */
+               vdata->quality = 0.4 ;
+
+               psf->write_header       = ogg_opus_write_header ;
+               psf->write_short        = ogg_opus_write_s ;
+               psf->write_int          = ogg_opus_write_i ;
+               psf->write_float        = ogg_opus_write_f ;
+               psf->write_double       = ogg_opus_write_d ;
+#endif
+
+               psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
+               psf->strings.flags = SF_STR_ALLOW_START ;
+               } ;
+
+       psf->bytewidth = 1 ;
+       psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+#if 0
+       psf->seek = ogg_opus_seek ;
+       psf->command = ogg_opus_command ;
+#endif
+
+       /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
+       psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ;
+       psf->sf.sections = 1 ;
+
+       psf->datalength = 1 ;
+       psf->dataoffset = 0 ;
+       /* End FIXME. */
+
+       return error ;
+} /* ogg_opus_open */
+
+static int
+ogg_opus_read_header (SF_PRIVATE * UNUSED (psf))
+{
+       return 0 ;
+} /* ogg_opus_read_header */
+
+static int
+ogg_opus_close (SF_PRIVATE * UNUSED (psf))
+{
+
+
+       return 0 ;
+} /* ogg_opus_close */
+
+
+#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */
+
+int
+ogg_opus_open (SF_PRIVATE *psf)
+{
+       psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Opus support.\n") ;
+       return SFE_UNIMPLEMENTED ;
+} /* ogg_opus_open */
+
+#endif
index eb6a53e..2e3b7f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -100,7 +100,7 @@ ogg_pcm_open (SF_PRIVATE *psf)
 #endif
 
                psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
-               psf->str_flags = SF_STR_ALLOW_START ;
+               psf->strings.flags = SF_STR_ALLOW_START ;
                } ;
 
        psf->bytewidth = 1 ;
index f0ebb62..f24e242 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -116,7 +116,7 @@ ogg_speex_open (SF_PRIVATE *psf)
 #endif
 
                psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
-               psf->str_flags = SF_STR_ALLOW_START ;
+               psf->strings.flags = SF_STR_ALLOW_START ;
                } ;
 
        psf->bytewidth = 1 ;
@@ -310,7 +310,7 @@ spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int
        if (!psf->sf.samplerate)
                psf->sf.samplerate = spx->header.rate ;
        /* Adjust rate if --force-* options are used */
-       if (force_mode!=-1)
+       if (force_mode != -1)
        {       if (spx->header.mode < force_mode)
                {       psf->sf.samplerate <<= (force_mode - spx->header.mode) ;
                        spx->granule_frame_size >>= (force_mode - spx->header.mode) ;
@@ -360,7 +360,7 @@ spx_print_comments (const char *c, int length)
        int len, i, nb_fields ;
 
 printf ("%s %d\n", __func__, __LINE__) ;
-       if (length<8)
+       if (length < 8)
        {       fprintf (stderr, "Invalid/corrupted comments\n") ;
                return ;
                }
@@ -381,7 +381,7 @@ printf ("%s %d\n", __func__, __LINE__) ;
        nb_fields = readint (c, 0) ;
        c += 4 ;
        for (i = 0 ; i < nb_fields ; i++)
-       {       if (c+4>end)
+       {       if (c + 4 > end)
                {       fprintf (stderr, "Invalid/corrupted comments\n") ;
                        return ;
                        } ;
index 99223cd..0656f4f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2002-2005 Michael Smith <msmith@xiph.org>
 ** Copyright (C) 2007 John ffitch
 **
 
 #include "ogg.h"
 
-typedef int convert_func (int, void *, int, int, float **) ;
+typedef int convert_func (SF_PRIVATE *psf, int, void *, int, int, float **) ;
 
 static int     vorbis_read_header (SF_PRIVATE *psf, int log_data) ;
 static int     vorbis_write_header (SF_PRIVATE *psf, int calc_length) ;
 static int     vorbis_close (SF_PRIVATE *psf) ;
 static int     vorbis_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+static int     vorbis_byterate (SF_PRIVATE *psf) ;
 static sf_count_t      vorbis_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
 static sf_count_t      vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
 static sf_count_t      vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
@@ -108,6 +109,8 @@ static STR_PAIRS vorbis_metatypes [] =
        {       SF_STR_DATE,            "Date" },
        {       SF_STR_ALBUM,           "Album" },
        {       SF_STR_LICENSE,         "License" },
+       {       SF_STR_TRACKNUMBER,     "Tracknumber" },
+       {       SF_STR_GENRE,           "Genre" },
 } ;
 
 typedef struct
@@ -132,7 +135,7 @@ vorbis_read_header (SF_PRIVATE *psf, int log_data)
        OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
        VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
        char *buffer ;
-       int      bytes ;
+       int     bytes ;
        int i, nn ;
 
        odata->eos = 0 ;
@@ -249,7 +252,7 @@ vorbis_read_header (SF_PRIVATE *psf, int log_data)
        **      header page is the only place where missing data is fatal.
        */
 
-       i = 0 ;                  /* Count of number of packets read */
+       i = 0 ;                 /* Count of number of packets read */
        while (i < 2)
        {       int result = ogg_sync_pageout (&odata->osync, &odata->opage) ;
                if (result == 0)
@@ -349,10 +352,10 @@ vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
 
 #if 0
        ret = vorbis_encode_init (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) ; /* average bitrate mode */
-       ret = ( vorbis_encode_setup_managed (&vdata->vinfo, psf->sf.channels,
-                                                psf->sf.samplerate, -1, 128000, -1) ||
-               vorbis_encode_ctl (&vdata->vinfo, OV_ECTL_RATEMANAGE_AVG, NULL) ||
-               vorbis_encode_setup_init (&vdata->vinfo)) ;
+       ret = ( vorbis_encode_setup_managed (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1)
+                       || vorbis_encode_ctl (&vdata->vinfo, OV_ECTL_RATEMANAGE_AVG, NULL)
+                       || vorbis_encode_setup_init (&vdata->vinfo)
+                       ) ;
 #endif
        if (ret)
                return SFE_BAD_OPEN_FORMAT ;
@@ -366,22 +369,25 @@ vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
        {       const char * name ;
 
-               if (psf->strings [k].type == 0)
+               if (psf->strings.data [k].type == 0)
                        break ;
 
-               switch (psf->strings [k].type)
-               {       case SF_STR_TITLE :             name = "TITLE" ; break ;
-                       case SF_STR_COPYRIGHT : name = "COPYRIGHT" ; break ;
-                       case SF_STR_SOFTWARE :  name = "SOFTWARE" ; break ;
-                       case SF_STR_ARTIST :    name = "ARTIST" ; break ;
-                       case SF_STR_COMMENT :   name = "COMMENT" ; break ;
-                       case SF_STR_DATE :              name = "DATE" ; break ;
-                       case SF_STR_ALBUM :             name = "ALBUM" ; break ;
-                       case SF_STR_LICENSE :   name = "LICENSE" ; break ;
+               switch (psf->strings.data [k].type)
+               {       case SF_STR_TITLE :                     name = "TITLE" ; break ;
+                       case SF_STR_COPYRIGHT :         name = "COPYRIGHT" ; break ;
+                       case SF_STR_SOFTWARE :          name = "SOFTWARE" ; break ;
+                       case SF_STR_ARTIST :            name = "ARTIST" ; break ;
+                       case SF_STR_COMMENT :           name = "COMMENT" ; break ;
+                       case SF_STR_DATE :                      name = "DATE" ; break ;
+                       case SF_STR_ALBUM :                     name = "ALBUM" ; break ;
+                       case SF_STR_LICENSE :           name = "LICENSE" ; break ;
+                       case SF_STR_TRACKNUMBER :       name = "Tracknumber" ; break ;
+                       case SF_STR_GENRE :             name = "Genre" ; break ;
+
                        default : continue ;
                        } ;
 
-               vorbis_comment_add_tag (&vdata->vcomment, name, psf->strings [k].str) ;
+               vorbis_comment_add_tag (&vdata->vcomment, name, psf->strings.storage + psf->strings.data [k].offset) ;
                } ;
 
        /* set up the analysis state and auxiliary encoding storage */
@@ -525,14 +531,12 @@ ogg_vorbis_open (SF_PRIVATE *psf)
                psf->write_double       = vorbis_write_d ;
 
                psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
-               psf->str_flags = SF_STR_ALLOW_START ;
+               psf->strings.flags = SF_STR_ALLOW_START ;
                } ;
 
-       psf->bytewidth = 1 ;
-       psf->blockwidth = psf->bytewidth * psf->sf.channels ;
-
        psf->seek = vorbis_seek ;
        psf->command = vorbis_command ;
+       psf->byterate = vorbis_byterate ;
 
        /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
        psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
@@ -550,14 +554,14 @@ vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize)
 {      VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
 
        switch (command)
-       {       case SFC_SET_VBR_ENCODING_QUALITY :
+       {       case SFC_SET_COMPRESSION_LEVEL :
                        if (data == NULL || datasize != sizeof (double))
                                return SF_FALSE ;
 
                        if (psf->have_written)
                                return SF_FALSE ;
 
-                       vdata->quality = *((double *) data) ;
+                       vdata->quality = 1.0 - *((double *) data) ;
 
                        /* Clip range. */
                        vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ;
@@ -573,36 +577,56 @@ vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize)
 } /* vorbis_command */
 
 static int
-vorbis_rnull (int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm))
+vorbis_rnull (SF_PRIVATE *UNUSED (psf), int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm))
 {
        return samples * channels ;
 } /* vorbis_rnull */
 
 static int
-vorbis_rshort (int samples, void *vptr, int off, int channels, float **pcm)
+vorbis_rshort (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm)
 {
        short *ptr = (short*) vptr + off ;
        int i = 0, j, n ;
-       for (j = 0 ; j < samples ; j++)
-               for (n = 0 ; n < channels ; n++)
-                       ptr [i++] = lrintf (pcm [n][j] * 32767.0f) ;
+       if (psf->float_int_mult)
+       {
+               float inverse = 1.0 / psf->float_max ;
+               for (j = 0 ; j < samples ; j++)
+                       for (n = 0 ; n < channels ; n++)
+                               ptr [i++] = lrintf ((pcm [n][j] * inverse) * 32767.0f) ;
+       }
+       else
+       {
+               for (j = 0 ; j < samples ; j++)
+                       for (n = 0 ; n < channels ; n++)
+                               ptr [i++] = lrintf (pcm [n][j] * 32767.0f) ;
+       }
        return i ;
 } /* vorbis_rshort */
 
 static int
-vorbis_rint (int samples, void *vptr, int off, int channels, float **pcm)
+vorbis_rint (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm)
 {
        int *ptr = (int*) vptr + off ;
        int i = 0, j, n ;
 
-       for (j = 0 ; j < samples ; j++)
-               for (n = 0 ; n < channels ; n++)
-                       ptr [i++] = lrintf (pcm [n][j] * 2147483647.0f) ;
+       if (psf->float_int_mult)
+       {
+               float inverse = 1.0 / psf->float_max ;
+               for (j = 0 ; j < samples ; j++)
+                       for (n = 0 ; n < channels ; n++)
+                               ptr [i++] = lrintf ((pcm [n][j] * inverse) * 2147483647.0f) ;
+       }
+       else
+       {
+               for (j = 0 ; j < samples ; j++)
+                       for (n = 0 ; n < channels ; n++)
+                               ptr [i++] = lrintf (pcm [n][j] * 2147483647.0f) ;
+       }
        return i ;
 } /* vorbis_rint */
 
 static int
-vorbis_rfloat (int samples, void *vptr, int off, int channels, float **pcm)
+vorbis_rfloat (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm)
 {
        float *ptr = (float*) vptr + off ;
        int i = 0, j, n ;
@@ -613,7 +637,7 @@ vorbis_rfloat (int samples, void *vptr, int off, int channels, float **pcm)
 } /* vorbis_rfloat */
 
 static int
-vorbis_rdouble (int samples, void *vptr, int off, int channels, float **pcm)
+vorbis_rdouble (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm)
 {
        double *ptr = (double*) vptr + off ;
        int i = 0, j, n ;
@@ -636,7 +660,7 @@ vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *t
 
        while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0)
        {       if (samples > len) samples = len ;
-               i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
+               i += transfn (psf, samples, ptr, i, psf->sf.channels, pcm) ;
                len -= samples ;
                /* tell libvorbis how many samples we actually consumed */
                vorbis_synthesis_read (&vdata->vdsp, samples) ;
@@ -644,7 +668,7 @@ vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *t
                if (len == 0)
                        return i ; /* Is this necessary */
        }
-       goto start0 ;            /* Jump into the nasty nest */
+       goto start0 ;           /* Jump into the nasty nest */
        while (len > 0 && !odata->eos)
        {
                while (len > 0 && !odata->eos)
@@ -670,15 +694,16 @@ vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *t
                                        {       /* we have a packet.    Decode it */
                                                if (vorbis_synthesis (&vdata->vblock, &odata->opacket) == 0) /* test for success! */
                                                        vorbis_synthesis_blockin (&vdata->vdsp, &vdata->vblock) ;
-                 /*
-                 **pcm is a multichannel float vector.  In stereo, for
-                 example, pcm [0] is left, and pcm [1] is right.        samples is
-                 the size of each channel.      Convert the float values
-                 (-1.<=range<=1.) to whatever PCM format and write it out */
+                                               /*
+                                               ** pcm is a multichannel float vector.   In stereo, for
+                                               ** example, pcm [0] is left, and pcm [1] is right.       samples is
+                                               ** the size of each channel.     Convert the float values
+                                               ** (-1.<=range<=1.) to whatever PCM format and write it out.
+                                               */
 
                                                while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0)
-                                               {       if (samples>len) samples = len ;
-                                                       i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
+                                               {       if (samples > len) samples = len ;
+                                                       i += transfn (psf, samples, ptr, i, psf->sf.channels, pcm) ;
                                                        len -= samples ;
                                                        /* tell libvorbis how many samples we actually consumed */
                                                        vorbis_synthesis_read (&vdata->vdsp, samples) ;
@@ -875,6 +900,16 @@ vorbis_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
        return 0 ;
 } /* vorbis_seek */
 
+
+static int
+vorbis_byterate (SF_PRIVATE *psf)
+{
+       if (psf->file.mode == SFM_READ)
+               return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ;
+
+       return -1 ;
+} /* vorbis_byterate */
+
 /*==============================================================================
 **     Most of the following code was snipped from Mike Smith's ogginfo utility
 **     which is part of vorbis-tools.
index 7c7d527..84272e5 100644 (file)
--- a/src/paf.c
+++ b/src/paf.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 typedef        struct
 {      int     version ;
        int     endianness ;
-    int        samplerate ;
-    int        format ;
+       int     samplerate ;
+       int     format ;
        int     channels ;
        int     source ;
 } PAF_FMT ;
 
 typedef struct
-{      int                             max_blocks, channels, samplesperblock, blocksize ;
+{      int                             max_blocks, channels, blocksize ;
        int                             read_block, write_block, read_count, write_count ;
        sf_count_t              sample_count ;
        int                             *samples ;
        unsigned char   *block ;
-#if HAVE_FLEXIBLE_ARRAY
        int                             data [] ; /* ISO C99 struct flexible array. */
-#else
-       int                             data [1] ; /* This is a hack and may not work. */
-#endif
 } PAF24_PRIVATE ;
 
 /*------------------------------------------------------------------------------
@@ -202,7 +198,7 @@ paf_read_header     (SF_PRIVATE *psf)
                psf->endian = SF_ENDIAN_BIG ;
                } ;
 
-       if (paf_fmt.channels > SF_MAX_CHANNELS)
+       if (paf_fmt.channels < 1 || paf_fmt.channels > SF_MAX_CHANNELS)
                return SFE_PAF_BAD_CHANNELS ;
 
        psf->datalength = psf->filelength - psf->dataoffset ;
@@ -369,7 +365,6 @@ paf24_init (SF_PRIVATE *psf)
        ppaf24->block           = (unsigned char*) (ppaf24->data + PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ;
 
        ppaf24->blocksize = PAF24_BLOCK_SIZE * ppaf24->channels ;
-       ppaf24->samplesperblock = PAF24_SAMPLES_PER_BLOCK ;
 
        if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
        {       paf24_read_block (psf, ppaf24) ;        /* Read first block. */
@@ -407,7 +402,7 @@ paf24_init (SF_PRIVATE *psf)
        else
                ppaf24->write_block = 0 ;
 
-       psf->sf.frames = ppaf24->samplesperblock * ppaf24->max_blocks ;
+       psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * ppaf24->max_blocks ;
        ppaf24->sample_count = psf->sf.frames ;
 
        return 0 ;
@@ -428,8 +423,8 @@ paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
        if (mode == SFM_READ && ppaf24->write_count > 0)
                paf24_write_block (psf, ppaf24) ;
 
-       newblock        = offset / ppaf24->samplesperblock ;
-       newsample       = offset % ppaf24->samplesperblock ;
+       newblock        = offset / PAF24_SAMPLES_PER_BLOCK ;
+       newsample       = offset % PAF24_SAMPLES_PER_BLOCK ;
 
        switch (mode)
        {       case SFM_READ :
@@ -462,7 +457,7 @@ paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
                                return PSF_SEEK_ERROR ;
                } ;
 
-       return newblock * ppaf24->samplesperblock + newsample ;
+       return newblock * PAF24_SAMPLES_PER_BLOCK + newsample ;
 } /* paf24_seek */
 
 static int
@@ -492,8 +487,8 @@ paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
        ppaf24->read_block ++ ;
        ppaf24->read_count = 0 ;
 
-       if (ppaf24->read_block * ppaf24->samplesperblock > ppaf24->sample_count)
-       {       memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ;
+       if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK > ppaf24->sample_count)
+       {       memset (ppaf24->samples, 0, PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ;
                return 1 ;
                } ;
 
@@ -502,29 +497,15 @@ paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
                psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
 
 
-       if (CPU_IS_LITTLE_ENDIAN)
-       {       /* Do endian swapping if necessary. */
-               if (psf->endian == SF_ENDIAN_BIG)
-                       endswap_int_array       (ppaf24->data, 8 * ppaf24->channels) ;
-
-               /* Unpack block. */
-               for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
-               {       channel = k % ppaf24->channels ;
-                       cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
-                       ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
-                       } ;
-               }
-       else
-       {       /* Do endian swapping if necessary. */
-               if (psf->endian == SF_ENDIAN_BIG)
-                       endswap_int_array       (ppaf24->data, 8 * ppaf24->channels) ;
+       /* Do endian swapping if necessary. */
+       if (psf->endian == SF_ENDIAN_BIG)
+               endswap_int_array       (ppaf24->data, 8 * ppaf24->channels) ;
 
-               /* Unpack block. */
-               for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
-               {       channel = k % ppaf24->channels ;
-                       cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
-                       ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
-                       } ;
+       /* Unpack block. */
+       for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
+       {       channel = k % ppaf24->channels ;
+               cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+               ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (((unsigned) cptr [2]) << 24) ;
                } ;
 
        return 1 ;
@@ -535,15 +516,15 @@ paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
 {      int     count, total = 0 ;
 
        while (total < len)
-       {       if (ppaf24->read_block * ppaf24->samplesperblock >= ppaf24->sample_count)
+       {       if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK >= ppaf24->sample_count)
                {       memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ;
                        return total ;
                        } ;
 
-               if (ppaf24->read_count >= ppaf24->samplesperblock)
+               if (ppaf24->read_count >= PAF24_SAMPLES_PER_BLOCK)
                        paf24_read_block (psf, ppaf24) ;
 
-               count = (ppaf24->samplesperblock - ppaf24->read_count) * ppaf24->channels ;
+               count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->read_count) * ppaf24->channels ;
                count = (len - total > count) ? count : len - total ;
 
                memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ;
@@ -556,7 +537,8 @@ paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
 
 static sf_count_t
 paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
@@ -565,8 +547,8 @@ paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
                return 0 ;
        ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = paf24_read (psf, ppaf24, iptr, readcount) ;
@@ -594,7 +576,8 @@ paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
@@ -606,8 +589,8 @@ paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = paf24_read (psf, ppaf24, iptr, readcount) ;
@@ -621,7 +604,8 @@ paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
@@ -633,8 +617,8 @@ paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = paf24_read (psf, ppaf24, iptr, readcount) ;
@@ -688,10 +672,10 @@ paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
        if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize)
                psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
 
-       if (ppaf24->sample_count < ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count)
-               ppaf24->sample_count = ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count ;
+       if (ppaf24->sample_count < ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count)
+               ppaf24->sample_count = ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count ;
 
-       if (ppaf24->write_count == ppaf24->samplesperblock)
+       if (ppaf24->write_count == PAF24_SAMPLES_PER_BLOCK)
        {       ppaf24->write_block ++ ;
                ppaf24->write_count = 0 ;
                } ;
@@ -704,7 +688,7 @@ paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len)
 {      int             count, total = 0 ;
 
        while (total < len)
-       {       count = (ppaf24->samplesperblock - ppaf24->write_count) * ppaf24->channels ;
+       {       count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->write_count) * ppaf24->channels ;
 
                if (count > len - total)
                        count = len - total ;
@@ -713,7 +697,7 @@ paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len)
                total += count ;
                ppaf24->write_count += count / ppaf24->channels ;
 
-               if (ppaf24->write_count >= ppaf24->samplesperblock)
+               if (ppaf24->write_count >= PAF24_SAMPLES_PER_BLOCK)
                        paf24_write_block (psf, ppaf24) ;
                } ;
 
@@ -722,7 +706,8 @@ paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len)
 
 static sf_count_t
 paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, writecount = 0, count ;
        sf_count_t              total = 0 ;
@@ -731,8 +716,8 @@ paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
                return 0 ;
        ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -772,7 +757,8 @@ paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, writecount = 0, count ;
        sf_count_t              total = 0 ;
@@ -784,8 +770,8 @@ paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -802,7 +788,8 @@ paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      PAF24_PRIVATE   *ppaf24 ;
+{      BUF_UNION               ubuf ;
+       PAF24_PRIVATE   *ppaf24 ;
        int                             *iptr ;
        int                             k, bufferlen, writecount = 0, count ;
        sf_count_t              total = 0 ;
@@ -814,8 +801,8 @@ paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index ec450bc..8cdc445 100644 (file)
--- a/src/pcm.c
+++ b/src/pcm.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -282,14 +282,14 @@ pcm_init (SF_PRIVATE *psf)
 static inline void
 sc2s_array     (signed char *src, int count, short *dest)
 {      while (--count >= 0)
-       {       dest [count] = src [count] << 8 ;
+       {       dest [count] = ((uint16_t) src [count]) << 8 ;
                } ;
 } /* sc2s_array */
 
 static inline void
 uc2s_array     (unsigned char *src, int count, short *dest)
 {      while (--count >= 0)
-       {       dest [count] = (((short) src [count]) - 0x80) << 8 ;
+       {       dest [count] = (((uint32_t) src [count]) - 0x80) << 8 ;
                } ;
 } /* uc2s_array */
 
@@ -300,7 +300,7 @@ let2s_array (tribyte *src, int count, short *dest)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               dest [count] = LET2H_SHORT_PTR (ucptr) ;
+               dest [count] = LET2H_16_PTR (ucptr) ;
                } ;
 } /* let2s_array */
 
@@ -311,8 +311,8 @@ bet2s_array (tribyte *src, int count, short *dest)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               dest [count] = BET2H_SHORT_PTR (ucptr) ;
-                       } ;
+               dest [count] = BET2H_16_PTR (ucptr) ;
+               } ;
 } /* bet2s_array */
 
 static inline void
@@ -320,7 +320,7 @@ lei2s_array (int *src, int count, short *dest)
 {      int value ;
 
        while (--count >= 0)
-       {       value = LEI2H_INT (src [count]) ;
+       {       value = LE2H_32 (src [count]) ;
                dest [count] = value >> 16 ;
                } ;
 } /* lei2s_array */
@@ -330,7 +330,7 @@ bei2s_array (int *src, int count, short *dest)
 {      int value ;
 
        while (--count >= 0)
-       {       value = BEI2H_INT (src [count]) ;
+       {       value = BE2H_32 (src [count]) ;
                dest [count] = value >> 16 ;
                } ;
 } /* bei2s_array */
@@ -341,14 +341,14 @@ bei2s_array (int *src, int count, short *dest)
 static inline void
 sc2i_array     (signed char *src, int count, int *dest)
 {      while (--count >= 0)
-       {       dest [count] = ((int) src [count]) << 24 ;
+       {       dest [count] = arith_shift_left ((int) src [count], 24) ;
                } ;
 } /* sc2i_array */
 
 static inline void
 uc2i_array     (unsigned char *src, int count, int *dest)
 {      while (--count >= 0)
-       {       dest [count] = (((int) src [count]) - 128) << 24 ;
+       {       dest [count] = arith_shift_left (((int) src [count]) - 128, 24) ;
                } ;
 } /* uc2i_array */
 
@@ -357,8 +357,8 @@ bes2i_array (short *src, int count, int *dest)
 {      short value ;
 
        while (--count >= 0)
-       {       value = BES2H_SHORT (src [count]) ;
-               dest [count] = value << 16 ;
+       {       value = BE2H_16 (src [count]) ;
+               dest [count] = arith_shift_left (value, 16) ;
                } ;
 } /* bes2i_array */
 
@@ -367,8 +367,8 @@ les2i_array (short *src, int count, int *dest)
 {      short value ;
 
        while (--count >= 0)
-       {       value = LES2H_SHORT (src [count]) ;
-               dest [count] = value << 16 ;
+       {       value = LE2H_16 (src [count]) ;
+               dest [count] = arith_shift_left (value, 16) ;
                } ;
 } /* les2i_array */
 
@@ -379,8 +379,8 @@ bet2i_array (tribyte *src, int count, int *dest)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               dest [count] = BET2H_INT_PTR (ucptr) ;
-                       } ;
+               dest [count] = psf_get_be24 (ucptr, 0) ;
+               } ;
 } /* bet2i_array */
 
 static inline void
@@ -390,7 +390,7 @@ let2i_array (tribyte *src, int count, int *dest)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               dest [count] = LET2H_INT_PTR (ucptr) ;
+               dest [count] = psf_get_le24 (ucptr, 0) ;
                } ;
 } /* let2i_array */
 
@@ -415,7 +415,7 @@ les2f_array (short *src, int count, float *dest, float normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = LES2H_SHORT (value) ;
+               value = LE2H_16 (value) ;
                dest [count] = ((float) value) * normfact ;
                } ;
 } /* les2f_array */
@@ -426,7 +426,7 @@ bes2f_array (short *src, int count, float *dest, float normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = BES2H_SHORT (value) ;
+               value = BE2H_16 (value) ;
                dest [count] = ((float) value) * normfact ;
                } ;
 } /* bes2f_array */
@@ -439,7 +439,7 @@ let2f_array (tribyte *src, int count, float *dest, float normfact)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               value = LET2H_INT_PTR (ucptr) ;
+               value = psf_get_le24 (ucptr, 0) ;
                dest [count] = ((float) value) * normfact ;
                } ;
 } /* let2f_array */
@@ -452,9 +452,9 @@ bet2f_array (tribyte *src, int count, float *dest, float normfact)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               value = BET2H_INT_PTR (ucptr) ;
+               value = psf_get_be24 (ucptr, 0) ;
                dest [count] = ((float) value) * normfact ;
-                       } ;
+               } ;
 } /* bet2f_array */
 
 static inline void
@@ -463,7 +463,7 @@ lei2f_array (int *src, int count, float *dest, float normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = LEI2H_INT (value) ;
+               value = LE2H_32 (value) ;
                dest [count] = ((float) value) * normfact ;
                } ;
 } /* lei2f_array */
@@ -474,7 +474,7 @@ bei2f_array (int *src, int count, float *dest, float normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = BEI2H_INT (value) ;
+               value = BE2H_32 (value) ;
                dest [count] = ((float) value) * normfact ;
                } ;
 } /* bei2f_array */
@@ -500,7 +500,7 @@ les2d_array (short *src, int count, double *dest, double normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = LES2H_SHORT (value) ;
+               value = LE2H_16 (value) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* les2d_array */
@@ -511,7 +511,7 @@ bes2d_array (short *src, int count, double *dest, double normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = BES2H_SHORT (value) ;
+               value = BE2H_16 (value) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* bes2d_array */
@@ -524,7 +524,7 @@ let2d_array (tribyte *src, int count, double *dest, double normfact)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               value = LET2H_INT_PTR (ucptr) ;
+               value = psf_get_le24 (ucptr, 0) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* let2d_array */
@@ -537,7 +537,7 @@ bet2d_array (tribyte *src, int count, double *dest, double normfact)
        ucptr = ((unsigned char*) src) + 3 * count ;
        while (--count >= 0)
        {       ucptr -= 3 ;
-               value = (ucptr [0] << 24) | (ucptr [1] << 16) | (ucptr [2] << 8) ;
+               value = psf_get_be24 (ucptr, 0) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* bet2d_array */
@@ -548,7 +548,7 @@ lei2d_array (int *src, int count, double *dest, double normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = LEI2H_INT (value) ;
+               value = LE2H_32 (value) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* lei2d_array */
@@ -559,7 +559,7 @@ bei2d_array (int *src, int count, double *dest, double normfact)
 
        while (--count >= 0)
        {       value = src [count] ;
-               value = BEI2H_INT (value) ;
+               value = BE2H_32 (value) ;
                dest [count] = ((double) value) * normfact ;
                } ;
 } /* bei2d_array */
@@ -707,16 +707,17 @@ i2bet_array (const int *src, tribyte *dest, int count)
 
 static sf_count_t
 pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               sc2s_array (psf->u.scbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               sc2s_array (ubuf.scbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -728,16 +729,17 @@ pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
-               uc2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               uc2s_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -771,16 +773,17 @@ pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               bet2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               bet2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -792,16 +795,17 @@ pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               let2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               let2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -813,16 +817,17 @@ pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               bei2s_array (psf->u.ibuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               bei2s_array (ubuf.ibuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -834,16 +839,17 @@ pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               lei2s_array (psf->u.ibuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               lei2s_array (ubuf.ibuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -858,16 +864,17 @@ pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               sc2i_array (psf->u.scbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               sc2i_array (ubuf.scbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -879,16 +886,17 @@ pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
-               uc2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               uc2i_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -900,16 +908,17 @@ pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               bes2i_array (psf->u.sbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               bes2i_array (ubuf.sbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -921,16 +930,17 @@ pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               les2i_array (psf->u.sbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               les2i_array (ubuf.sbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -942,16 +952,17 @@ pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               bet2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               bet2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -963,16 +974,17 @@ pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               let2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               let2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1009,19 +1021,20 @@ pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               sc2f_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               sc2f_array (ubuf.scbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1033,19 +1046,20 @@ pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
-               uc2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               uc2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1057,19 +1071,20 @@ pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               bes2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               bes2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1081,19 +1096,20 @@ pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               les2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               les2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1105,20 +1121,21 @@ pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        /* Special normfactor because tribyte value is read into an int. */
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               bet2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               bet2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1130,20 +1147,21 @@ pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        /* Special normfactor because tribyte value is read into an int. */
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               let2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               let2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1155,19 +1173,20 @@ pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               bei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               bei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1179,19 +1198,20 @@ pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               lei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               lei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1206,19 +1226,20 @@ pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               sc2d_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               sc2d_array (ubuf.scbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1230,19 +1251,20 @@ pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
-               uc2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               uc2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1254,19 +1276,20 @@ pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               bes2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               bes2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1278,19 +1301,20 @@ pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               les2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               les2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1302,19 +1326,20 @@ pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               bet2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               bet2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1326,20 +1351,21 @@ pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        /* Special normfactor because tribyte value is read into an int. */
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
-               let2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               let2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1351,19 +1377,20 @@ pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               bei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               bei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1375,19 +1402,20 @@ pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
-               lei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
+               lei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -1404,16 +1432,17 @@ pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               s2sc_array (ptr + total, ubuf.scbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1425,16 +1454,17 @@ pcm_write_s2sc  (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               s2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1446,20 +1476,21 @@ pcm_write_s2uc  (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2bes        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (CPU_IS_BIG_ENDIAN)
                return psf_fwrite (ptr, sizeof (short), len, psf) ;
        else
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1471,19 +1502,20 @@ pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2les        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (CPU_IS_LITTLE_ENDIAN)
                return psf_fwrite (ptr, sizeof (short), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1495,16 +1527,17 @@ pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2bet        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               s2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1516,16 +1549,17 @@ pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2let        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               s2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1537,16 +1571,17 @@ pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2bei        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2bei_array (ptr + total, psf->u.ibuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               s2bei_array (ptr + total, ubuf.ibuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1558,16 +1593,17 @@ pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_s2lei        (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2lei_array (ptr + total, psf->u.ibuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               s2lei_array (ptr + total, ubuf.ibuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1582,16 +1618,17 @@ pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               i2sc_array (ptr + total, ubuf.scbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1603,16 +1640,17 @@ pcm_write_i2sc  (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, sizeof (signed char), bufferlen, psf) ;
+               i2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1624,16 +1662,17 @@ pcm_write_i2uc  (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2bes        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2bes_array (ptr + total, psf->u.sbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               i2bes_array (ptr + total, ubuf.sbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1645,16 +1684,17 @@ pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2les        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2les_array (ptr + total, psf->u.sbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               i2les_array (ptr + total, ubuf.sbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1666,16 +1706,17 @@ pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2bet        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               i2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1687,16 +1728,17 @@ pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2let        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               i2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1708,19 +1750,20 @@ pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2bei        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (CPU_IS_BIG_ENDIAN)
                return psf_fwrite (ptr, sizeof (int), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1732,19 +1775,20 @@ pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 pcm_write_i2lei        (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if (CPU_IS_LITTLE_ENDIAN)
                return psf_fwrite (ptr, sizeof (int), len, psf) ;
 
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1793,18 +1837,19 @@ f2sc_clip_array (const float *src, signed char *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, signed char *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, signed char *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2sc_clip_array : f2sc_array ;
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1851,18 +1896,19 @@ f2uc_clip_array (const float *src, unsigned char *dest, int count, int normalize
 
 static sf_count_t
 pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, unsigned char *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, unsigned char *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2uc_clip_array : f2uc_array ;
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1923,18 +1969,19 @@ f2bes_clip_array (const float *src, short *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2bes        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, short *t, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, short *t, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2bes_clip_array : f2bes_array ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                                break ;
@@ -1995,18 +2042,19 @@ f2les_clip_array (const float *src, short *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2les        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, short *t, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, short *t, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2les_clip_array : f2les_array ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2071,18 +2119,19 @@ f2let_clip_array (const float *src, tribyte *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2let        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, tribyte *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, tribyte *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2let_clip_array : f2let_array ;
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2147,18 +2196,19 @@ f2bet_clip_array (const float *src, tribyte *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2bet        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, tribyte *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, tribyte *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2bet_clip_array : f2bet_array ;
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2226,18 +2276,19 @@ f2bei_clip_array (const float *src, int *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2bei        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, int *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, int *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2bei_clip_array : f2bei_array ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2306,18 +2357,19 @@ f2lei_clip_array (const float *src, int *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_f2lei        (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      void            (*convert) (const float *, int *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const float *, int *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? f2lei_clip_array : f2lei_array ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2364,18 +2416,19 @@ d2sc_clip_array (const double *src, signed char *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, signed char *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, signed char *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2sc_clip_array : d2sc_array ;
-       bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.scbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2422,18 +2475,19 @@ d2uc_clip_array (const double *src, unsigned char *dest, int count, int normaliz
 
 static sf_count_t
 pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, unsigned char *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, unsigned char *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2uc_clip_array : d2uc_array ;
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2494,18 +2548,19 @@ d2bes_clip_array (const double *src, short *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2bes        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, short *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, short *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2bes_clip_array : d2bes_array ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2566,18 +2621,19 @@ d2les_clip_array (const double *src, short *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2les        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, short *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, short *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2les_clip_array : d2les_array ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2642,18 +2698,19 @@ d2let_clip_array (const double *src, tribyte *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2let        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, tribyte *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, tribyte *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2let_clip_array : d2let_array ;
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2718,18 +2775,19 @@ d2bet_clip_array (const double *src, tribyte *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2bet        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, tribyte *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, tribyte *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2bet_clip_array : d2bet_array ;
-       bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+       bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+               convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2798,18 +2856,19 @@ d2bei_clip_array (const double *src, int *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2bei        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, int *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, int *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2bei_clip_array : d2bei_array ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -2878,18 +2937,19 @@ d2lei_clip_array (const double *src, int *dest, int count, int normalize)
 
 static sf_count_t
 pcm_write_d2lei        (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      void            (*convert) (const double *, int *, int, int) ;
+{      BUF_UNION       ubuf ;
+       void            (*convert) (const double *, int *, int, int) ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        convert = (psf->add_clipping) ? d2lei_clip_array : d2lei_array ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
-               writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+               convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ;
+               writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
index d40bfab..476cc1a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2009      Uli Franke <cls@nebadje.org>
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -41,6 +41,8 @@
 ** Macros to handle big/little endian issues.
 */
 #define        RF64_MARKER             MAKE_MARKER ('R', 'F', '6', '4')
+#define        RIFF_MARKER             MAKE_MARKER ('R', 'I', 'F', 'F')
+#define        JUNK_MARKER             MAKE_MARKER ('J', 'U', 'N', 'K')
 #define        FFFF_MARKER             MAKE_MARKER (0xff, 0xff, 0xff, 0xff)
 #define        WAVE_MARKER             MAKE_MARKER ('W', 'A', 'V', 'E')
 #define        ds64_MARKER             MAKE_MARKER ('d', 's', '6', '4')
 #define        data_MARKER             MAKE_MARKER ('d', 'a', 't', 'a')
 
 #define bext_MARKER            MAKE_MARKER ('b', 'e', 'x', 't')
+#define cart_MARKER            MAKE_MARKER ('c', 'a', 'r', 't')
 #define OggS_MARKER            MAKE_MARKER ('O', 'g', 'g', 'S')
 #define wvpk_MARKER    MAKE_MARKER ('w', 'v', 'p', 'k')
 
+/*
+** The file size limit in bytes below which we can, if requested, write this
+** file as a RIFF/WAVE file.
+*/
+
+#define RIFF_DOWNGRADE_BYTES   ((sf_count_t) 0xffffffff)
+
 /*------------------------------------------------------------------------------
 ** Typedefs.
 */
@@ -148,7 +158,8 @@ enum
 {      HAVE_ds64       = 0x01,
        HAVE_fmt        = 0x02,
        HAVE_bext       = 0x04,
-       HAVE_data       = 0x08
+       HAVE_data       = 0x08,
+       HAVE_cart       = 0x10
 } ;
 
 #define HAVE_CHUNK(CHUNK)      ((parsestage & CHUNK) != 0)
@@ -158,8 +169,8 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 {      WAV_PRIVATE     *wpriv ;
        WAV_FMT         *wav_fmt ;
        sf_count_t riff_size = 0, frame_count = 0, ds64_datalength = 0 ;
-       unsigned int size32, parsestage = 0 ;
-       int marker, marks [2], error, done = 0, format = 0 ;
+       uint32_t marks [2], chunk_size, parsestage = 0 ;
+       int marker, error, done = 0, format = 0 ;
 
        if ((wpriv = psf->container_data) == NULL)
                return SFE_INTERNAL ;
@@ -176,10 +187,23 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                psf_log_printf (psf, "%M : 0x%x (should be 0xFFFFFFFF)\n  %M\n", RF64_MARKER, WAVE_MARKER) ;
 
        while (NOT (done))
-       {       psf_binheader_readf (psf, "em4", &marker, &size32) ;
+       {
+               marker = chunk_size = 0 ;
+               psf_binheader_readf (psf, "em4", &marker, &chunk_size) ;
+
+               if (marker == 0)
+               {       sf_count_t pos = psf_ftell (psf) ;
+                       psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ;
+                       break ;
+                       } ;
 
                switch (marker)
                {       case ds64_MARKER :
+                               if (parsestage & HAVE_ds64)
+                               {       psf_log_printf (psf, "*** Second 'ds64' chunk?\n") ;
+                                       break ;
+                                       } ;
+
                                {       unsigned int table_len, bytesread ;
 
                                        /* Read ds64 sizes (3 8-byte words). */
@@ -190,18 +214,18 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        /* Skip table for now. (this was "table_len + 4", why?) */
                                        bytesread += psf_binheader_readf (psf, "j", table_len) ;
 
-                                       if (size32 == bytesread)
-                                               psf_log_printf (psf, "%M : %u\n", marker, size32) ;
-                                       else if (size32 >= bytesread + 4)
+                                       if (chunk_size == bytesread)
+                                               psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                       else if (chunk_size >= bytesread + 4)
                                        {       unsigned int next ;
                                                psf_binheader_readf (psf, "m", &next) ;
                                                if (next == fmt_MARKER)
-                                               {       psf_log_printf (psf, "%M : %u (should be %u)\n", marker, size32, bytesread) ;
+                                               {       psf_log_printf (psf, "%M : %u (should be %u)\n", marker, chunk_size, bytesread) ;
                                                        psf_binheader_readf (psf, "j", -4) ;
                                                        }
                                                else
-                                               {       psf_log_printf (psf, "%M : %u\n", marker, size32) ;
-                                                       psf_binheader_readf (psf, "j", size32 - bytesread - 4) ;
+                                               {       psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                                       psf_binheader_readf (psf, "j", chunk_size - bytesread - 4) ;
                                                        } ;
                                                } ;
 
@@ -220,44 +244,50 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                break ;
 
                        case fmt_MARKER:
-                                       psf_log_printf (psf, "%M : %u\n", marker, size32) ;
-                                       if ((error = wav_w64_read_fmt_chunk (psf, size32)) != 0)
+                                       psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                       if ((error = wav_w64_read_fmt_chunk (psf, chunk_size)) != 0)
                                                return error ;
                                        format = wav_fmt->format ;
                                        parsestage |= HAVE_fmt ;
                                        break ;
 
                        case bext_MARKER :
-                                       if ((error = wav_read_bext_chunk (psf, size32)) != 0)
+                                       if ((error = wav_read_bext_chunk (psf, chunk_size)) != 0)
                                                return error ;
                                        parsestage |= HAVE_bext ;
                                        break ;
 
+                       case cart_MARKER :
+                                       if ((error = wav_read_cart_chunk (psf, chunk_size)) != 0)
+                                               return error ;
+                                       parsestage |= HAVE_cart ;
+                                       break ;
+
                        case data_MARKER :
                                /* see wav for more sophisticated parsing -> implement state machine with parsestage */
 
                                if (HAVE_CHUNK (HAVE_ds64))
-                               {       if (size32 == 0xffffffff)
-                                               psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ;
+                               {       if (chunk_size == 0xffffffff)
+                                               psf_log_printf (psf, "%M : 0x%x\n", marker, chunk_size) ;
                                        else
-                                               psf_log_printf (psf, "%M : 0x%x (should be 0xffffffff\n", marker, size32) ;
+                                               psf_log_printf (psf, "%M : 0x%x (should be 0xffffffff\n", marker, chunk_size) ;
                                        psf->datalength = ds64_datalength ;
                                        }
                                else
-                               {       if (size32 == 0xffffffff)
-                                       {       psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ;
+                               {       if (chunk_size == 0xffffffff)
+                                       {       psf_log_printf (psf, "%M : 0x%x\n", marker, chunk_size) ;
                                                psf_log_printf (psf, "  *** Data length not specified no 'ds64' chunk.\n") ;
                                                }
                                        else
-                                       {       psf_log_printf (psf, "%M : 0x%x\n**** Weird, RF64 file without a 'ds64' chunk and no valid 'data' size.\n", marker, size32) ;
-                                               psf->datalength = size32 ;
+                                       {       psf_log_printf (psf, "%M : 0x%x\n**** Weird, RF64 file without a 'ds64' chunk and no valid 'data' size.\n", marker, chunk_size) ;
+                                               psf->datalength = chunk_size ;
                                                } ;
                                        } ;
 
                                psf->dataoffset = psf_ftell (psf) ;
 
                                if (psf->dataoffset > 0)
-                               {       if (size32 == 0 && riff_size == 8 && psf->filelength > 44)
+                               {       if (chunk_size == 0 && riff_size == 8 && psf->filelength > 44)
                                        {       psf_log_printf (psf, "  *** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ;
                                                psf->datalength = psf->filelength - psf->dataoffset ;
                                                } ;
@@ -279,24 +309,38 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                break ;
 
                        default :
+                                       if (chunk_size >= 0xffff0000)
+                                       {       psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
+                                               done = SF_TRUE ;
+                                               break ;
+                                               } ;
+
                                        if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
                                                && isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
-                                       {       psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, size32) ;
-                                               if (size32 < 8)
+                                       {       psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, chunk_size) ;
+                                               if (chunk_size < 8)
                                                        done = SF_TRUE ;
-                                               psf_binheader_readf (psf, "j", size32) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                } ;
                                        if (psf_ftell (psf) & 0x03)
-                                       {       psf_log_printf (psf, "  Unknown chunk marker at position 0x%x. Resynching.\n", size32 - 4) ;
+                                       {       psf_log_printf (psf, "  Unknown chunk marker at position 0x%x. Resynching.\n", chunk_size - 4) ;
                                                psf_binheader_readf (psf, "j", -3) ;
                                                break ;
                                                } ;
                                        psf_log_printf (psf, "*** Unknown chunk marker (0x%X) at position 0x%X. Exiting parser.\n", marker, psf_ftell (psf) - 4) ;
                                        done = SF_TRUE ;
-                               break ;
+                                       break ;
                        } ;     /* switch (marker) */
 
+               /* The 'data' chunk, a chunk size of 0xffffffff means that the 'data' chunk size
+               ** is actually given by the ds64_datalength field.
+               */
+               if (marker != data_MARKER && chunk_size >= psf->filelength)
+               {       psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ;
+                       break ;
+                       } ;
+
                if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (marker))
                {       psf_log_printf (psf, "End\n") ;
                        break ;
@@ -306,6 +350,12 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
        if (psf->dataoffset <= 0)
                return SFE_WAV_NO_DATA ;
 
+       if (psf->sf.channels < 1)
+               return SFE_CHANNEL_COUNT_ZERO ;
+
+       if (psf->sf.channels >= SF_MAX_CHANNELS)
+               return SFE_CHANNEL_COUNT ;
+
        /* WAVs can be little or big endian */
        psf->endian = psf->rwf_endian ;
 
@@ -339,7 +389,7 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                case WAVE_FORMAT_EXTENSIBLE :
 
                        /* with WAVE_FORMAT_EXTENSIBLE the psf->sf.format field is already set. We just have to set the major to rf64 */
-                       psf->sf.format = (psf->sf.format & ~SF_FORMAT_TYPEMASK ) | SF_FORMAT_RF64 ;
+                       psf->sf.format = (psf->sf.format & ~SF_FORMAT_TYPEMASK) | SF_FORMAT_RF64 ;
 
                        if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM))
                        {       *blockalign = wav_fmt->msadpcm.blockalign ;
@@ -549,7 +599,11 @@ rf64_write_fmt_chunk (SF_PRIVATE *psf)
 static int
 rf64_write_header (SF_PRIVATE *psf, int calc_length)
 {      sf_count_t      current ;
-       int             error = 0, has_data = SF_FALSE ;
+       int             error = 0, has_data = SF_FALSE, add_fact_chunk = 0 ;
+       WAV_PRIVATE     *wpriv ;
+
+       if ((wpriv = psf->container_data) == NULL)
+               return SFE_INTERNAL ;
 
        current = psf_ftell (psf) ;
 
@@ -572,10 +626,16 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
        psf->headindex = 0 ;
        psf_fseek (psf, 0, SEEK_SET) ;
 
-       psf_binheader_writef (psf, "em4m", RF64_MARKER, 0xffffffff, WAVE_MARKER) ;
-
-       /* Currently no table. */
-       psf_binheader_writef (psf, "m48884", ds64_MARKER, 28, psf->filelength - 8, psf->datalength, psf->sf.frames, 0) ;
+       if (wpriv->rf64_downgrade && psf->filelength < RIFF_DOWNGRADE_BYTES)
+       {       psf_binheader_writef (psf, "etm8m", RIFF_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8, WAVE_MARKER) ;
+               psf_binheader_writef (psf, "m4884", JUNK_MARKER, 20, 0, 0, 0, 0) ;
+               add_fact_chunk = 1 ;
+               }
+       else
+       {       psf_binheader_writef (psf, "em4m", RF64_MARKER, 0xffffffff, WAVE_MARKER) ;
+               /* Currently no table. */
+               psf_binheader_writef (psf, "m48884", ds64_MARKER, 28, psf->filelength - 8, psf->datalength, psf->sf.frames, 0) ;
+               } ;
 
        /* WAVE and 'fmt ' markers. */
        psf_binheader_writef (psf, "m", fmt_MARKER) ;
@@ -591,6 +651,8 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
                case SF_FORMAT_RF64 :
                                if ((error = rf64_write_fmt_chunk (psf)) != 0)
                                        return error ;
+                               if (add_fact_chunk)
+                                       psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ;
                                break ;
 
                default :
@@ -600,9 +662,11 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
        if (psf->broadcast_16k != NULL)
                wav_write_bext_chunk (psf) ;
 
+       if (psf->cart_16k != NULL)
+               wav_write_cart_chunk (psf) ;
 #if 0
        /* The LIST/INFO chunk. */
-       if (psf->str_flags & SF_STR_LOCATE_START)
+       if (psf->strings.flags & SF_STR_LOCATE_START)
                wav_write_strings (psf, SF_STR_LOCATE_START) ;
 
        if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
@@ -632,7 +696,7 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
                {       int type ;
 
                        type = psf->instrument->loops [tmp].mode ;
-                       type = (type == SF_LOOP_FORWARD ? 0 : type==SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
+                       type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
 
                        psf_binheader_writef (psf, "44", tmp, type) ;
                        psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end) ;
@@ -648,7 +712,10 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
 
 #endif
 
-       psf_binheader_writef (psf, "m4", data_MARKER, 0xffffffff) ;
+       if (wpriv->rf64_downgrade && (psf->filelength < RIFF_DOWNGRADE_BYTES))
+               psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ;
+       else
+               psf_binheader_writef (psf, "m4", data_MARKER, 0xffffffff) ;
 
        psf_fwrite (psf->header, psf->headindex, 1, psf) ;
        if (psf->error)
@@ -707,6 +774,11 @@ rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize)
                        wpriv->wavex_channelmask = wavex_gen_channel_mask (psf->channel_map, psf->sf.channels) ;
                        return (wpriv->wavex_channelmask != 0) ;
 
+               case SFC_RF64_AUTO_DOWNGRADE :
+                       if (psf->have_written == 0)
+                               wpriv->rf64_downgrade = datasize ? SF_TRUE : SF_FALSE ;
+                       return wpriv->rf64_downgrade ;
+
                default :
                        break ;
        } ;
index 0aa1bcf..0a73048 100644 (file)
--- a/src/rx2.c
+++ b/src/rx2.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -80,10 +80,9 @@ rx2_open     (SF_PRIVATE *psf)
                "Additional/PencilTool", "Disabled"
                } ;
 
+       BUF_UNION       ubuf ;
        int error, marker, length, glob_offset, slce_count, frames ;
-
        int sdat_length = 0, slce_total = 0 ;
-
        int n_channels ;
 
 
@@ -119,14 +118,14 @@ rx2_open  (SF_PRIVATE *psf)
        /* Get name length */
        length = 0 ;
        psf_binheader_readf (psf, "1", &length) ;
-       if (length >= SIGNED_SIZEOF (psf->u.cbuf))
+       if (length >= SIGNED_SIZEOF (ubuf.cbuf))
        {       psf_log_printf (psf, "  Text : %d *** Error : Too sf_count_t!\n") ;
                return -1001 ;
                }
 
-       memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
-       psf_binheader_readf (psf, "b", psf->u.cbuf, length) ;
-       psf_log_printf (psf, " Text : \"%s\"\n", psf->u.cbuf) ;
+       memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ;
+       psf_binheader_readf (psf, "b", ubuf.cbuf, length) ;
+       psf_log_printf (psf, " Text : \"%s\"\n", ubuf.cbuf) ;
 
        /* Jump to GLOB offset position. */
        if (glob_offset & 1)
@@ -253,7 +252,7 @@ rx2_open    (SF_PRIVATE *psf)
                        break ;
                } ;
 
-       puts (psf->logbuffer) ;
+       puts (psf->parselog.buf) ;
        puts ("-----------------------------------") ;
 
        printf ("SDAT length  : %d\n", sdat_length) ;
@@ -270,7 +269,7 @@ rx2_open    (SF_PRIVATE *psf)
 
        puts (" ") ;
 
-       psf->logbuffer [0] = 0 ;
+       psf->parselog.buf [0] = 0 ;
 
        /* OK, have the header although not too sure what it all means. */
 
index 9ef10a9..a70a1f1 100644 (file)
--- a/src/sd2.c
+++ b/src/sd2.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2004 Paavo Jumppanen
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -149,6 +149,7 @@ sd2_open (SF_PRIVATE *psf)
        {       case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */
                case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */
                case SF_FORMAT_PCM_24 : /* 24-bit linear PCM */
+               case SF_FORMAT_PCM_32 : /* 32-bit linear PCM */
                                error = pcm_init (psf) ;
                                break ;
 
@@ -370,44 +371,61 @@ sd2_write_rsrc_fork (SF_PRIVATE *psf, int UNUSED (calc_length))
 */
 
 static inline int
-read_char (const unsigned char * data, int offset)
-{      return data [offset] ;
-} /* read_char */
+read_rsrc_char (const SD2_RSRC *prsrc, int offset)
+{      const unsigned char * data = prsrc->rsrc_data ;
+       if (offset < 0 || offset >= prsrc->rsrc_len)
+               return 0 ;
+       return data [offset] ;
+} /* read_rsrc_char */
 
 static inline int
-read_short (const unsigned char * data, int offset)
-{      return (data [offset] << 8) + data [offset + 1] ;
-} /* read_short */
+read_rsrc_short (const SD2_RSRC *prsrc, int offset)
+{      const unsigned char * data = prsrc->rsrc_data ;
+       if (offset < 0 || offset + 1 >= prsrc->rsrc_len)
+               return 0 ;
+       return (data [offset] << 8) + data [offset + 1] ;
+} /* read_rsrc_short */
 
 static inline int
-read_int (const unsigned char * data, int offset)
-{      return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
-} /* read_int */
+read_rsrc_int (const SD2_RSRC *prsrc, int offset)
+{      const unsigned char * data = prsrc->rsrc_data ;
+       if (offset < 0 || offset + 3 >= prsrc->rsrc_len)
+               return 0 ;
+       return (((uint32_t) data [offset]) << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
+} /* read_rsrc_int */
 
 static inline int
-read_marker (const unsigned char * data, int offset)
-{
+read_rsrc_marker (const SD2_RSRC *prsrc, int offset)
+{      const unsigned char * data = prsrc->rsrc_data ;
+
+       if (offset < 0 || offset + 3 >= prsrc->rsrc_len)
+               return 0 ;
+
        if (CPU_IS_BIG_ENDIAN)
-               return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
-       else if (CPU_IS_LITTLE_ENDIAN)
-               return data [offset] + (data [offset + 1] << 8) + (data [offset + 2] << 16) + (data [offset + 3] << 24) ;
-       else
-               return 0x666 ;
-} /* read_marker */
+               return (((uint32_t) data [offset]) << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
+       if (CPU_IS_LITTLE_ENDIAN)
+               return data [offset] + (data [offset + 1] << 8) + (data [offset + 2] << 16) + (((uint32_t) data [offset + 3]) << 24) ;
+
+       return 0 ;
+} /* read_rsrc_marker */
 
 static void
-read_str (const unsigned char * data, int offset, char * buffer, int buffer_len)
-{      int k ;
+read_rsrc_str (const SD2_RSRC *prsrc, int offset, char * buffer, int buffer_len)
+{      const unsigned char * data = prsrc->rsrc_data ;
+       int k ;
 
        memset (buffer, 0, buffer_len) ;
 
+       if (offset < 0 || offset + buffer_len >= prsrc->rsrc_len)
+               return ;
+
        for (k = 0 ; k < buffer_len - 1 ; k++)
        {       if (psf_isprint (data [offset + k]) == 0)
                        return ;
                buffer [k] = data [offset + k] ;
                } ;
        return ;
-} /* read_str */
+} /* read_rsrc_str */
 
 static int
 sd2_parse_rsrc_fork (SF_PRIVATE *psf)
@@ -426,7 +444,10 @@ sd2_parse_rsrc_fork (SF_PRIVATE *psf)
                rsrc.need_to_free_rsrc_data = SF_TRUE ;
                }
        else
+       {
                rsrc.rsrc_data = psf->header ;
+               rsrc.need_to_free_rsrc_data = SF_FALSE ;
+               } ;
 
        /* Read in the whole lot. */
        psf_fread (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ;
@@ -434,17 +455,17 @@ sd2_parse_rsrc_fork (SF_PRIVATE *psf)
        /* Reset the header storage because we have changed to the rsrcdes. */
        psf->headindex = psf->headend = rsrc.rsrc_len ;
 
-       rsrc.data_offset = read_int (rsrc.rsrc_data, 0) ;
-       rsrc.map_offset = read_int (rsrc.rsrc_data, 4) ;
-       rsrc.data_length = read_int (rsrc.rsrc_data, 8) ;
-       rsrc.map_length = read_int (rsrc.rsrc_data, 12) ;
+       rsrc.data_offset = read_rsrc_int (&rsrc, 0) ;
+       rsrc.map_offset = read_rsrc_int (&rsrc, 4) ;
+       rsrc.data_length = read_rsrc_int (&rsrc, 8) ;
+       rsrc.map_length = read_rsrc_int (&rsrc, 12) ;
 
        if (rsrc.data_offset == 0x51607 && rsrc.map_offset == 0x20000)
        {       psf_log_printf (psf, "Trying offset of 0x52 bytes.\n") ;
-               rsrc.data_offset = read_int (rsrc.rsrc_data, 0x52 + 0) + 0x52 ;
-               rsrc.map_offset = read_int (rsrc.rsrc_data, 0x52 + 4) + 0x52 ;
-               rsrc.data_length = read_int (rsrc.rsrc_data, 0x52 + 8) ;
-               rsrc.map_length = read_int (rsrc.rsrc_data, 0x52 + 12) ;
+               rsrc.data_offset = read_rsrc_int (&rsrc, 0x52 + 0) + 0x52 ;
+               rsrc.map_offset = read_rsrc_int (&rsrc, 0x52 + 4) + 0x52 ;
+               rsrc.data_length = read_rsrc_int (&rsrc, 0x52 + 8) ;
+               rsrc.map_length = read_rsrc_int (&rsrc, 0x52 + 12) ;
                } ;
 
        psf_log_printf (psf, "  data offset : 0x%04X\n  map  offset : 0x%04X\n"
@@ -487,7 +508,7 @@ sd2_parse_rsrc_fork (SF_PRIVATE *psf)
                goto parse_rsrc_fork_cleanup ;
                } ;
 
-       rsrc.string_offset = rsrc.map_offset + read_short (rsrc.rsrc_data, rsrc.map_offset + 26) ;
+       rsrc.string_offset = rsrc.map_offset + read_rsrc_short (&rsrc, rsrc.map_offset + 26) ;
        if (rsrc.string_offset > rsrc.rsrc_len)
        {       psf_log_printf (psf, "Bad string offset (%d).\n", rsrc.string_offset) ;
                error = SFE_SD2_BAD_RSRC ;
@@ -496,7 +517,12 @@ sd2_parse_rsrc_fork (SF_PRIVATE *psf)
 
        rsrc.type_offset = rsrc.map_offset + 30 ;
 
-       rsrc.type_count = read_short (rsrc.rsrc_data, rsrc.map_offset + 28) + 1 ;
+       if (rsrc.map_offset + 28 > rsrc.rsrc_len)
+       {       psf_log_printf (psf, "Bad map offset.\n") ;
+               goto parse_rsrc_fork_cleanup ;
+               } ;
+
+       rsrc.type_count = read_rsrc_short (&rsrc, rsrc.map_offset + 28) + 1 ;
        if (rsrc.type_count < 1)
        {       psf_log_printf (psf, "Bad type count.\n") ;
                error = SFE_SD2_BAD_RSRC ;
@@ -512,11 +538,16 @@ sd2_parse_rsrc_fork (SF_PRIVATE *psf)
 
        rsrc.str_index = -1 ;
        for (k = 0 ; k < rsrc.type_count ; k ++)
-       {       marker = read_marker (rsrc.rsrc_data, rsrc.type_offset + k * 8) ;
+       {       if (rsrc.type_offset + k * 8 > rsrc.rsrc_len)
+               {       psf_log_printf (psf, "Bad rsrc marker.\n") ;
+                       goto parse_rsrc_fork_cleanup ;
+                       } ;
+
+               marker = read_rsrc_marker (&rsrc, rsrc.type_offset + k * 8) ;
 
                if (marker == STR_MARKER)
                {       rsrc.str_index = k ;
-                       rsrc.str_count = read_short (rsrc.rsrc_data, rsrc.type_offset + k * 8 + 4) + 1 ;
+                       rsrc.str_count = read_rsrc_short (&rsrc, rsrc.type_offset + k * 8 + 4) + 1 ;
                        error = parse_str_rsrc (psf, &rsrc) ;
                        goto parse_rsrc_fork_cleanup ;
                        } ;
@@ -548,26 +579,26 @@ parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc)
        for (k = 0 ; data_offset + data_len < rsrc->rsrc_len ; k++)
        {       int slen ;
 
-               slen = read_char (rsrc->rsrc_data, str_offset) ;
-               read_str (rsrc->rsrc_data, str_offset + 1, name, SF_MIN (SIGNED_SIZEOF (name), slen + 1)) ;
+               slen = read_rsrc_char (rsrc, str_offset) ;
+               read_rsrc_str (rsrc, str_offset + 1, name, SF_MIN (SIGNED_SIZEOF (name), slen + 1)) ;
                str_offset += slen + 1 ;
 
-               rsrc_id = read_short (rsrc->rsrc_data, rsrc->item_offset + k * 12) ;
+               rsrc_id = read_rsrc_short (rsrc, rsrc->item_offset + k * 12) ;
 
-               data_offset = rsrc->data_offset + read_int (rsrc->rsrc_data, rsrc->item_offset + k * 12 + 4) ;
+               data_offset = rsrc->data_offset + read_rsrc_int (rsrc, rsrc->item_offset + k * 12 + 4) ;
                if (data_offset < 0 || data_offset > rsrc->rsrc_len)
                {       psf_log_printf (psf, "Exiting parser on data offset of %d.\n", data_offset) ;
                        break ;
                        } ;
 
-               data_len = read_int (rsrc->rsrc_data, data_offset) ;
+               data_len = read_rsrc_int (rsrc, data_offset) ;
                if (data_len < 0 || data_len > rsrc->rsrc_len)
                {       psf_log_printf (psf, "Exiting parser on data length of %d.\n", data_len) ;
                        break ;
                        } ;
 
-               slen = read_char (rsrc->rsrc_data, data_offset + 4) ;
-               read_str (rsrc->rsrc_data, data_offset + 5, value, SF_MIN (SIGNED_SIZEOF (value), slen + 1)) ;
+               slen = read_rsrc_char (rsrc, data_offset + 4) ;
+               read_rsrc_str (rsrc, data_offset + 5, value, SF_MIN (SIGNED_SIZEOF (value), slen + 1)) ;
 
                psf_log_printf (psf, "  0x%04x     %4d     %4d     %3d    '%s'\n", data_offset, rsrc_id, data_len, slen, value) ;
 
@@ -620,6 +651,10 @@ parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc)
                        psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_24 ;
                        break ;
 
+               case 4 :
+                       psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_32 ;
+                       break ;
+
                default :
                        psf_log_printf (psf, "Bad sample size (%d)\n", rsrc->sample_size) ;
                        return SFE_SD2_BAD_SAMPLE_SIZE ;
index 17c7036..28f854a 100644 (file)
--- a/src/sds.c
+++ b/src/sds.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -83,6 +83,7 @@ static sf_count_t sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len
 static sf_count_t sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
 
 static sf_count_t sds_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int sds_byterate (SF_PRIVATE * psf) ;
 
 static int sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
 static int sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
@@ -132,8 +133,9 @@ sds_open    (SF_PRIVATE *psf)
        if ((error = sds_init (psf, psds)) != 0)
                return error ;
 
-       psf->seek = sds_seek ;
        psf->container_close = sds_close ;
+       psf->seek = sds_seek ;
+       psf->byterate = sds_byterate ;
 
        psf->blockwidth = 0 ;
 
@@ -452,7 +454,7 @@ sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 
        ucptr = psds->read_data + 5 ;
        for (k = 0 ; k < 120 ; k += 2)
-       {       sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) ;
+       {       sample = arith_shift_left (ucptr [k], 25) + arith_shift_left (ucptr [k + 1], 18) ;
                psds->read_samples [k / 2] = (int) (sample - 0x80000000) ;
                } ;
 
@@ -496,7 +498,7 @@ sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 
        ucptr = psds->read_data + 5 ;
        for (k = 0 ; k < 120 ; k += 3)
-       {       sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ;
+       {       sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ;
                psds->read_samples [k / 3] = (int) (sample - 0x80000000) ;
                } ;
 
@@ -506,7 +508,7 @@ sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 static int
 sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 {      unsigned char *ucptr, checksum ;
-       unsigned int sample ;
+       uint32_t sample ;
        int     k ;
 
        psds->read_block ++ ;
@@ -540,7 +542,7 @@ sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 
        ucptr = psds->read_data + 5 ;
        for (k = 0 ; k < 120 ; k += 4)
-       {       sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ;
+       {       sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ;
                psds->read_samples [k / 4] = (int) (sample - 0x80000000) ;
                } ;
 
@@ -550,7 +552,8 @@ sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 
 static sf_count_t
 sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -559,8 +562,8 @@ sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
                return 0 ;
        psds = (SDS_PRIVATE*) psf->codec_data ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = sds_read (psf, psds, iptr, readcount) ;
@@ -589,7 +592,8 @@ sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -604,8 +608,8 @@ sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
        else
                normfact = 1.0 / (1 << psds->bitwidth) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = sds_read (psf, psds, iptr, readcount) ;
@@ -620,7 +624,8 @@ sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -635,8 +640,8 @@ sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
        else
                normfact = 1.0 / (1 << psds->bitwidth) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
                count = sds_read (psf, psds, iptr, readcount) ;
@@ -749,6 +754,15 @@ sds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start)
        return seek_from_start ;
 } /* sds_seek */
 
+static int
+sds_byterate (SF_PRIVATE * psf)
+{
+       if (psf->file.mode == SFM_READ)
+               return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ;
+
+       return -1 ;
+} /* sds_byterate */
+
 /*==============================================================================
 */
 
@@ -880,7 +894,8 @@ sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds)
 
 static sf_count_t
 sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -890,12 +905,12 @@ sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
        psds = (SDS_PRIVATE*) psf->codec_data ;
        psds->total_written += len ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
-                       iptr [k] = ptr [total + k] << 16 ;
+                       iptr [k] = arith_shift_left (ptr [total + k], 16) ;
                count = sds_write (psf, psds, iptr, writecount) ;
                total += count ;
                len -= writecount ;
@@ -921,7 +936,8 @@ sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -937,8 +953,8 @@ sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
        else
                normfact = 1.0 * (1 << psds->bitwidth) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
@@ -953,7 +969,8 @@ sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      SDS_PRIVATE     *psds ;
+{      BUF_UNION       ubuf ;
+       SDS_PRIVATE     *psds ;
        int                     *iptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -969,8 +986,8 @@ sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
        else
                normfact = 1.0 * (1 << psds->bitwidth) ;
 
-       iptr = psf->u.ibuf ;
-       bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+       iptr = ubuf.ibuf ;
+       bufferlen = ARRAY_LEN (ubuf.ibuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : len ;
                for (k = 0 ; k < writecount ; k++)
index f7f5a80..0f30855 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2005-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 #define HAVE_ENDIAN_H 0
 #endif
 
+#ifndef HAVE_FSTAT64
+#define HAVE_FSTAT64 0
+#endif
+
 #ifndef HAVE_FSYNC
 #define HAVE_FSYNC 0
 #endif
 #define HAVE_MMAP 0
 #endif
 
-#ifndef HAVE_PREAD
-#define HAVE_PREAD 0
-#endif
-
-#ifndef HAVE_PWRITE
-#define HAVE_PWRITE 0
-#endif
-
 #ifndef HAVE_SETLOCALE
 #define HAVE_SETLOCALE 0
 #endif
 #define HAVE_SYS_WAIT_H 0
 #endif
 
+#ifndef HAVE_SYS_TIME_H
+#define HAVE_SYS_TIME_H 0
+#endif
+
 #ifndef HAVE_UNISTD_H
 #define HAVE_UNISTD_H 0
 #endif
 #define        HAVE_WAITPID 0
 #endif
 
+#ifndef HAVE_X86INTRIN_H
+#define HAVE_X86INTRIN_H 0
 #endif
 
+#define CPU_IS_X86             (defined __i486__ || defined __i586__ || defined __i686__ || defined __x86_64__)
+#define CPU_IS_X86_64  (defined __x86_64__)
+
+#endif
index 386361c..e94363f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 
 #include "sfconfig.h"
 
-#if HAVE_STDINT_H
 #include <stdint.h>
-#elif HAVE_INTTYPES_H
 #include <inttypes.h>
-#endif
 
-#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
-/* Good, we have int64_t. */
-#elif (defined (SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8))
-typedef long long int64_t ;
-#elif (defined (SIZEOF_LONG) && (SIZEOF_LONG == 8))
-typedef long int64_t ;
-#elif (defined (WIN32) || defined (_WIN32))
-typedef __int64 int64_t ;
-#else
-#error "No 64 bit integer type."
-#endif
 
-#if HAVE_BYTESWAP_H
+#if COMPILER_IS_GCC && CPU_IS_X86
+
+static inline int16_t
+ENDSWAP_16 (int16_t x)
+{      int16_t y ;
+       __asm__ ("rorw $8, %w0" : "=r" (y) : "0" (x) : "cc") ;
+       return y ;
+} /* ENDSWAP_16 */
+
+static inline int32_t
+ENDSWAP_32 (int32_t x)
+{      int32_t y ;
+       __asm__ ("bswap %0" : "=r" (y) : "0" (x)) ;
+       return y ;
+} /* ENDSWAP_32 */
+
+#if CPU_IS_X86_64
+
+static inline int64_t
+ENDSWAP_64X (int64_t x)
+{      int64_t y ;
+       __asm__ ("bswap %q0" : "=r" (y) : "0" (x)) ;
+       return y ;
+} /* ENDSWAP_64X */
 
+#define ENDSWAP_64 ENDSWAP_64X
+
+#endif
+
+#elif HAVE_BYTESWAP_H                  /* Linux, any CPU */
 #include <byteswap.h>
 
-#define        ENDSWAP_SHORT(x)        ((short) bswap_16 (x))
-#define        ENDSWAP_INT(x)          ((int) bswap_32 (x))
+#define        ENDSWAP_16(x)           (bswap_16 (x))
+#define        ENDSWAP_32(x)           (bswap_32 (x))
+#define        ENDSWAP_64(x)           (bswap_64 (x))
 
 #else
 
-#define        ENDSWAP_SHORT(x)        ((((x) >> 8) & 0xFF) + (((x) & 0xFF) << 8))
-#define        ENDSWAP_INT(x)          ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24))
+#define        ENDSWAP_16(x)           ((((x) >> 8) & 0xFF) + (((x) & 0xFF) << 8))
+#define        ENDSWAP_32(x)           ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24))
 
 #endif
 
+#ifndef ENDSWAP_64
+static inline uint64_t
+ENDSWAP_64 (uint64_t x)
+{      union
+       {       uint32_t parts [2] ;
+               uint64_t whole ;
+       } u ;
+       uint32_t temp ;
+
+       u.whole = x ;
+       temp = u.parts [0] ;
+       u.parts [0] = ENDSWAP_32 (u.parts [1]) ;
+       u.parts [1] = ENDSWAP_32 (temp) ;
+       return u.whole ;
+}
+#endif
+
 /*
 ** Many file types (ie WAV, AIFF) use sets of four consecutive bytes as a
 ** marker indicating different sections of the file.
@@ -61,9 +93,9 @@ typedef __int64 int64_t ;
 */
 
 #if (CPU_IS_LITTLE_ENDIAN == 1)
-       #define MAKE_MARKER(a,b,c,d)    ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))
+       #define MAKE_MARKER(a, b, c, d)         ((uint32_t) ((a) | ((b) << 8) | ((c) << 16) | (((uint32_t) (d)) << 24)))
 #elif (CPU_IS_BIG_ENDIAN == 1)
-       #define MAKE_MARKER(a,b,c,d)    (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
+       #define MAKE_MARKER(a, b, c, d)         ((uint32_t) ((((uint32_t) (a)) << 24) | ((b) << 16) | ((c) << 8) | (d)))
 #else
        #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h"
 #endif
@@ -76,34 +108,151 @@ typedef __int64 int64_t ;
 */
 
 #if (CPU_IS_LITTLE_ENDIAN == 1)
-       #define LES2H_SHORT(x)                  (x)
-       #define LEI2H_INT(x)                    (x)
+       #define LE2H_16(x)                      (x)
+       #define LE2H_32(x)                      (x)
 
-       #define BES2H_SHORT(x)                  ENDSWAP_SHORT (x)
-       #define BEI2H_INT(x)                    ENDSWAP_INT (x)
+       #define BE2H_16(x)                      ENDSWAP_16 (x)
+       #define BE2H_32(x)                      ENDSWAP_32 (x)
+       #define BE2H_64(x)                      ENDSWAP_64 (x)
 
-       #define H2BE_SHORT(x)                   ENDSWAP_SHORT (x)
-       #define H2BE_INT(x)                             ENDSWAP_INT (x)
+       #define H2BE_16(x)                      ENDSWAP_16 (x)
+       #define H2BE_32(x)                      ENDSWAP_32 (x)
 
 #elif (CPU_IS_BIG_ENDIAN == 1)
-       #define LES2H_SHORT(x)                  ENDSWAP_SHORT (x)
-       #define LEI2H_INT(x)                    ENDSWAP_INT (x)
+       #define LE2H_16(x)                      ENDSWAP_16 (x)
+       #define LE2H_32(x)                      ENDSWAP_32 (x)
+
+       #define BE2H_16(x)                      (x)
+       #define BE2H_32(x)                      (x)
+       #define BE2H_64(x)                      (x)
 
-       #define BES2H_SHORT(x)                  (x)
-       #define BEI2H_INT(x)                    (x)
+       #define H2BE_16(x)                      (x)
+       #define H2BE_32(x)                      (x)
 
-       #define H2LE_SHORT(x)                   ENDSWAP_SHORT (x)
-       #define H2LE_INT(x)                             ENDSWAP_INT (x)
+       #define H2LE_16(x)                      ENDSWAP_16 (x)
+       #define H2LE_32(x)                      ENDSWAP_32 (x)
 
 #else
        #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h"
 #endif
 
-#define LET2H_SHORT_PTR(x)             ((x) [1] + ((x) [2] << 8))
-#define LET2H_INT_PTR(x)               (((x) [0] << 8) + ((x) [1] << 16) + ((x) [2] << 24))
+#define LET2H_16_PTR(x)                        ((x) [1] + ((x) [2] << 8))
+#define LET2H_32_PTR(x)                        (((x) [0] << 8) + ((x) [1] << 16) + ((x) [2] << 24))
+
+#define BET2H_16_PTR(x)                        (((x) [0] << 8) + (x) [1])
+#define BET2H_32_PTR(x)                        (((x) [0] << 24) + ((x) [1] << 16) + ((x) [2] << 8))
 
-#define BET2H_SHORT_PTR(x)             (((x) [0] << 8) + (x) [1])
-#define BET2H_INT_PTR(x)               (((x) [0] << 24) + ((x) [1] << 16) + ((x) [2] << 8))
+static inline void
+psf_put_be64 (uint8_t *ptr, int offset, int64_t value)
+{
+       ptr [offset] = value >> 56 ;
+       ptr [offset + 1] = value >> 48 ;
+       ptr [offset + 2] = value >> 40 ;
+       ptr [offset + 3] = value >> 32 ;
+       ptr [offset + 4] = value >> 24 ;
+       ptr [offset + 5] = value >> 16 ;
+       ptr [offset + 6] = value >> 8 ;
+       ptr [offset + 7] = value ;
+} /* psf_put_be64 */
+
+static inline void
+psf_put_be32 (uint8_t *ptr, int offset, int32_t value)
+{
+       ptr [offset] = value >> 24 ;
+       ptr [offset + 1] = value >> 16 ;
+       ptr [offset + 2] = value >> 8 ;
+       ptr [offset + 3] = value ;
+} /* psf_put_be32 */
+
+static inline void
+psf_put_be16 (uint8_t *ptr, int offset, int16_t value)
+{
+       ptr [offset] = value >> 8 ;
+       ptr [offset + 1] = value ;
+} /* psf_put_be16 */
+
+static inline int64_t
+psf_get_be64 (uint8_t *ptr, int offset)
+{      int64_t value ;
+
+       value = ((uint32_t) ptr [offset]) << 24 ;
+       value += ptr [offset + 1] << 16 ;
+       value += ptr [offset + 2] << 8 ;
+       value += ptr [offset + 3] ;
+
+       value = ((uint64_t) value) << 32 ;
+
+       value += ((uint32_t) ptr [offset + 4]) << 24 ;
+       value += ptr [offset + 5] << 16 ;
+       value += ptr [offset + 6] << 8 ;
+       value += ptr [offset + 7] ;
+       return value ;
+} /* psf_get_be64 */
+
+static inline int64_t
+psf_get_le64 (uint8_t *ptr, int offset)
+{      int64_t value ;
+
+       value = ((uint32_t) ptr [offset + 7]) << 24 ;
+       value += ptr [offset + 6] << 16 ;
+       value += ptr [offset + 5] << 8 ;
+       value += ptr [offset + 4] ;
+
+       value = ((uint64_t) value) << 32 ;
+
+       value += ((uint32_t) ptr [offset + 3]) << 24 ;
+       value += ptr [offset + 2] << 16 ;
+       value += ptr [offset + 1] << 8 ;
+       value += ptr [offset] ;
+       return value ;
+} /* psf_get_le64 */
+
+static inline int32_t
+psf_get_be32 (uint8_t *ptr, int offset)
+{      int32_t value ;
+
+       value = ((uint32_t) ptr [offset]) << 24 ;
+       value += ptr [offset + 1] << 16 ;
+       value += ptr [offset + 2] << 8 ;
+       value += ptr [offset + 3] ;
+       return value ;
+} /* psf_get_be32 */
+
+static inline int32_t
+psf_get_le32 (uint8_t *ptr, int offset)
+{      int32_t value ;
+
+       value = ((uint32_t) ptr [offset + 3]) << 24 ;
+       value += ptr [offset + 2] << 16 ;
+       value += ptr [offset + 1] << 8 ;
+       value += ptr [offset] ;
+       return value ;
+} /* psf_get_le32 */
+
+static inline int32_t
+psf_get_be24 (uint8_t *ptr, int offset)
+{      int32_t value ;
+
+       value = ((uint32_t) ptr [offset]) << 24 ;
+       value += ptr [offset + 1] << 16 ;
+       value += ptr [offset + 2] << 8 ;
+       return value ;
+} /* psf_get_be24 */
+
+static inline int32_t
+psf_get_le24 (uint8_t *ptr, int offset)
+{      int32_t value ;
+
+       value = ((uint32_t) ptr [offset + 2]) << 24 ;
+       value += ptr [offset + 1] << 16 ;
+       value += ptr [offset] << 8 ;
+       return value ;
+} /* psf_get_le24 */
+
+static inline int16_t
+psf_get_be16 (uint8_t *ptr, int offset)
+{      return (ptr [offset] << 8) + ptr [offset + 1] ;
+} /* psf_get_be16 */
 
 /*-----------------------------------------------------------------------------------------------
 ** Generic functions for performing endian swapping on integer arrays.
@@ -115,7 +264,7 @@ endswap_short_array (short *ptr, int len)
 
        while (--len >= 0)
        {       temp = ptr [len] ;
-               ptr [len] = ENDSWAP_SHORT (temp) ;
+               ptr [len] = ENDSWAP_16 (temp) ;
                } ;
 } /* endswap_short_array */
 
@@ -123,7 +272,7 @@ static inline void
 endswap_short_copy (short *dest, const short *src, int len)
 {
        while (--len >= 0)
-       {       dest [len] = ENDSWAP_SHORT (src [len]) ;
+       {       dest [len] = ENDSWAP_16 (src [len]) ;
                } ;
 } /* endswap_short_copy */
 
@@ -133,7 +282,7 @@ endswap_int_array (int *ptr, int len)
 
        while (--len >= 0)
        {       temp = ptr [len] ;
-               ptr [len] = ENDSWAP_INT (temp) ;
+               ptr [len] = ENDSWAP_32 (temp) ;
                } ;
 } /* endswap_int_array */
 
@@ -141,22 +290,20 @@ static inline void
 endswap_int_copy (int *dest, const int *src, int len)
 {
        while (--len >= 0)
-       {       dest [len] = ENDSWAP_INT (src [len]) ;
+       {       dest [len] = ENDSWAP_32 (src [len]) ;
                } ;
 } /* endswap_int_copy */
 
 /*========================================================================================
 */
 
-#if    (HAVE_BYTESWAP_H && defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
-
 static inline void
 endswap_int64_t_array (int64_t *ptr, int len)
 {      int64_t value ;
 
        while (--len >= 0)
        {       value = ptr [len] ;
-               ptr [len] = bswap_64 (value) ;
+               ptr [len] = ENDSWAP_64 (value) ;
                } ;
 } /* endswap_int64_t_array */
 
@@ -166,78 +313,20 @@ endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len)
 
        while (--len >= 0)
        {       value = src [len] ;
-               dest [len] = bswap_64 (value) ;
+               dest [len] = ENDSWAP_64 (value) ;
                } ;
 } /* endswap_int64_t_copy */
 
-#else
-
-static inline void
-endswap_int64_t_array (int64_t *ptr, int len)
-{      unsigned char *ucptr, temp ;
-
-       ucptr = (unsigned char *) ptr ;
-       ucptr += 8 * len ;
-       while (--len >= 0)
-       {       ucptr -= 8 ;
-
-               temp = ucptr [0] ;
-               ucptr [0] = ucptr [7] ;
-               ucptr [7] = temp ;
-
-               temp = ucptr [1] ;
-               ucptr [1] = ucptr [6] ;
-               ucptr [6] = temp ;
-
-               temp = ucptr [2] ;
-               ucptr [2] = ucptr [5] ;
-               ucptr [5] = temp ;
-
-               temp = ucptr [3] ;
-               ucptr [3] = ucptr [4] ;
-               ucptr [4] = temp ;
-               } ;
-} /* endswap_int64_t_array */
-
-static inline void
-endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len)
-{      const unsigned char *psrc ;
-       unsigned char *pdest ;
-
-       if (dest == src)
-       {       endswap_int64_t_array (dest, len) ;
-               return ;
-               } ;
-
-       psrc = ((const unsigned char *) src) + 8 * len ;
-       pdest = ((unsigned char *) dest) + 8 * len ;
-       while (--len >= 0)
-       {       psrc -= 8 ;
-               pdest -= 8 ;
-
-               pdest [0] = psrc [7] ;
-               pdest [2] = psrc [5] ;
-               pdest [4] = psrc [3] ;
-               pdest [6] = psrc [1] ;
-               pdest [7] = psrc [0] ;
-               pdest [1] = psrc [6] ;
-               pdest [3] = psrc [4] ;
-               pdest [5] = psrc [2] ;
-               } ;
-} /* endswap_int64_t_copy */
-
-#endif
-
 /* A couple of wrapper functions. */
 
 static inline void
 endswap_float_array (float *ptr, int len)
-{      endswap_int_array ((void *) ptr, len) ;
+{      endswap_int_array ((int *) ptr, len) ;
 } /* endswap_float_array */
 
 static inline void
 endswap_double_array (double *ptr, int len)
-{      endswap_int64_t_array ((void *) ptr, len) ;
+{      endswap_int64_t_array ((int64_t *) ptr, len) ;
 } /* endswap_double_array */
 
 static inline void
index d88a16c..cc74f97 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -75,6 +75,7 @@ ErrorStruct SndfileErrors [] =
        {       SFE_BAD_FILE_PTR                , "Bad FILE pointer." },
        {       SFE_BAD_INT_PTR                 , "Internal error, Bad pointer." },
        {       SFE_BAD_STAT_SIZE               , "Error : software was misconfigured at compile time (sizeof statbuf.st_size)." },
+       {       SFE_NO_TEMP_DIR                 , "Error : Could not file temp dir." },
 
        {       SFE_MALLOC_FAILED               , "Internal malloc () failed." },
        {       SFE_UNIMPLEMENTED               , "File contains data in an unimplemented format." },
@@ -91,10 +92,11 @@ ErrorStruct SndfileErrors [] =
        {       SFE_NO_PIPE_WRITE               , "Error : this file format does not support pipe write." },
        {       SFE_BAD_VIRTUAL_IO              , "Error : bad pointer on SF_VIRTUAL_IO struct." },
        {       SFE_BAD_BROADCAST_INFO_SIZE
-                                                               , "Error : bad size in SF_BROADCAST_INFO struct." },
+                                                               , "Error : bad coding_history_size in SF_BROADCAST_INFO struct." },
        {       SFE_BAD_BROADCAST_INFO_TOO_BIG
                                                                , "Error : SF_BROADCAST_INFO struct too large." },
-
+       {       SFE_BAD_CART_INFO_SIZE                          , "Error: SF_CART_INFO struct too large." },
+       {       SFE_BAD_CART_INFO_TOO_BIG                       , "Error: bag tag_text_size in SF_CART_INFO struct." },
        {       SFE_INTERLEAVE_MODE             , "Attempt to write to file with non-interleaved data." },
        {       SFE_INTERLEAVE_SEEK             , "Bad karma in seek during interleave read operation." },
        {       SFE_INTERLEAVE_READ             , "Bad karma in read during interleave read operation." },
@@ -145,6 +147,7 @@ ErrorStruct SndfileErrors [] =
 
        {       SFE_WAV_ADPCM_NOT4BIT   , "Error in ADPCM WAV file. Invalid bit width." },
        {       SFE_WAV_ADPCM_CHANNELS  , "Error in ADPCM WAV file. Invalid number of channels." },
+       {       SFE_WAV_ADPCM_SAMPLES   , "Error in ADPCM WAV file. Invalid number of samples per block." },
        {       SFE_WAV_GSM610_FORMAT   , "Error in GSM610 WAV file. Invalid format chunk." },
 
        {       SFE_AIFF_NO_FORM                , "Error in AIFF file, bad 'FORM' marker." },
@@ -165,8 +168,7 @@ ErrorStruct SndfileErrors [] =
        {       SFE_AU_EMBED_BAD_LEN    , "Embedded AU file with unknown length." },
 
        {       SFE_RAW_READ_BAD_SPEC   , "Error while opening RAW file for read. Must specify format and channels.\n"
-                                                                       "Possibly trying to open unsupported format."
-                                                                        },
+                                                                       "Possibly trying to open unsupported format." },
        {       SFE_RAW_BAD_BITWIDTH    , "Error. RAW file bitwidth must be a multiple of 8." },
        {       SFE_RAW_BAD_FORMAT              , "Error. Bad format field in SF_INFO struct when openning a RAW file for read." },
 
@@ -253,6 +255,15 @@ ErrorStruct SndfileErrors [] =
        {       SFE_VORBIS_ENCODER_BUG  , "Error : Sample rate chosen is known to trigger a Vorbis encoder bug on this CPU." },
 
        {       SFE_RF64_NOT_RF64               , "Error : Not an RF64 file." },
+       {       SFE_ALAC_FAIL_TMPFILE   , "Error : Failed to open tmp file for ALAC encoding." },
+
+       {       SFE_BAD_CHUNK_PTR               , "Error : Bad SF_CHUNK_INFO pointer." },
+       {       SFE_UNKNOWN_CHUNK               , "Error : Unknown chunk marker." },
+       {       SFE_BAD_CHUNK_FORMAT    , "Error : Reading/writing chunks from this file format is not supported." },
+       {       SFE_BAD_CHUNK_MARKER    , "Error : Bad chunk marker." },
+       {       SFE_BAD_CHUNK_DATA_PTR  , "Error : Bad data pointer in SF_CHUNK_INFO struct." },
+       {       SFE_FILENAME_TOO_LONG   , "Error : Supplied filename too long." },
+
 
        {       SFE_MAX_ERROR                   , "Maximum error number." },
        {       SFE_MAX_ERROR + 1               , NULL }
@@ -266,7 +277,7 @@ static int  guess_file_type (SF_PRIVATE *psf) ;
 static int     validate_sfinfo (SF_INFO *sfinfo) ;
 static int     validate_psf (SF_PRIVATE *psf) ;
 static void    save_header_info (SF_PRIVATE *psf) ;
-static void    copy_filename (SF_PRIVATE *psf, const char *path) ;
+static int     copy_filename (SF_PRIVATE *psf, const char *path) ;
 static int     psf_close (SF_PRIVATE *psf) ;
 
 static int     try_resource_fork (SF_PRIVATE * psf) ;
@@ -276,13 +287,13 @@ static int        try_resource_fork (SF_PRIVATE * psf) ;
 */
 
 int    sf_errno = 0 ;
-static char    sf_logbuffer [SF_BUFFER_LEN] = { 0 } ;
+static char    sf_parselog [SF_BUFFER_LEN] = { 0 } ;
 static char    sf_syserr [SF_SYSERR_LEN] = { 0 } ;
 
 /*------------------------------------------------------------------------------
 */
 
-#define        VALIDATE_SNDFILE_AND_ASSIGN_PSF(a,b,c)          \
+#define        VALIDATE_SNDFILE_AND_ASSIGN_PSF(a, b, c)        \
                {       if ((a) == NULL)                                                \
                        {       sf_errno = SFE_BAD_SNDFILE_PTR ;        \
                                return 0 ;                                                      \
@@ -316,12 +327,14 @@ sf_open   (const char *path, int mode, SF_INFO *sfinfo)
                return  NULL ;
                } ;
 
-       memset (psf, 0, sizeof (SF_PRIVATE)) ;
        psf_init_files (psf) ;
 
        psf_log_printf (psf, "File : %s\n", path) ;
 
-       copy_filename (psf, path) ;
+       if (copy_filename (psf, path) != 0)
+       {       sf_errno = psf->error ;
+               return  NULL ;
+               } ;
 
        psf->file.mode = mode ;
        if (strcmp (path, "-") == 0)
@@ -367,19 +380,19 @@ sf_open_virtual   (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user
        /* Make sure we have a valid set ot virtual pointers. */
        if (sfvirtual->get_filelen == NULL || sfvirtual->seek == NULL || sfvirtual->tell == NULL)
        {       sf_errno = SFE_BAD_VIRTUAL_IO ;
-               snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_get_filelen / vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ;
+               snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_get_filelen / vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ;
                return NULL ;
                } ;
 
        if ((mode == SFM_READ || mode == SFM_RDWR) && sfvirtual->read == NULL)
        {       sf_errno = SFE_BAD_VIRTUAL_IO ;
-               snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ;
+               snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ;
                return NULL ;
                } ;
 
        if ((mode == SFM_WRITE || mode == SFM_RDWR) && sfvirtual->write == NULL)
        {       sf_errno = SFE_BAD_VIRTUAL_IO ;
-               snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ;
+               snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ;
                return NULL ;
                } ;
 
@@ -589,8 +602,8 @@ sf_format_check     (const SF_INFO *info)
                                /* AIFF does allow both endian-nesses for PCM data.*/
                                if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
                                        return 1 ;
-                               /* Other encodings. Check for endian-ness. */
-                               if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+                               /* For other encodings reject any endian-ness setting. */
+                               if (endian != 0)
                                        return 0 ;
                                if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8)
                                        return 1 ;
@@ -631,6 +644,10 @@ sf_format_check    (const SF_INFO *info)
                                        return 1 ;
                                if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
                                        return 1 ;
+                               if (subformat == SF_FORMAT_ALAC_16 || subformat == SF_FORMAT_ALAC_20)
+                                       return 1 ;
+                               if (subformat == SF_FORMAT_ALAC_24 || subformat == SF_FORMAT_ALAC_32)
+                                       return 1 ;
                                if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
                                        return 1 ;
                                break ;
@@ -680,6 +697,8 @@ sf_format_check     (const SF_INFO *info)
                                break ;
 
                case SF_FORMAT_IRCAM :
+                               if (info->channels > 256)
+                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
                                        return 1 ;
                                if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT)
@@ -687,6 +706,8 @@ sf_format_check     (const SF_INFO *info)
                                break ;
 
                case SF_FORMAT_VOC :
+                               if (info->channels > 2)
+                                       return 0 ;
                                /* VOC is strictly little endian. */
                                if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
                                        return 0 ;
@@ -741,31 +762,31 @@ sf_format_check   (const SF_INFO *info)
                                break ;
 
                case SF_FORMAT_HTK :
+                               if (info->channels != 1)
+                                       return 0 ;
                                /* HTK is strictly big endian. */
                                if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (info->channels != 1)
-                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_16)
                                        return 1 ;
                                break ;
 
                case SF_FORMAT_SDS :
+                               if (info->channels != 1)
+                                       return 0 ;
                                /* SDS is strictly big endian. */
                                if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (info->channels != 1)
-                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
                                        return 1 ;
                                break ;
 
                case SF_FORMAT_AVR :
+                               if (info->channels > 2)
+                                       return 0 ;
                                /* SDS is strictly big endian. */
                                if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (info->channels > 2)
-                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
                                        return 1 ;
                                break ;
@@ -774,6 +795,8 @@ sf_format_check     (const SF_INFO *info)
                                /* FLAC can't do more than 8 channels. */
                                if (info->channels > 8)
                                        return 0 ;
+                               if (endian != SF_ENDIAN_FILE)
+                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
                                        return 1 ;
                                break ;
@@ -782,31 +805,33 @@ sf_format_check   (const SF_INFO *info)
                                /* SD2 is strictly big endian. */
                                if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
+                               if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
                                        return 1 ;
                                break ;
 
                case SF_FORMAT_WVE :
+                               if (info->channels > 1)
+                                       return 0 ;
                                /* WVE is strictly big endian. */
                                if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (info->channels > 1)
-                                       return 0 ;
                                if (subformat == SF_FORMAT_ALAW)
                                        return 1 ;
                                break ;
 
                case SF_FORMAT_OGG :
+                               if (endian != SF_ENDIAN_FILE)
+                                       return 0 ;
                                if (subformat == SF_FORMAT_VORBIS)
                                        return 1 ;
                                break ;
 
                case SF_FORMAT_MPC2K :
+                               if (info->channels > 2)
+                                       return 0 ;
                                /* MPC2000 is strictly little endian. */
                                if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
                                        return 0 ;
-                               if (info->channels > 2)
-                                       return 0 ;
                                if (subformat == SF_FORMAT_PCM_16)
                                        return 1 ;
                                break ;
@@ -849,6 +874,7 @@ sf_version_string (void)
 int
 sf_command     (SNDFILE *sndfile, int command, void *data, int datasize)
 {      SF_PRIVATE *psf = (SF_PRIVATE *) sndfile ;
+       double quality ;
        int old_value ;
 
        /* This set of commands do not need the sndfile parameter. */
@@ -904,7 +930,7 @@ sf_command  (SNDFILE *sndfile, int command, void *data, int datasize)
        if (sndfile == NULL && command == SFC_GET_LOG_INFO)
        {       if (data == NULL)
                        return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
-               snprintf (data, datasize, "%s", sf_logbuffer) ;
+               snprintf (data, datasize, "%s", sf_parselog) ;
                return strlen (data) ;
                } ;
 
@@ -938,7 +964,8 @@ sf_command  (SNDFILE *sndfile, int command, void *data, int datasize)
 
                        psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ;
                        if (psf->float_int_mult && psf->float_max < 0.0)
-                               psf->float_max = psf_calc_signal_max (psf, SF_FALSE) ;
+                               /* Scale to prevent wrap-around distortion. */
+                               psf->float_max = (32768.0 / 32767.0) * psf_calc_signal_max (psf, SF_FALSE) ;
                        return old_value ;
 
                case SFC_SET_SCALE_INT_FLOAT_WRITE :
@@ -997,7 +1024,7 @@ sf_command (SNDFILE *sndfile, int command, void *data, int datasize)
                case SFC_GET_LOG_INFO :
                        if (data == NULL)
                                return SFE_BAD_COMMAND_PARAM ;
-                       snprintf (data, datasize, "%s", psf->logbuffer) ;
+                       snprintf (data, datasize, "%s", psf->parselog.buf) ;
                        break ;
 
                case SFC_CALC_SIGNAL_MAX :
@@ -1161,15 +1188,8 @@ sf_command       (SNDFILE *sndfile, int command, void *data, int datasize)
                                return SF_FALSE ;
                                } ;
 
-#if 0
-                       if (psf->broadcast_info == NULL)
-                               psf->broadcast_info = broadcast_info_alloc () ;
-
-                       broadcast_info_copy (psf->broadcast_info, data) ;
-                       broadcast_add_coding_history (psf->broadcast_info, psf->sf.channels, psf->sf.samplerate, psf->sf.format) ;
-#else
-                       broadcast_var_set (psf, data, datasize) ;
-#endif
+                       if (NOT (broadcast_var_set (psf, data, datasize)))
+                               return SF_FALSE ;
 
                        if (psf->write_header)
                                psf->write_header (psf, SF_TRUE) ;
@@ -1180,13 +1200,35 @@ sf_command      (SNDFILE *sndfile, int command, void *data, int datasize)
                        {       psf->error = SFE_BAD_COMMAND_PARAM ;
                                return SF_FALSE ;
                                } ;
-#if 0
-                       if (psf->broadcast_info == NULL)
-                               return SF_FALSE ;
-                       return broadcast_info_copy (data, psf->broadcast_info) ;
-#else
                        return broadcast_var_get (psf, data, datasize) ;
-#endif
+
+               case SFC_SET_CART_INFO :
+                       {       int format = SF_CONTAINER (psf->sf.format) ;
+                               /* Only WAV and RF64 support cart chunk format */
+                               if (format != SF_FORMAT_WAV && format != SF_FORMAT_RF64)
+                                       return SF_FALSE ;
+                               } ;
+
+                       /* Only makes sense in SFM_WRITE or SFM_RDWR mode */
+                       if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR))
+                               return SF_FALSE ;
+                       /* If data has already been written this must fail. */
+                       if (psf->cart_16k == NULL && psf->have_written)
+                       {       psf->error = SFE_CMD_HAS_DATA ;
+                               return SF_FALSE ;
+                               } ;
+                       if (NOT (cart_var_set (psf, data, datasize)))
+                               return SF_FALSE ;
+                       if (psf->write_header)
+                               psf->write_header (psf, SF_TRUE) ;
+                       return SF_TRUE ;
+
+               case SFC_GET_CART_INFO :
+                       if (data == NULL)
+                       {       psf->error = SFE_BAD_COMMAND_PARAM ;
+                               return SF_FALSE ;
+                               } ;
+                       return cart_var_get (psf, data, datasize) ;
 
                case SFC_GET_INSTRUMENT :
                        if (datasize != sizeof (SF_INSTRUMENT) || data == NULL)
@@ -1267,6 +1309,15 @@ sf_command       (SNDFILE *sndfile, int command, void *data, int datasize)
                                return psf->command (psf, command, NULL, 0) ;
                        return SF_FALSE ;
 
+               case SFC_SET_VBR_ENCODING_QUALITY :
+                       if (data == NULL || datasize != sizeof (double))
+                               return SF_FALSE ;
+
+                       quality = *((double *) data) ;
+                       quality = 1.0 - SF_MAX (0.0, SF_MIN (1.0, quality)) ;
+                       return sf_command (sndfile, SFC_SET_COMPRESSION_LEVEL, &quality, sizeof (quality)) ;
+
+
                default :
                        /* Must be a file specific command. Pass it on. */
                        if (psf->command)
@@ -1421,6 +1472,50 @@ sf_set_string (SNDFILE *sndfile, int str_type, const char* str)
        return psf_set_string (psf, str_type, str) ;
 } /* sf_get_string */
 
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_current_byterate (SNDFILE *sndfile)
+{      SF_PRIVATE      *psf ;
+
+       if ((psf = (SF_PRIVATE*) sndfile) == NULL)
+               return -1 ;
+       if (psf->Magick != SNDFILE_MAGICK)
+               return -1 ;
+
+       /* This should cover all PCM and floating point formats. */
+       if (psf->bytewidth)
+               return psf->sf.samplerate * psf->sf.channels * psf->bytewidth ;
+
+       if (psf->byterate)
+               return psf->byterate (psf) ;
+
+       switch (SF_CODEC (psf->sf.format))
+       {       case SF_FORMAT_IMA_ADPCM :
+               case SF_FORMAT_MS_ADPCM :
+               case SF_FORMAT_VOX_ADPCM :
+                       return (psf->sf.samplerate * psf->sf.channels) / 2 ;
+
+               case SF_FORMAT_GSM610 :
+                       return (psf->sf.samplerate * psf->sf.channels * 13000) / 8000 ;
+
+               case SF_FORMAT_G721_32 :        /* 32kbs G721 ADPCM encoding. */
+                       return (psf->sf.samplerate * psf->sf.channels) / 2 ;
+
+               case SF_FORMAT_G723_24 :        /* 24kbs G723 ADPCM encoding. */
+                       return (psf->sf.samplerate * psf->sf.channels * 3) / 8 ;
+
+               case SF_FORMAT_G723_40 :        /* 40kbs G723 ADPCM encoding. */
+                       return (psf->sf.samplerate * psf->sf.channels * 5) / 8 ;
+
+               default :
+                       break ;
+               } ;
+
+       return -1 ;
+} /* sf_current_byterate */
+
 /*==============================================================================
 */
 
@@ -1876,12 +1971,14 @@ sf_write_raw    (SNDFILE *sndfile, const void *ptr, sf_count_t len)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count ;
 } /* sf_write_raw */
 
@@ -1924,12 +2021,14 @@ sf_write_short  (SNDFILE *sndfile, const short *ptr, sf_count_t len)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count ;
 } /* sf_write_short */
 
@@ -1964,12 +2063,14 @@ sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count / psf->sf.channels ;
 } /* sf_writef_short */
 
@@ -2012,12 +2113,14 @@ sf_write_int    (SNDFILE *sndfile, const int *ptr, sf_count_t len)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count ;
 } /* sf_write_int */
 
@@ -2052,12 +2155,14 @@ sf_writef_int   (SNDFILE *sndfile, const int *ptr, sf_count_t frames)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count / psf->sf.channels ;
 } /* sf_writef_int */
 
@@ -2100,12 +2205,14 @@ sf_write_float  (SNDFILE *sndfile, const float *ptr, sf_count_t len)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count ;
 } /* sf_write_float */
 
@@ -2140,12 +2247,14 @@ sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count / psf->sf.channels ;
 } /* sf_writef_float */
 
@@ -2188,12 +2297,14 @@ sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t len)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count ;
 } /* sf_write_double */
 
@@ -2228,12 +2339,14 @@ sf_writef_double        (SNDFILE *sndfile, const double *ptr, sf_count_t frames)
 
        psf->last_op = SFM_WRITE ;
 
+       if (psf->write_current > psf->sf.frames)
+       {       psf->sf.frames = psf->write_current ;
+               psf->dataend = 0 ;
+               } ;
+
        if (psf->auto_header && psf->write_header != NULL)
                psf->write_header (psf, SF_TRUE) ;
 
-       if (psf->write_current > psf->sf.frames)
-               psf->sf.frames = psf->write_current ;
-
        return count / psf->sf.channels ;
 } /* sf_writef_double */
 
@@ -2319,7 +2432,7 @@ format_from_extension (SF_PRIVATE *psf)
 
 static int
 guess_file_type (SF_PRIVATE *psf)
-{      int buffer [3], format ;
+{      uint32_t buffer [3], format ;
 
        if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer))
        {       psf->error = SFE_BAD_FILE_READ ;
@@ -2405,7 +2518,7 @@ guess_file_type (SF_PRIVATE *psf)
                return 0 /*-SF_FORMAT_WMA-*/ ;
 
        /* HMM (Hidden Markov Model) Tool Kit. */
-       if (2 * BEI2H_INT (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0))
+       if (buffer [2] == MAKE_MARKER (0, 2, 0, 0) && 2 * ((int64_t) BE2H_32 (buffer [0])) + 12 == psf->filelength)
                return SF_FORMAT_HTK ;
 
        if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C'))
@@ -2481,14 +2594,19 @@ validate_psf (SF_PRIVATE *psf)
 
 static void
 save_header_info (SF_PRIVATE *psf)
-{      snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
+{      snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ;
 } /* save_header_info */
 
-static void
+static int
 copy_filename (SF_PRIVATE *psf, const char *path)
 {      const char *ccptr ;
        char *cptr ;
 
+       if (strlen (path) > 1 && strlen (path) - 1 >= sizeof (psf->file.path.c))
+       {       psf->error = SFE_FILENAME_TOO_LONG ;
+               return psf->error ;
+               } ;
+
        snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", path) ;
        if ((ccptr = strrchr (path, '/')) || (ccptr = strrchr (path, '\\')))
                ccptr ++ ;
@@ -2504,7 +2622,7 @@ copy_filename (SF_PRIVATE *psf, const char *path)
        else
                psf->file.dir.c [0] = 0 ;
 
-       return ;
+       return ;
 } /* copy_filename */
 
 /*==============================================================================
@@ -2512,47 +2630,41 @@ copy_filename (SF_PRIVATE *psf, const char *path)
 
 static int
 psf_close (SF_PRIVATE *psf)
-{      int     error = 0 ;
+{      uint32_t k ;
+       int     error = 0 ;
 
        if (psf->codec_close)
-               error = psf->codec_close (psf) ;
+       {       error = psf->codec_close (psf) ;
+               /* To prevent it being called in psf->container_close(). */
+               psf->codec_close = NULL ;
+               } ;
+
        if (psf->container_close)
                error = psf->container_close (psf) ;
 
        error = psf_fclose (psf) ;
        psf_close_rsrc (psf) ;
 
-       if (psf->container_data)
-               free (psf->container_data) ;
-
-       if (psf->codec_data)
-               free (psf->codec_data) ;
-
-       if (psf->interleave)
-               free (psf->interleave) ;
-
-       if (psf->dither)
-               free (psf->dither) ;
-
-       if (psf->peak_info)
-               free (psf->peak_info) ;
-
-       if (psf->broadcast_16k)
-               free (psf->broadcast_16k) ;
-
-       if (psf->loop_info)
-               free (psf->loop_info) ;
-
-       if (psf->instrument)
-               free (psf->instrument) ;
-
-       if (psf->channel_map)
-               free (psf->channel_map) ;
-
-       if (psf->format_desc)
-       {       psf->format_desc [0] = 0 ;
-               free (psf->format_desc) ;
-               } ;
+       /* For an ISO C compliant implementation it is ok to free a NULL pointer. */
+       free (psf->container_data) ;
+       free (psf->codec_data) ;
+       free (psf->interleave) ;
+       free (psf->dither) ;
+       free (psf->peak_info) ;
+       free (psf->broadcast_16k) ;
+       free (psf->loop_info) ;
+       free (psf->instrument) ;
+       free (psf->channel_map) ;
+       free (psf->format_desc) ;
+       free (psf->strings.storage) ;
+
+       if (psf->wchunks.chunks)
+               for (k = 0 ; k < psf->wchunks.used ; k++)
+                       free (psf->wchunks.chunks [k].data) ;
+       free (psf->rchunks.chunks) ;
+       free (psf->wchunks.chunks) ;
+       free (psf->iterator) ;
+       free (psf->cart_16k) ;
 
        memset (psf, 0, sizeof (SF_PRIVATE)) ;
        free (psf) ;
@@ -2565,7 +2677,7 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
 {      int             error, format ;
 
        sf_errno = error = 0 ;
-       sf_logbuffer [0] = 0 ;
+       sf_parselog [0] = 0 ;
 
        if (psf->error)
        {       error = psf->error ;
@@ -2582,11 +2694,6 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
                goto error_exit ;
                } ;
 
-       /* Zero out these fields. */
-       sfinfo->frames = 0 ;
-       sfinfo->sections = 0 ;
-       sfinfo->seekable = 0 ;
-
        if (psf->file.mode == SFM_READ)
        {       if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_RAW)
                {       if (sf_format_check (sfinfo) == 0)
@@ -2598,7 +2705,7 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
                        memset (sfinfo, 0, sizeof (SF_INFO)) ;
                } ;
 
-       memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+       memcpy (&psf->sf, sfinfo, sizeof (SF_INFO)) ;
 
        psf->Magick             = SNDFILE_MAGICK ;
        psf->norm_float         = SF_TRUE ;
@@ -2673,7 +2780,7 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
                        goto error_exit ;
                        } ;
 
-               if (sf_format_check (&(psf->sf)) == 0)
+               if (sf_format_check (&psf->sf) == 0)
                {       error = SFE_BAD_OPEN_FORMAT ;
                        goto error_exit ;
                        } ;
@@ -2863,12 +2970,12 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
        if (psf->fileoffset > 0)
                psf_log_printf (psf, "Embedded file length : %D\n", psf->filelength) ;
 
-       if (psf->file.mode == SFM_RDWR && sf_format_check (&(psf->sf)) == 0)
+       if (psf->file.mode == SFM_RDWR && sf_format_check (&psf->sf) == 0)
        {       error = SFE_BAD_MODE_RW ;
                goto error_exit ;
                } ;
 
-       if (validate_sfinfo (&(psf->sf)) == 0)
+       if (validate_sfinfo (&psf->sf) == 0)
        {       psf_log_SF_INFO (psf) ;
                save_header_info (psf) ;
                error = SFE_BAD_SF_INFO ;
@@ -2888,9 +2995,15 @@ psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
                psf->have_written = psf->sf.frames > 0 ? SF_TRUE : SF_FALSE ;
                } ;
 
-       memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
+       memcpy (sfinfo, &psf->sf, sizeof (SF_INFO)) ;
 
-       memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
+       if (psf->file.mode == SFM_WRITE)
+       {       /* Zero out these fields. */
+               sfinfo->frames = 0 ;
+               } ;
+
+       sfinfo->sections = 0 ;
+       sfinfo->seekable = 0 ;
 
        return (SNDFILE *) psf ;
 
@@ -2899,7 +3012,7 @@ error_exit :
 
        if (error == SFE_SYSTEM)
                snprintf (sf_syserr, sizeof (sf_syserr), "%s", psf->syserr) ;
-       snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
+       snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ;
 
        switch (error)
        {       case SF_ERR_SYSTEM :
@@ -2921,3 +3034,79 @@ error_exit :
        return NULL ;
 } /* psf_open_file */
 
+/*==============================================================================
+** Chunk getting and setting.
+*/
+
+int
+sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info)
+{      SF_PRIVATE      *psf ;
+
+       VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+       if (chunk_info == NULL || chunk_info->data == NULL)
+               return SFE_BAD_CHUNK_PTR ;
+
+       if (psf->set_chunk)
+               return psf->set_chunk (psf, chunk_info) ;
+
+       return SFE_BAD_CHUNK_FORMAT ;
+} /* sf_set_chunk */
+
+SF_CHUNK_ITERATOR *
+sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info)
+{      SF_PRIVATE      *psf ;
+
+       VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+       if (chunk_info)
+               return psf_get_chunk_iterator (psf, chunk_info->id) ;
+
+       return psf_get_chunk_iterator (psf, NULL) ;
+} /* sf_get_chunk_iterator */
+
+SF_CHUNK_ITERATOR *
+sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator)
+{      SF_PRIVATE      *psf ;
+       SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ;
+
+       VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+       if (psf->next_chunk_iterator)
+               return psf->next_chunk_iterator (psf, iterator) ;
+
+       return NULL ;
+} /* sf_get_chunk_iterator_next */
+
+int
+sf_get_chunk_size (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      SF_PRIVATE      *psf ;
+       SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ;
+
+       VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+       if (chunk_info == NULL)
+               return SFE_BAD_CHUNK_PTR ;
+
+       if (psf->get_chunk_size)
+               return psf->get_chunk_size (psf, iterator, chunk_info) ;
+
+       return SFE_BAD_CHUNK_FORMAT ;
+       return 0 ;
+} /* sf_get_chunk_size */
+
+int
+sf_get_chunk_data (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      SF_PRIVATE      *psf ;
+       SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ;
+
+       VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+       if (chunk_info == NULL || chunk_info->data == NULL)
+               return SFE_BAD_CHUNK_PTR ;
+
+       if (psf->get_chunk_data)
+               return psf->get_chunk_data (psf, iterator, chunk_info) ;
+
+       return SFE_BAD_CHUNK_FORMAT ;
+} /* sf_get_chunk_data */
index 8926fc6..985cc7d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-201Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -30,6 +30,7 @@
 #define        SNDFILE_1
 
 #include <stdio.h>
+#include <stdint.h>
 #include <sys/types.h>
 
 #ifdef __cplusplus
@@ -105,6 +106,11 @@ enum
 
        SF_FORMAT_VORBIS                = 0x0060,               /* Xiph Vorbis encoding. */
 
+       SF_FORMAT_ALAC_16               = 0x0070,               /* Apple Lossless Audio Codec (16 bit). */
+       SF_FORMAT_ALAC_20               = 0x0071,               /* Apple Lossless Audio Codec (20 bit). */
+       SF_FORMAT_ALAC_24               = 0x0072,               /* Apple Lossless Audio Codec (24 bit). */
+       SF_FORMAT_ALAC_32               = 0x0073,               /* Apple Lossless Audio Codec (32 bit). */
+
        /* Endian-ness options. */
 
        SF_ENDIAN_FILE                  = 0x00000000,   /* Default file endian-ness. */
@@ -191,7 +197,19 @@ enum
        SFC_WAVEX_SET_AMBISONIC                 = 0x1200,
        SFC_WAVEX_GET_AMBISONIC                 = 0x1201,
 
+       /*
+       ** RF64 files can be set so that on-close, writable files that have less
+       ** than 4GB of data in them are converted to RIFF/WAV, as per EBU
+       ** recommendations.
+       */
+       SFC_RF64_AUTO_DOWNGRADE                 = 0x1210,
+
        SFC_SET_VBR_ENCODING_QUALITY    = 0x1300,
+       SFC_SET_COMPRESSION_LEVEL               = 0x1301,
+
+       /* Cart Chunk support */
+       SFC_SET_CART_INFO                               = 0x1400,
+       SFC_GET_CART_INFO                               = 0x1401,
 
        /* Following commands for testing only. */
        SFC_TEST_IEEE_FLOAT_REPLACE             = 0x6001,
@@ -199,7 +217,7 @@ enum
        /*
        ** SFC_SET_ADD_* values are deprecated and will disappear at some
        ** time in the future. They are guaranteed to be here up to and
-       ** including version 1.0.8 to avoid breakage of existng software.
+       ** including version 1.0.8 to avoid breakage of existing software.
        ** They currently do nothing and will continue to do nothing.
        */
        SFC_SET_ADD_DITHER_ON_WRITE             = 0x1070,
@@ -406,9 +424,9 @@ typedef struct
 
        struct
        {       int mode ;
-               unsigned int start ;
-               unsigned int end ;
-               unsigned int count ;
+               uint32_t start ;
+               uint32_t end ;
+               uint32_t count ;
        } loops [16] ; /* make variable in a sensible way */
 } SF_INSTRUMENT ;
 
@@ -426,7 +444,7 @@ typedef struct
                                                        /* a full bar of 7/8 is 7 beats */
 
        float   bpm ;                   /* suggestion, as it can be calculated using other fields:*/
-                                                       /* file's lenght, file's sampleRate and our time_sig_den*/
+                                                       /* file's length, file's sampleRate and our time_sig_den*/
                                                        /* -> bpms are always the amount of _quarter notes_ per minute */
 
        int     root_key ;                      /* MIDI note, or -1 for None */
@@ -439,23 +457,56 @@ typedef struct
 */
 #define        SF_BROADCAST_INFO_VAR(coding_hist_size) \
                        struct \
-                       {       char                    description [256] ; \
-                               char                    originator [32] ; \
-                               char                    originator_reference [32] ; \
-                               char                    origination_date [10] ; \
-                               char                    origination_time [8] ; \
-                               unsigned int    time_reference_low ; \
-                               unsigned int    time_reference_high ; \
-                               short                   version ; \
-                               char                    umid [64] ; \
-                               char                    reserved [190] ; \
-                               unsigned int    coding_history_size ; \
-                               char                    coding_history [coding_hist_size] ; \
+                       {       char            description [256] ; \
+                               char            originator [32] ; \
+                               char            originator_reference [32] ; \
+                               char            origination_date [10] ; \
+                               char            origination_time [8] ; \
+                               uint32_t        time_reference_low ; \
+                               uint32_t        time_reference_high ; \
+                               short           version ; \
+                               char            umid [64] ; \
+                               char            reserved [190] ; \
+                               uint32_t        coding_history_size ; \
+                               char            coding_history [coding_hist_size] ; \
                        }
 
 /* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */
 typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ;
 
+struct SF_CART_TIMER
+{      char    usage [4] ;
+       int32_t value ;
+} ;
+
+typedef struct SF_CART_TIMER SF_CART_TIMER ;
+
+#define        SF_CART_INFO_VAR(p_tag_text_size) \
+                       struct \
+                       {       char            version [4] ; \
+                               char            title [64] ; \
+                               char            artist [64] ; \
+                               char            cut_id [64] ; \
+                               char            client_id [64] ; \
+                               char            category [64] ; \
+                               char            classification [64] ; \
+                               char            out_cue [64] ; \
+                               char            start_date [10] ; \
+                               char            start_time [8] ; \
+                               char            end_date [10] ; \
+                               char            end_time [8] ; \
+                               char            producer_app_id [64] ; \
+                               char            producer_app_version [64] ; \
+                               char            user_def [64] ; \
+                               int32_t         level_reference ; \
+                               SF_CART_TIMER   post_timers [8] ; \
+                               char            reserved [276] ; \
+                               char            url [1024] ; \
+                               uint32_t        tag_text_size ; \
+                               char            tag_text [p_tag_text_size] ; \
+                       }
+
+typedef SF_CART_INFO_VAR (256) SF_CART_INFO ;
 
 /*     Virtual I/O functionality. */
 
@@ -487,7 +538,7 @@ SNDFILE*    sf_open         (const char *path, int mode, SF_INFO *sfinfo) ;
 
 /* Use the existing file descriptor to create a SNDFILE object. If close_desc
 ** is TRUE, the file descriptor will be closed when sf_close() is called. If
-** it is FALSE, the descritor will not be closed.
+** it is FALSE, the descriptor will not be closed.
 ** When passed a descriptor like this, the library will assume that the start
 ** of file header is at the current file offset. This allows sound files within
 ** larger container files to be read and/or written.
@@ -525,7 +576,7 @@ const char* sf_error_number (int errnum) ;
 
 
 /* The following two error functions are deprecated but they will remain in the
-** library for the forseeable future. The function sf_strerror() should be used
+** library for the foreseeable future. The function sf_strerror() should be used
 ** in their place.
 */
 
@@ -555,6 +606,12 @@ int                sf_format_check (const SF_INFO *info) ;
 ** On error all of these functions return -1.
 */
 
+enum
+{      SF_SEEK_SET = SEEK_SET,
+       SF_SEEK_CUR = SEEK_CUR,
+       SF_SEEK_END = SEEK_END
+} ;
+
 sf_count_t     sf_seek                 (SNDFILE *sndfile, sf_count_t frames, int whence) ;
 
 
@@ -575,6 +632,18 @@ const char* sf_get_string (SNDFILE *sndfile, int str_type) ;
 
 const char * sf_version_string (void) ;
 
+/* Return the current byterate at this point in the file. The byte rate in this
+** case is the number of bytes per second of audio data. For instance, for a
+** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate
+** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec.
+** For some file formats the returned value will be accurate and exact, for some
+** it will be a close approximation, for some it will be the average bitrate for
+** the whole file and for some it will be a time varying value that was accurate
+** when the file was most recently read or written.
+** To get the bitrate, multiple this value by 8.
+** Returns -1 for unknown.
+*/
+int sf_current_byterate (SNDFILE *sndfile) ;
 
 /* Functions for reading/writing the waveform data of a sound file.
 */
@@ -658,6 +727,102 @@ SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
 
 
 
+
+/* Getting and setting of chunks from within a sound file.
+**
+** These functions allow the getting and setting of chunks within a sound file
+** (for those formats which allow it).
+**
+** These functions fail safely. Specifically, they will not allow you to overwrite
+** existing chunks or add extra versions of format specific reserved chunks but
+** should allow you to retrieve any and all chunks (may not be implemented for
+** all chunks or all file formats).
+*/
+
+struct SF_CHUNK_INFO
+{      char            id [64] ;       /* The chunk identifier. */
+       unsigned        id_size ;       /* The size of the chunk identifier. */
+       unsigned        datalen ;       /* The size of that data. */
+       void            *data ;         /* Pointer to the data. */
+} ;
+
+typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ;
+
+/* Set the specified chunk info (must be done before any audio data is written
+** to the file). This will fail for format specific reserved chunks.
+** The chunk_info->data pointer must be valid until the file is closed.
+** Returns SF_ERR_NO_ERROR on success or non-zero on failure.
+*/
+int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ;
+
+/*
+** An opaque structure to an iterator over the all chunks of a given id
+*/
+typedef        struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ;
+
+/* Get an iterator for all chunks matching chunk_info.
+** The iterator will point to the first chunk matching chunk_info.
+** Chunks are matching, if (chunk_info->id) matches the first
+**     (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle.
+** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle
+**     is returned.
+** The values of chunk_info->datalen and chunk_info->data are ignored.
+** If no matching chunks are found in the sndfile, NULL is returned.
+** The returned iterator will stay valid until one of the following occurs:
+**     a) The sndfile is closed.
+**     b) A new chunk is added using sf_set_chunk().
+**     c) Another chunk iterator function is called on the same SNDFILE* handle
+**        that causes the iterator to be modified.
+** The memory for the iterator belongs to the SNDFILE* handle and is freed when
+** sf_close() is called.
+*/
+SF_CHUNK_ITERATOR *
+sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ;
+
+/* Iterate through chunks by incrementing the iterator.
+** Increments the iterator and returns a handle to the new one.
+** After this call, iterator will no longer be valid, and you must use the
+**      newly returned handle from now on.
+** The returned handle can be used to access the next chunk matching
+**      the criteria as defined in sf_get_chunk_iterator().
+** If iterator points to the last chunk, this will free all resources
+**      associated with iterator and return NULL.
+** The returned iterator will stay valid until sf_get_chunk_iterator_next
+**      is called again, the sndfile is closed or a new chunk us added.
+*/
+SF_CHUNK_ITERATOR *
+sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ;
+
+
+/* Get the size of the specified chunk.
+** If the specified chunk exists, the size will be returned in the
+**      datalen field of the SF_CHUNK_INFO struct.
+**      Additionally, the id of the chunk will be copied to the id
+**      field of the SF_CHUNK_INFO struct and it's id_size field will
+**      be updated accordingly.
+** If the chunk doesn't exist chunk_info->datalen will be zero, and the
+**      id and id_size fields will be undefined.
+** The function will return SF_ERR_NO_ERROR on success or non-zero on
+** failure.
+*/
+int
+sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ;
+
+/* Get the specified chunk data.
+** If the specified chunk exists, up to chunk_info->datalen bytes of
+**      the chunk data will be copied into the chunk_info->data buffer
+**      (allocated by the caller) and the chunk_info->datalen field
+**      updated to reflect the size of the data. The id and id_size
+**      field will be updated according to the retrieved chunk
+** If the chunk doesn't exist chunk_info->datalen will be zero, and the
+**      id and id_size fields will be undefined.
+** The function will return SF_ERR_NO_ERROR on success or non-zero on
+** failure.
+*/
+int
+sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ;
+
+
 #ifdef __cplusplus
 }              /* extern "C" */
 #endif /* __cplusplus */
index d80ec4c..0e1c1c2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2005-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** All rights reserved.
 **
@@ -79,6 +79,8 @@ class SndfileHandle
                                                        int format = 0, int channels = 0, int samplerate = 0) ;
                        SndfileHandle (int fd, bool close_desc, int mode = SFM_READ,
                                                        int format = 0, int channels = 0, int samplerate = 0) ;
+                       SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode = SFM_READ,
+                                                       int format = 0, int channels = 0, int samplerate = 0) ;
 
 #ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
                        SndfileHandle (LPCWSTR wpath, int mode = SFM_READ,
@@ -143,7 +145,7 @@ class SndfileHandle
                /**< Raw access to the handle. SndfileHandle keeps ownership. */
                SNDFILE * rawHandle (void) ;
 
-               /**< Take ownership of handle, iff reference count is 1. */
+               /**< Take ownership of handle, if reference count is 1. */
                SNDFILE * takeOwnership (void) ;
 } ;
 
@@ -153,7 +155,7 @@ class SndfileHandle
 
 inline
 SndfileHandle::SNDFILE_ref::SNDFILE_ref (void)
-: ref (1)
+: sf (NULL), sfinfo (), ref (1)
 {}
 
 inline
@@ -230,6 +232,28 @@ SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int ch
 } /* SndfileHandle fd constructor */
 
 inline
+SndfileHandle::SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode, int fmt, int chans, int srate)
+: p (NULL)
+{
+       p = new (std::nothrow) SNDFILE_ref () ;
+
+       if (p != NULL)
+       {       p->ref = 1 ;
+
+               p->sfinfo.frames = 0 ;
+               p->sfinfo.channels = chans ;
+               p->sfinfo.format = fmt ;
+               p->sfinfo.samplerate = srate ;
+               p->sfinfo.sections = 0 ;
+               p->sfinfo.seekable = 0 ;
+
+               p->sf = sf_open_virtual (&sfvirtual, mode, &p->sfinfo, user_data) ;
+               } ;
+
+       return ;
+} /* SndfileHandle std::string constructor */
+
+inline
 SndfileHandle::~SndfileHandle (void)
 {      if (p != NULL && --p->ref == 0)
                delete p ;
index ce42863..c587e9b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -33,7 +33,7 @@ static void hexdump (void *data, int len) ;
 int
 psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
 {      char    new_str [128] ;
-       size_t  len_remaining, str_len ;
+       size_t  str_len ;
        int             k, str_flags ;
 
        if (str == NULL)
@@ -43,9 +43,9 @@ psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
 
        /* A few extra checks for write mode. */
        if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
-       {       if ((psf->str_flags & SF_STR_ALLOW_START) == 0)
+       {       if ((psf->strings.flags & SF_STR_ALLOW_START) == 0)
                        return SFE_STR_NO_SUPPORT ;
-               if (psf->have_written && (psf->str_flags & SF_STR_ALLOW_END) == 0)
+               if (psf->have_written && (psf->strings.flags & SF_STR_ALLOW_END) == 0)
                        return SFE_STR_NO_SUPPORT ;
                /* Only allow zero length strings for software. */
                if (str_type != SF_STR_SOFTWARE && str_len == 0)
@@ -55,17 +55,17 @@ psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
        /* Find the next free slot in table. */
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
        {       /* If we find a matching entry clear it. */
-               if (psf->strings [k].type == str_type)
-                       psf->strings [k].type = -1 ;
+               if (psf->strings.data [k].type == str_type)
+                       psf->strings.data [k].type = -1 ;
 
-               if (psf->strings [k].type == 0)
+               if (psf->strings.data [k].type == 0)
                        break ;
                } ;
 
        /* Determine flags */
        str_flags = SF_STR_LOCATE_START ;
        if (psf->file.mode == SFM_RDWR || psf->have_written)
-       {       if ((psf->str_flags & SF_STR_ALLOW_END) == 0)
+       {       if ((psf->strings.flags & SF_STR_ALLOW_END) == 0)
                        return SFE_STR_NO_ADD_END ;
                str_flags = SF_STR_LOCATE_END ;
                } ;
@@ -74,19 +74,19 @@ psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
        if (k >= SF_MAX_STRINGS)
                return SFE_STR_MAX_COUNT ;
 
-       if (k == 0 && psf->str_end != NULL)
-       {       psf_log_printf (psf, "SFE_STR_WEIRD : k == 0 && psf->str_end != NULL\n") ;
+       if (k == 0 && psf->strings.storage_used != 0)
+       {       psf_log_printf (psf, "SFE_STR_WEIRD : k == 0 && psf->strings.storage_used != 0\n") ;
                return SFE_STR_WEIRD ;
                } ;
 
-       if (k != 0 && psf->str_end == NULL)
-       {       psf_log_printf (psf, "SFE_STR_WEIRD : k != 0 && psf->str_end == NULL\n") ;
+       if (k != 0 && psf->strings.storage_used == 0)
+       {       psf_log_printf (psf, "SFE_STR_WEIRD : k != 0 && psf->strings.storage_used == 0\n") ;
                return SFE_STR_WEIRD ;
                } ;
 
        /* Special case for the first string. */
        if (k == 0)
-               psf->str_end = psf->str_storage ;
+               psf->strings.storage_used = 0 ;
 
        switch (str_type)
        {       case SF_STR_SOFTWARE :
@@ -125,31 +125,39 @@ psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
                        return SFE_STR_BAD_TYPE ;
                } ;
 
-       str_len = strlen (str) ;
+       /* Plus one to catch string terminator. */
+       str_len = strlen (str) + 1 ;
 
-       len_remaining = SIGNED_SIZEOF (psf->str_storage) - (psf->str_end - psf->str_storage) ;
+       if (psf->strings.storage_used + str_len + 1 > psf->strings.storage_len)
+       {       char * temp = psf->strings.storage ;
+               size_t newlen = 2 * psf->strings.storage_len + str_len + 1 ;
 
-       if (len_remaining < str_len + 2)
-               return SFE_STR_MAX_DATA ;
+               newlen = newlen < 256 ? 256 : newlen ;
 
-       psf->strings [k].type = str_type ;
-       psf->strings [k].str = psf->str_end ;
-       psf->strings [k].flags = str_flags ;
+               if ((psf->strings.storage = realloc (temp, newlen)) == NULL)
+               {       psf->strings.storage = temp ;
+                       return SFE_MALLOC_FAILED ;
+                       } ;
 
-       memcpy (psf->str_end, str, str_len + 1) ;
-       /* Plus one to catch string terminator. */
-       psf->str_end += str_len + 1 ;
+               psf->strings.storage_len = newlen ;
+               } ;
+
+       psf->strings.data [k].type = str_type ;
+       psf->strings.data [k].offset = psf->strings.storage_used ;
+       psf->strings.data [k].flags = str_flags ;
+
+       memcpy (psf->strings.storage + psf->strings.storage_used, str, str_len) ;
+       psf->strings.storage_used += str_len ;
 
-       psf->str_flags |= str_flags ;
+       psf->strings.flags |= str_flags ;
 
 #if STRINGS_DEBUG
-       psf_log_printf (psf, "str_storage          : %X\n", (int) psf->str_storage) ;
-       psf_log_printf (psf, "str_end              : %X\n", (int) psf->str_end) ;
-       psf_log_printf (psf, "sizeof (str_storage) : %d\n", SIGNED_SIZEOF (psf->str_storage)) ;
-       psf_log_printf (psf, "used                 : %d\n", (int ) (psf->str_end - psf->str_storage)) ;
-       psf_log_printf (psf, "remaining            : %d\n", SIGNED_SIZEOF (psf->str_storage) - (psf->str_end - psf->str_storage)) ;
+       psf_log_printf (psf, "str_storage          : %p\n", psf->strings.storage) ;
+       psf_log_printf (psf, "storage_used             : %u\n", psf->strings.storage_used) ;
+       psf_log_printf (psf, "used                 : %d\n", psf->strings.storage_used) ;
+       psf_log_printf (psf, "remaining            : %d\n", psf->strings.storage_len - psf->strings.storage_used ;
 
-       hexdump (psf->str_storage, 300) ;
+       hexdump (psf->strings.storage, 300) ;
 #endif
 
        return 0 ;
@@ -168,8 +176,8 @@ psf_get_string (SF_PRIVATE *psf, int str_type)
 {      int k ;
 
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
-               if (str_type == psf->strings [k].type)
-                       return psf->strings [k].str ;
+               if (str_type == psf->strings.data [k].type)
+                       return psf->strings.storage + psf->strings.data [k].offset ;
 
        return NULL ;
 } /* psf_get_string */
@@ -179,7 +187,7 @@ psf_location_string_count (const SF_PRIVATE * psf, int location)
 {      int k, count = 0 ;
 
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
-               if (psf->strings [k].type > 0 && psf->strings [k].flags & location)
+               if (psf->strings.data [k].type > 0 && psf->strings.data [k].flags & location)
                        count ++ ;
 
        return count ;
index b611f76..aa58d3e 100644 (file)
--- a/src/svx.c
+++ b/src/svx.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -130,7 +130,7 @@ svx_open    (SF_PRIVATE *psf)
 static int
 svx_read_header        (SF_PRIVATE *psf)
 {      VHDR_CHUNK              vhdr ;
-       unsigned int    FORMsize, vhdrsize, dword, marker ;
+       uint32_t                chunk_size, marker ;
        int                             filetype = 0, parsestage = 0, done = 0 ;
        int                     bytecount = 0, channels ;
 
@@ -146,28 +146,21 @@ svx_read_header   (SF_PRIVATE *psf)
        psf->sf.format = SF_FORMAT_SVX ;
 
        while (! done)
-       {       psf_binheader_readf (psf, "m", &marker) ;
+       {       psf_binheader_readf (psf, "Em4", &marker, &chunk_size) ;
+
                switch (marker)
                {       case FORM_MARKER :
                                        if (parsestage)
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &FORMsize) ;
-
-                                       if (FORMsize != psf->filelength - 2 * sizeof (dword))
-                                       {       dword = psf->filelength - 2 * sizeof (dword) ;
-                                               psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
-                                               FORMsize = dword ;
-                                               }
+                                       if (chunk_size != psf->filelength - 2 * sizeof (chunk_size))
+                                               psf_log_printf (psf, "FORM : %u (should be %u)\n", chunk_size, (uint32_t) psf->filelength - 2 * sizeof (chunk_size)) ;
                                        else
-                                               psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+                                               psf_log_printf (psf, "FORM : %u\n", chunk_size) ;
                                        parsestage |= HAVE_FORM ;
-                                       break ;
 
-                       case SVX8_MARKER :
-                       case SV16_MARKER :
-                                       if (! (parsestage & HAVE_FORM))
-                                               return SFE_SVX_NO_FORM ;
+                                       psf_binheader_readf (psf, "m", &marker) ;
+
                                        filetype = marker ;
                                        psf_log_printf (psf, " %M\n", marker) ;
                                        parsestage |= HAVE_SVX ;
@@ -177,9 +170,7 @@ svx_read_header     (SF_PRIVATE *psf)
                                        if (! (parsestage & (HAVE_FORM | HAVE_SVX)))
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &vhdrsize) ;
-
-                                       psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ;
+                                       psf_log_printf (psf, " VHDR : %d\n", chunk_size) ;
 
                                        psf_binheader_readf (psf, "E4442114", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples),
                                                &(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression),
@@ -222,8 +213,7 @@ svx_read_header     (SF_PRIVATE *psf)
                                        if (! (parsestage & HAVE_VHDR))
                                                return SFE_SVX_NO_BODY ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-                                       psf->datalength = dword ;
+                                       psf->datalength = chunk_size ;
 
                                        psf->dataoffset = psf_ftell (psf) ;
                                        if (psf->dataoffset < 0)
@@ -248,39 +238,33 @@ svx_read_header   (SF_PRIVATE *psf)
                                        if (! (parsestage & HAVE_SVX))
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+                                       psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ;
 
-                                       if (strlen (psf->file.name.c) != dword)
-                                       {       if (dword > sizeof (psf->file.name.c) - 1)
+                                       if (strlen (psf->file.name.c) != chunk_size)
+                                       {       if (chunk_size > sizeof (psf->file.name.c) - 1)
                                                        return SFE_SVX_BAD_NAME_LENGTH ;
 
-                                               psf_binheader_readf (psf, "b", psf->file.name.c, dword) ;
-                                               psf->file.name.c [dword] = 0 ;
+                                               psf_binheader_readf (psf, "b", psf->file.name.c, chunk_size) ;
+                                               psf->file.name.c [chunk_size] = 0 ;
                                                }
                                        else
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                        break ;
 
                        case ANNO_MARKER :
                                        if (! (parsestage & HAVE_SVX))
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
+                                       psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ;
 
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
-
-                                       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_binheader_readf (psf, "j", chunk_size) ;
                                        break ;
 
                        case CHAN_MARKER :
                                        if (! (parsestage & HAVE_SVX))
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
-
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+                                       psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ;
 
                                        bytecount += psf_binheader_readf (psf, "E4", &channels) ;
 
@@ -293,7 +277,7 @@ svx_read_header     (SF_PRIVATE *psf)
                                        else
                                                psf_log_printf (psf, "  Channels : %d *** assuming mono\n", channels) ;
 
-                                       psf_binheader_readf (psf, "j", dword - bytecount) ;
+                                       psf_binheader_readf (psf, "j", chunk_size - bytecount) ;
                                        break ;
 
 
@@ -302,37 +286,38 @@ svx_read_header   (SF_PRIVATE *psf)
                                        if (! (parsestage & HAVE_SVX))
                                                return SFE_SVX_NO_FORM ;
 
-                                       psf_binheader_readf (psf, "E4", &dword) ;
+                                       psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ;
 
-                                       psf_log_printf (psf, " %M : %d\n", marker, dword) ;
-
-                                       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_binheader_readf (psf, "j", chunk_size) ;
                                        break ;
 
                        default :
+                                       if (chunk_size >= 0xffff0000)
+                                       {       done = SF_TRUE ;
+                                               psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
+                                               break ;
+                                               } ;
+
                                        if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
                                                && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
-                                       {       psf_binheader_readf (psf, "E4", &dword) ;
-
-                                               psf_log_printf (psf, "%M : %d (unknown marker)\n", marker, dword) ;
-
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                       {       psf_log_printf (psf, "%M : %u (unknown marker)\n", marker, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                } ;
-                                       if ((dword = psf_ftell (psf)) & 0x03)
-                                       {       psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+                                       if ((chunk_size = psf_ftell (psf)) & 0x03)
+                                       {       psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", chunk_size - 4) ;
 
                                                psf_binheader_readf (psf, "j", -3) ;
                                                break ;
                                                } ;
-                                       psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
-                                       done = 1 ;
+                                       psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 8) ;
+                                       done = SF_TRUE ;
                        } ;     /* switch (marker) */
 
                if (! psf->sf.seekable && (parsestage & HAVE_BODY))
                        break ;
 
-               if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (dword))
+               if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size))
                        break ;
                } ; /* while (1) */
 
index 1f0240f..dbea943 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2010-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -57,8 +57,8 @@ fill_coding_history (SF_BROADCAST_INFO_512 * bi)
        return ;
 } /* fill_coding_listory */
 
-void
-test_broadcast_var (void)
+static void
+test_broadcast_var_set (void)
 {      SF_PRIVATE      sf_private, *psf ;
        int k ;
 
@@ -84,4 +84,36 @@ test_broadcast_var (void)
                free (psf->broadcast_16k) ;
 
        puts ("ok") ;
+} /* test_broadcast_var_set */
+
+static void
+test_broadcast_var_zero (void)
+{      SF_PRIVATE      sf_private, *psf ;
+       SF_BROADCAST_INFO_VAR (0) bi ;
+
+       psf = &sf_private ;
+       memset (psf, 0, sizeof (sf_private)) ;
+       psf->file.mode = SFM_RDWR ;
+
+       print_test_name ("Testing broadcast_var_zero ") ;
+
+       memset (&bi, 0, sizeof (bi)) ;
+
+       broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ;
+
+       if (psf->broadcast_16k->coding_history_size != 0)
+       {       printf ("\n\nLine %d: coding_history_size %d should be zero.\n\n", __LINE__, psf->broadcast_16k->coding_history_size) ;
+               exit (1) ;
+               } ;
+
+       if (psf->broadcast_16k != NULL)
+               free (psf->broadcast_16k) ;
+
+       puts ("ok") ;
+} /* test_broadcast_var_zero */
+
+void
+test_broadcast_var (void)
+{      test_broadcast_var_set () ;
+       test_broadcast_var_zero () ;
 } /* test_broadcast_var */
diff --git a/src/test_cart_var.c b/src/test_cart_var.c
new file mode 100644 (file)
index 0000000..532a755
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+** Copyright (C) 2010-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "test_main.h"
+
+#define        CART_MAX        512
+
+typedef SF_CART_INFO_VAR (CART_MAX) SF_CART_INFO_512 ;
+
+static void
+fill_tag_text (SF_CART_INFO_512 * ci)
+{      static const char *lines [] =
+       {       "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.",
+               "Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.",
+               "Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.",
+               "Mauris aliquam,\nlectus interdum\ntincidunt luctus.",
+               "\n\n\n\n\n\n\n\n\n\n\n\n",
+               "In auctor lorem\nvel est euismod\ncondimentum.",
+               "\n\n\n\n\n\n\n\n\n\n\n\n",
+               "Ut vitae magna\nid dui placerat vehicula\nin id lectus.",
+               "\n\n\n\n\n\n\n\n\n\n\n\n",
+               "Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.",
+               "\n\n\n\n\n\n\n\n\n\n\n\n",
+               "Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.",
+               "Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl."
+       } ;
+       int k ;
+
+       ci->tag_text [0] = 0 ;
+
+       for (k = 0 ; strlen (ci->tag_text) < ci->tag_text_size - 1 ; k ++)
+               append_snprintf (ci->tag_text, ci->tag_text_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ;
+
+       return ;
+} /* fill_tag_text */
+
+void
+test_cart_var (void)
+{      SF_PRIVATE      sf_private, *psf ;
+       SF_CART_TIMER timer ;
+       int k ;
+
+       psf = &sf_private ;
+       memset (psf, 0, sizeof (sf_private)) ;
+
+       print_test_name ("Testing cart_var_set ") ;
+
+       for (k = 64 ; k < CART_MAX ; k++)
+       {
+               SF_CART_INFO_512 ci ;
+
+               memset (&ci, 0, sizeof (ci)) ;
+
+               memset (&timer, 0, sizeof (timer)) ;
+               memcpy (ci.post_timers, &timer, sizeof (timer)) ;
+
+               ci.tag_text_size = k ;
+               fill_tag_text (&ci) ;
+               ci.tag_text_size -- ;
+
+               cart_var_set (psf, (SF_CART_INFO*) &ci, sizeof (ci)) ;
+               } ;
+
+       if (psf->cart_16k != NULL)
+               free (psf->cart_16k) ;
+
+       puts ("ok") ;
+} /* test_cart_var */
index 34600b0..7e8c2ed 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -33,7 +33,7 @@
 ** This is a bit rough, but it is the nicest way to do it.
 */
 
-#define cmp_test(line,ival,tval,str) \
+#define cmp_test(line, ival, tval, str) \
        if (ival != tval) \
        {       printf (str, line, ival, tval) ; \
                exit (1) ; \
index 4931650..1d8cb7b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -224,6 +224,85 @@ test_endswap_int64_t (void)
 
 
 
+static void
+test_psf_put_be16 (void)
+{      const char *test = "AB" ;
+       uint8_t array [32] ;
+       int k ;
+
+       printf ("    %-40s : ", __func__) ;
+       fflush (stdout) ;
+
+       for (k = 0 ; k < 10 ; k++)
+       {       memset (array, 0, sizeof (array)) ;
+
+               psf_put_be16 (array, k, 0x4142) ;
+               if (memcmp (array + k, test, sizeof (int16_t)) != 0)
+               {       printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               if (psf_get_be16 (array, k) != 0x4142)
+               {       printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               } ;
+
+       puts ("ok") ;
+} /* test_psf_put_be16 */
+
+static void
+test_psf_put_be32 (void)
+{      const char *test = "0123" ;
+       uint8_t array [32] ;
+       int k ;
+
+       printf ("    %-40s : ", __func__) ;
+       fflush (stdout) ;
+
+       for (k = 0 ; k < 10 ; k++)
+       {       memset (array, 0, sizeof (array)) ;
+
+               psf_put_be32 (array, k, 0x30313233) ;
+               if (memcmp (array + k, test, sizeof (int32_t)) != 0)
+               {       printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               if (psf_get_be32 (array, k) != 0x30313233)
+               {       printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               } ;
+
+       puts ("ok") ;
+} /* test_psf_put_be32 */
+
+static void
+test_psf_put_be64 (void)
+{      const char *test = "01234567" ;
+       uint8_t array [32] ;
+       int k ;
+
+       printf ("    %-40s : ", __func__) ;
+       fflush (stdout) ;
+
+       for (k = 0 ; k < 10 ; k++)
+       {       memset (array, 0, sizeof (array)) ;
+
+               psf_put_be64 (array, k, 0x3031323334353637) ;
+               if (memcmp (array + k, test, sizeof (int64_t)) != 0)
+               {       printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               if (psf_get_be64 (array, k) != 0x3031323334353637)
+               {       printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               } ;
+
+       puts ("ok") ;
+} /* test_psf_put_be64 */
+
+
 void
 test_endswap (void)
 {
@@ -231,5 +310,11 @@ test_endswap (void)
        test_endswap_int () ;
        test_endswap_int64_t () ;
 
+
+       test_psf_put_be16 () ;
+       test_psf_put_be32 () ;
+       test_psf_put_be64 () ;
+
+
 } /* test_endswap */
 
index c817322..1d6ab1f 100644 (file)
@@ -2,19 +2,39 @@ autogen definitions test_endswap.tpl;
 
 int_type = {
        name            = short ;
-       value           = 0x3210 ;
+       value           = '0x3210' ;
        format          = FMT_SHORT ;
        } ;
 
 int_type = {
        name            = int ;
-       value           = 0x76543210 ;
+       value           = '0x76543210' ;
        format          = FMT_INT ;
        } ;
 
 int_type = {
        name            = int64_t ;
-       value           = "0x0807050540302010LL" ;
+       value           = '0x0807050540302010LL' ;
        format          = FMT_INT64 ;
        } ;
 
+int_size = {
+       name            = 16 ;
+       typename        = int16_t ;
+       value           = '0x4142' ;
+       strval          = "AB" ;
+       } ;
+
+int_size = {
+       name            = 32 ;
+       typename        = int32_t ;
+       value           = '0x30313233' ;
+       strval          = "0123" ;
+       } ;
+
+int_size = {
+       name            = 64 ;
+       typename        = int64_t ;
+       value           = '0x3031323334353637' ;
+       strval          = "01234567" ;
+       } ;
index ad7cee1..89b7d14 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -105,6 +105,34 @@ test_endswap_[+ (get "name") +] (void)
 [+ ENDFOR int_type
 +]
 
+[+ FOR int_size +]
+static void
+test_psf_put_be[+ (get "name") +] (void)
+{      const char *test = "[+ (get "strval") +]" ;
+       uint8_t array [32] ;
+       int k ;
+
+       printf ("    %-40s : ", __func__) ;
+       fflush (stdout) ;
+
+       for (k = 0 ; k < 10 ; k++)
+       {       memset (array, 0, sizeof (array)) ;
+
+               psf_put_be[+ (get "name") +] (array, k, [+ (get "value") +]) ;
+               if (memcmp (array + k, test, sizeof ([+ (get "typename") +])) != 0)
+               {       printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               if (psf_get_be[+ (get "name") +] (array, k) != [+ (get "value") +])
+               {       printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
+               } ;
+
+       puts ("ok") ;
+} /* test_psf_put_be[+ (get "name") +] */
+[+ ENDFOR int_size
++]
 
 void
 test_endswap (void)
@@ -113,5 +141,11 @@ test_endswap (void)
 +]     test_endswap_[+ (get "name") +] () ;
 [+ ENDFOR int_type
 +]
+
+[+ FOR int_size
++]     test_psf_put_be[+ (get "name") +] () ;
+[+ ENDFOR int_endsize
++]
+
 } /* test_endswap */
 
index 9d0b09d..0787989 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -48,7 +48,7 @@ test_float_convert (void)
                test = float32_le_read (bytes) ;
 
                if (fabs (data [k] - test) > 1e-20)
-               {       printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test ) ;
+               {       printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ;
                        exit (1) ;
                        } ;
 
@@ -85,7 +85,7 @@ test_double_convert (void)
                test = double64_le_read (bytes) ;
 
                if (fabs (data [k] - test) > 1e-20)
-               {       printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test ) ;
+               {       printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ;
                        exit (1) ;
                        } ;
 
index de9d45b..e1806a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 
 #include "test_main.h"
 
-#define        CMP_0_ARGS(line,err,fmt)        \
-       {       psf->logindex = 0 ;                     \
+#define        CMP_0_ARGS(line, err, fmt)      \
+       {       psf->parselog.indx = 0 ;                        \
                snprintf (buffer, sizeof (buffer), (fmt)) ;     \
                psf_log_printf (psf, (fmt)) ;                           \
-               err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;     \
+               err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ;  \
                }
 
-#define        CMP_2_ARGS(line,err,fmt,a)      \
-       {       psf->logindex = 0 ;                     \
+#define        CMP_2_ARGS(line, err, fmt, a)   \
+       {       psf->parselog.indx = 0 ;                                \
                snprintf (buffer, sizeof (buffer), (fmt), (a), (a)) ;   \
                psf_log_printf (psf, (fmt), (a), (a)) ;                                 \
-               err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;     \
+               err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ;  \
                }
 
-#define        CMP_4_ARGS(line,err,fmt,a)      \
-       {       psf->logindex = 0 ;                     \
+#define        CMP_4_ARGS(line, err, fmt, a)   \
+       {       psf->parselog.indx = 0 ;                                \
                snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a)) ; \
                psf_log_printf (psf, (fmt), (a), (a), (a), (a)) ;                               \
-               err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;     \
+               err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ;  \
                }
 
-#define        CMP_5_ARGS(line,err,fmt,a)      \
-       {       psf->logindex = 0 ;                     \
+#define        CMP_5_ARGS(line, err, fmt, a)   \
+       {       psf->parselog.indx = 0 ;                                \
                snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a)) ;    \
                psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a)) ;                                  \
-               err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;             \
+               err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ;          \
                }
 
-#define        CMP_6_ARGS(line,err,fmt,a)      \
-       {       psf->logindex = 0 ;                     \
+#define        CMP_6_ARGS(line, err, fmt, a)   \
+       {       psf->parselog.indx = 0 ;                                \
                snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a), (a)) ;       \
                psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a), (a)) ;                                     \
-               err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;                     \
+               err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ;                  \
                }
 
 static int
index 6692514..f51f7c9 100644 (file)
@@ -42,6 +42,7 @@ main (void)
 
        test_psf_strlcpy_crlf () ;
        test_broadcast_var () ;
+       test_cart_var () ;
 
        return 0 ;
 } /* main */
index 53b7311..6b2f28f 100644 (file)
@@ -37,3 +37,5 @@ void test_ima_oki_adpcm (void) ;
 
 void test_psf_strlcpy_crlf (void) ;
 void test_broadcast_var (void) ;
+
+void test_cart_var (void) ;
index 1bb1837..774ced1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2010-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -42,7 +42,7 @@ test_psf_strlcpy_crlf (void)
 
                dest [dest_len] = '\xea' ;
 
-               psf_strlcpy_crlf (dest, src, dest_len, sizeof (src)) ;
+               psf_strlcpy_crlf (dest, src, dest_len, sizeof (*src)) ;
 
                if (dest [dest_len] != '\xea')
                {       printf ("\n\nLine %d: buffer overrun for dest_len == %d\n\n", __LINE__, dest_len) ;
index fce1095..16525df 100644 (file)
--- a/src/txw.c
+++ b/src/txw.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -51,8 +51,8 @@ txw_open      (SF_PRIVATE *psf)
 
 #define TXW_DATA_OFFSET                32
 
-#define        TXW_LOOPED                      0x49
-#define        TXW_NO_LOOP                     0xC9
+#define        TXW_LOOPED                      0x49
+#define        TXW_NO_LOOP                     0xC9
 
 /*------------------------------------------------------------------------------
 ** Private static functions.
@@ -124,14 +124,15 @@ txw_open  (SF_PRIVATE *psf)
 
 static int
 txw_read_header        (SF_PRIVATE *psf)
-{      TXW_HEADER txwh ;
+{      BUF_UNION       ubuf ;
+       TXW_HEADER txwh ;
        const char      *strptr ;
 
        memset (&txwh, 0, sizeof (txwh)) ;
-       memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
-       psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, 16) ;
+       memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ;
+       psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, 16) ;
 
-       if (memcmp (psf->u.cbuf, "LM8953\0\0\0\0\0\0\0\0\0\0", 16) != 0)
+       if (memcmp (ubuf.cbuf, "LM8953\0\0\0\0\0\0\0\0\0\0", 16) != 0)
                return ERROR_666 ;
 
        psf_log_printf (psf, "Read only : Yamaha TX-16 Sampler (.txw)\nLM8953\n") ;
@@ -235,18 +236,19 @@ txw_read_header   (SF_PRIVATE *psf)
 
 static sf_count_t
 txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      unsigned char   *ucptr ;
+{      BUF_UNION               ubuf ;
+       unsigned char   *ucptr ;
        short                   sample ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
 
-       bufferlen = sizeof (psf->u.cbuf) / 3 ;
+       bufferlen = sizeof (ubuf.cbuf) / 3 ;
        bufferlen -= (bufferlen & 1) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+               count = psf_fread (ubuf.cbuf, 3, readcount, psf) ;
 
-               ucptr = psf->u.ucbuf ;
+               ucptr = ubuf.ucbuf ;
                for (k = 0 ; k < readcount ; k += 2)
                {       sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
                        ptr [total + k] = sample ;
@@ -264,18 +266,19 @@ txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      unsigned char   *ucptr ;
+{      BUF_UNION               ubuf ;
+       unsigned char   *ucptr ;
        short                   sample ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
 
-       bufferlen = sizeof (psf->u.cbuf) / 3 ;
+       bufferlen = sizeof (ubuf.cbuf) / 3 ;
        bufferlen -= (bufferlen & 1) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+               count = psf_fread (ubuf.cbuf, 3, readcount, psf) ;
 
-               ucptr = psf->u.ucbuf ;
+               ucptr = ubuf.ucbuf ;
                for (k = 0 ; k < readcount ; k += 2)
                {       sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
                        ptr [total + k] = sample << 16 ;
@@ -293,7 +296,8 @@ txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      unsigned char   *ucptr ;
+{      BUF_UNION               ubuf ;
+       unsigned char   *ucptr ;
        short                   sample ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
@@ -304,13 +308,13 @@ txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
        else
                normfact = 1.0 / 0x10 ;
 
-       bufferlen = sizeof (psf->u.cbuf) / 3 ;
+       bufferlen = sizeof (ubuf.cbuf) / 3 ;
        bufferlen -= (bufferlen & 1) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+               count = psf_fread (ubuf.cbuf, 3, readcount, psf) ;
 
-               ucptr = psf->u.ucbuf ;
+               ucptr = ubuf.ucbuf ;
                for (k = 0 ; k < readcount ; k += 2)
                {       sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
                        ptr [total + k] = normfact * sample ;
@@ -328,7 +332,8 @@ txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      unsigned char   *ucptr ;
+{      BUF_UNION               ubuf ;
+       unsigned char   *ucptr ;
        short                   sample ;
        int                             k, bufferlen, readcount, count ;
        sf_count_t              total = 0 ;
@@ -339,13 +344,13 @@ txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
        else
                normfact = 1.0 / 0x10 ;
 
-       bufferlen = sizeof (psf->u.cbuf) / 3 ;
+       bufferlen = sizeof (ubuf.cbuf) / 3 ;
        bufferlen -= (bufferlen & 1) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : len ;
-               count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+               count = psf_fread (ubuf.cbuf, 3, readcount, psf) ;
 
-               ucptr = psf->u.ucbuf ;
+               ucptr = ubuf.ucbuf ;
                for (k = 0 ; k < readcount ; k += 2)
                {       sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
                        ptr [total + k] = normfact * sample ;
index c6ff7b8..e50b4cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -787,7 +787,7 @@ unsigned char ulaw_encode [8193] =
        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
        0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-       0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00
+       0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
 } ;
 
 static inline void
@@ -799,7 +799,7 @@ ulaw2s_array (unsigned char *buffer, int count, short *ptr)
 static inline void
 ulaw2i_array (unsigned char *buffer, int count, int *ptr)
 {      while (--count >= 0)
-               ptr [count] = ulaw_decode [buffer [count]] << 16 ;
+               ptr [count] = ((uint32_t) ulaw_decode [buffer [count]]) << 16 ;
 } /* ulaw2i_array */
 
 static inline void
@@ -859,16 +859,17 @@ d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfa
 
 static sf_count_t
 ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               ulaw2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               ulaw2s_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -880,16 +881,17 @@ ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               ulaw2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               ulaw2i_array (ubuf.ucbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -901,19 +903,20 @@ ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               ulaw2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               ulaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -925,18 +928,19 @@ ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      int                     bufferlen, readcount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double  normfact ;
 
        normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
-               ulaw2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ;
+               ulaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -951,16 +955,17 @@ ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_write_s2ulaw      (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               s2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -972,16 +977,17 @@ ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_write_i2ulaw      (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               i2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -993,20 +999,21 @@ ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_write_f2ulaw      (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float   normfact ;
 
        /* Factor in a divide by 4. */
        normfact = (psf->norm_float == SF_TRUE) ? (0.25 * 0x7FFF) : 0.25 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               f2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -1018,20 +1025,21 @@ ulaw_write_f2ulaw       (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 ulaw_write_d2ulaw      (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      int                     bufferlen, writecount ;
+{      BUF_UNION       ubuf ;
+       int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double  normfact ;
 
        /* Factor in a divide by 4. */
        normfact = (psf->norm_double) ? (0.25 * 0x7FFF) : 0.25 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               d2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
-               writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+               d2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ;
+               writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
index 225ccbd..f961d2d 100644 (file)
@@ -2,8 +2,8 @@
 
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
 1 VERSIONINFO
-       FILEVERSION             1,0,25,0
-       PRODUCTVERSION  1,0,25,0
+       FILEVERSION             1,0,26,0
+       PRODUCTVERSION  1,0,26,0
        FILEOS                  VOS__WINDOWS32
        FILETYPE                VFT_DLL
        FILESUBTYPE             VFT2_UNKNOWN
@@ -15,13 +15,13 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
                BLOCK "040904e4"
                {
                        VALUE "FileDescription", "A library for reading and writing audio files."
-                       VALUE "FileVersion", "1.0.25.0\0"
-                       VALUE "Full Version", "1.0.25"
+                       VALUE "FileVersion", "1.0.26.0\0"
+                       VALUE "Full Version", "1.0.26"
                        VALUE "InternalName", "libsndfile"
-                       VALUE "LegalCopyright", "Copyright (C) 1999-2010, Licensed LGPL"
+                       VALUE "LegalCopyright", "Copyright (C) 1999-2012, Licensed LGPL"
                        VALUE "OriginalFilename", "libsndfile-1.dll"
                        VALUE "ProductName", "libsndfile-1 DLL"
-                       VALUE "ProductVersion", "1.0.25.0\0"
+                       VALUE "ProductVersion", "1.0.26.0\0"
                        VALUE "Language", "Language Neutral"
                }
        }
index 06f64c0..ed79b22 100644 (file)
@@ -18,7 +18,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
                        VALUE "FileVersion", "@CLEAN_VERSION@.0\0"
                        VALUE "Full Version", "@PACKAGE_VERSION@"
                        VALUE "InternalName", "libsndfile"
-                       VALUE "LegalCopyright", "Copyright (C) 1999-2010, Licensed LGPL"
+                       VALUE "LegalCopyright", "Copyright (C) 1999-2012, Licensed LGPL"
                        VALUE "OriginalFilename", "libsndfile-1.dll"
                        VALUE "ProductName", "libsndfile-1 DLL"
                        VALUE "ProductVersion", "@CLEAN_VERSION@.0\0"
index d13b033..8af40ee 100644 (file)
--- a/src/voc.c
+++ b/src/voc.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -199,7 +199,8 @@ voc_read_header     (SF_PRIVATE *psf)
        psf->endian = SF_ENDIAN_LITTLE ;
 
        while (1)
-       {       unsigned size ;
+       {       char header [256] ;
+               unsigned size ;
                short count ;
 
                block_type = 0 ;
@@ -211,10 +212,10 @@ voc_read_header   (SF_PRIVATE *psf)
 
                                        psf_log_printf (psf, " ASCII : %d\n", size) ;
 
-                                       if (size < sizeof (psf->header) - 1)
-                                       {       offset += psf_binheader_readf (psf, "b", psf->header, size) ;
-                                               psf->header [size] = 0 ;
-                                               psf_log_printf (psf, "  text : %s\n", psf->header) ;
+                                       if (size < sizeof (header) - 1)
+                                       {       offset += psf_binheader_readf (psf, "b", header, size) ;
+                                               header [size] = 0 ;
+                                               psf_log_printf (psf, "  text : %s\n", header) ;
                                                continue ;
                                                }
 
index 579a5d0..6db6618 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -174,6 +174,7 @@ vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 static sf_count_t
 vox_read_i     (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -182,13 +183,13 @@ vox_read_i        (SF_PRIVATE *psf, int *ptr, sf_count_t len)
                return 0 ;
        pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = vox_read_block (psf, pvox, sptr, readcount) ;
                for (k = 0 ; k < readcount ; k++)
-                       ptr [total + k] = ((int) sptr [k]) << 16 ;
+                       ptr [total + k] = arith_shift_left (sptr [k], 16) ;
                total += count ;
                len -= readcount ;
                if (count != readcount)
@@ -201,6 +202,7 @@ vox_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 static sf_count_t
 vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -212,8 +214,8 @@ vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = vox_read_block (psf, pvox, sptr, readcount) ;
@@ -231,6 +233,7 @@ vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 static sf_count_t
 vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, readcount, count ;
        sf_count_t      total = 0 ;
@@ -242,8 +245,8 @@ vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       readcount = (len >= bufferlen) ? bufferlen : (int) len ;
                count = vox_read_block (psf, pvox, sptr, readcount) ;
@@ -308,6 +311,7 @@ vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 static sf_count_t
 vox_write_i    (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -316,8 +320,8 @@ vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
                return 0 ;
        pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
@@ -335,6 +339,7 @@ vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 static sf_count_t
 vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -346,8 +351,8 @@ vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
@@ -365,6 +370,7 @@ vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 static sf_count_t
 vox_write_d    (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 {      IMA_OKI_ADPCM *pvox ;
+       BUF_UNION       ubuf ;
        short           *sptr ;
        int                     k, bufferlen, writecount, count ;
        sf_count_t      total = 0 ;
@@ -376,8 +382,8 @@ vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       sptr = psf->u.sbuf ;
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       sptr = ubuf.sbuf ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
        while (len > 0)
        {       writecount = (len >= bufferlen) ? bufferlen : (int) len ;
                for (k = 0 ; k < writecount ; k++)
index d561906..fc03825 100644 (file)
--- a/src/w64.c
+++ b/src/w64.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
 ** header.
 */
 
-#define MAKE_HASH16(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)   \
+#define MAKE_HASH16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf)    \
                        (       (x0)                    ^ ((x1) << 1)   ^ ((x2) << 2)   ^ ((x3) << 3) ^ \
                                ((x4) << 4)     ^ ((x5) << 5)   ^ ((x6) << 6)   ^ ((x7) << 7) ^ \
                                ((x8) << 8)     ^ ((x9) << 9)   ^ ((xa) << 10)  ^ ((xb) << 11) ^ \
                                ((xc) << 12)    ^ ((xd) << 13)  ^ ((xe) << 14)  ^ ((xf) << 15)  )
 
-#define MAKE_MARKER16(name,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)    \
+#define MAKE_MARKER16(name, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf)    \
                        static unsigned char name [16] = { (x0), (x1), (x2), (x3), (x4), (x5), \
                                (x6), (x7), (x8), (x9), (xa), (xb), (xc), (xd), (xe), (xf) }
 
@@ -151,12 +151,14 @@ w64_open  (SF_PRIVATE *psf)
                {       blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
                        framesperblock = -1 ;
 
-                       /* FIXME : This block must go */
-                       psf->filelength = SF_COUNT_MAX ;
+                       /*
+                       ** At this point we don't know the file length so set it stupidly high, but not
+                       ** so high that it triggers undefined behaviour whan something is added to it.
+                       */
+                       psf->filelength = SF_COUNT_MAX - 10000 ;
                        psf->datalength = psf->filelength ;
                        if (psf->sf.frames <= 0)
                                psf->sf.frames = (psf->blockwidth) ? psf->filelength / psf->blockwidth : psf->filelength ;
-                       /* EMXIF : This block must go */
                        } ;
 
                if ((error = w64_write_header (psf, SF_FALSE)))
@@ -239,40 +241,40 @@ w64_read_header   (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                        psf_binheader_readf (psf, "j", 8 - (psf->headindex & 0x7)) ;
 
                /* Generate hash of 16 byte marker. */
-               bytesread += psf_binheader_readf (psf, "h", &marker) ;
-               chunk_size = 0 ;
-
+               marker = chunk_size = 0 ;
+               bytesread = psf_binheader_readf (psf, "eh8", &marker, &chunk_size) ;
+               if (bytesread == 0)
+                       break ;
                switch (marker)
                {       case riff_HASH16 :
                                        if (parsestage)
                                                return SFE_W64_NO_RIFF ;
 
-                                       bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ;
-
                                        if (psf->filelength != chunk_size)
                                                psf_log_printf (psf, "riff : %D (should be %D)\n", chunk_size, psf->filelength) ;
                                        else
                                                psf_log_printf (psf, "riff : %D\n", chunk_size) ;
 
                                        parsestage |= HAVE_riff ;
+
+                                       bytesread += psf_binheader_readf (psf, "h", &marker) ;
+                                       if (marker == wave_HASH16)
+                                       {       if ((parsestage & HAVE_riff) != HAVE_riff)
+                                                       return SFE_W64_NO_WAVE ;
+                                               psf_log_printf (psf, "wave\n") ;
+                                               parsestage |= HAVE_wave ;
+                                       } ;
+                                       chunk_size = 0 ;
                                        break ;
 
                        case ACID_HASH16:
                                        psf_log_printf (psf, "Looks like an ACID file. Exiting.\n") ;
                                        return SFE_UNIMPLEMENTED ;
 
-                       case wave_HASH16 :
-                                       if ((parsestage & HAVE_riff) != HAVE_riff)
-                                               return SFE_W64_NO_WAVE ;
-                                       psf_log_printf (psf, "wave\n") ;
-                                       parsestage |= HAVE_wave ;
-                                       break ;
-
                        case fmt_HASH16 :
                                        if ((parsestage & (HAVE_riff | HAVE_wave)) != (HAVE_riff | HAVE_wave))
                                                return SFE_WAV_NO_FMT ;
 
-                                       bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, " fmt : %D\n", chunk_size) ;
 
                                        /* size of 16 byte marker and 8 byte chunk_size value. */
@@ -286,15 +288,17 @@ w64_read_header   (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        format          = wav_fmt->format ;
                                        parsestage |= HAVE_fmt ;
+                                       chunk_size = 0 ;
                                        break ;
 
                        case fact_HASH16:
                                        {       sf_count_t frames ;
 
-                                               psf_binheader_readf (psf, "e88", &chunk_size, &frames) ;
+                                               psf_binheader_readf (psf, "e8", &frames) ;
                                                psf_log_printf (psf, "   fact : %D\n     frames : %D\n",
                                                                                chunk_size, frames) ;
                                                } ;
+                                       chunk_size = 0 ;
                                        break ;
 
 
@@ -302,11 +306,8 @@ w64_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        if ((parsestage & (HAVE_riff | HAVE_wave | HAVE_fmt)) != (HAVE_riff | HAVE_wave | HAVE_fmt))
                                                return SFE_W64_NO_DATA ;
 
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
-
                                        psf->dataoffset = psf_ftell (psf) ;
-
-                                       psf->datalength = chunk_size - 24 ;
+                                       psf->datalength = SF_MIN (chunk_size - 24, psf->filelength - psf->dataoffset) ;
 
                                        if (chunk_size % 8)
                                                chunk_size += 8 - (chunk_size % 8) ;
@@ -320,66 +321,71 @@ w64_read_header   (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        /* Seek past data and continue reading header. */
                                        psf_fseek (psf, chunk_size, SEEK_CUR) ;
+                                       chunk_size = 0 ;
                                        break ;
 
                        case levl_HASH16 :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "levl : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        case list_HASH16 :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "list : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        case junk_HASH16 :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "junk : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        case bext_MARKER :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "bext : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        case MARKER_HASH16 :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "marker : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        case SUMLIST_HASH16 :
-                                       psf_binheader_readf (psf, "e8", &chunk_size) ;
                                        psf_log_printf (psf, "summary list : %D\n", chunk_size) ;
-                                       dword = chunk_size ;
-                                       psf_binheader_readf (psf, "j", dword - 24) ;
+                                       chunk_size -= 24 ;
                                        break ;
 
                        default :
-                                       psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+                                       psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %D. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
                                        done = SF_TRUE ;
                                        break ;
                        } ;     /* switch (dword) */
 
+               if (chunk_size >= psf->filelength)
+               {       psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ;
+                       break ;
+                       } ;
+
                if (psf->sf.seekable == 0 && (parsestage & HAVE_data))
                        break ;
 
                if (psf_ftell (psf) >= (psf->filelength - (2 * SIGNED_SIZEOF (dword))))
                        break ;
+
+               if (chunk_size > 0 && chunk_size < 0xffff0000)
+               {       dword = chunk_size ;
+                       psf_binheader_readf (psf, "j", dword - 24) ;
+                       } ;
                } ; /* while (1) */
 
        if (psf->dataoffset <= 0)
                return SFE_W64_NO_DATA ;
 
+       if (psf->sf.channels < 1)
+               return SFE_CHANNEL_COUNT_ZERO ;
+
+       if (psf->sf.channels >= SF_MAX_CHANNELS)
+               return SFE_CHANNEL_COUNT ;
+
        psf->endian = SF_ENDIAN_LITTLE ;                /* All W64 files are little endian. */
 
        if (psf_ftell (psf) != psf->dataoffset)
index f863096..1d396ad 100644 (file)
--- a/src/wav.c
+++ b/src/wav.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
 **
 ** This program is free software; you can redistribute it and/or modify
  * Macros to handle big/little endian issues.
  */
 
-#define RIFF_MARKER     (MAKE_MARKER ('R', 'I', 'F', 'F'))
-#define RIFX_MARKER     (MAKE_MARKER ('R', 'I', 'F', 'X'))
-#define WAVE_MARKER     (MAKE_MARKER ('W', 'A', 'V', 'E'))
-#define fmt_MARKER      (MAKE_MARKER ('f', 'm', 't', ' '))
-#define data_MARKER     (MAKE_MARKER ('d', 'a', 't', 'a'))
-#define fact_MARKER     (MAKE_MARKER ('f', 'a', 'c', 't'))
-#define PEAK_MARKER     (MAKE_MARKER ('P', 'E', 'A', 'K'))
-
-#define cue_MARKER      (MAKE_MARKER ('c', 'u', 'e', ' '))
-#define LIST_MARKER     (MAKE_MARKER ('L', 'I', 'S', 'T'))
-#define slnt_MARKER     (MAKE_MARKER ('s', 'l', 'n', 't'))
-#define wavl_MARKER     (MAKE_MARKER ('w', 'a', 'v', 'l'))
-#define INFO_MARKER     (MAKE_MARKER ('I', 'N', 'F', 'O'))
-#define plst_MARKER     (MAKE_MARKER ('p', 'l', 's', 't'))
-#define adtl_MARKER     (MAKE_MARKER ('a', 'd', 't', 'l'))
-#define labl_MARKER     (MAKE_MARKER ('l', 'a', 'b', 'l'))
-#define ltxt_MARKER     (MAKE_MARKER ('l', 't', 'x', 't'))
-#define note_MARKER     (MAKE_MARKER ('n', 'o', 't', 'e'))
-#define smpl_MARKER     (MAKE_MARKER ('s', 'm', 'p', 'l'))
-#define bext_MARKER     (MAKE_MARKER ('b', 'e', 'x', 't'))
-#define iXML_MARKER     (MAKE_MARKER ('i', 'X', 'M', 'L'))
-#define levl_MARKER     (MAKE_MARKER ('l', 'e', 'v', 'l'))
-#define MEXT_MARKER     (MAKE_MARKER ('M', 'E', 'X', 'T'))
-#define DISP_MARKER     (MAKE_MARKER ('D', 'I', 'S', 'P'))
-#define acid_MARKER     (MAKE_MARKER ('a', 'c', 'i', 'd'))
-#define strc_MARKER     (MAKE_MARKER ('s', 't', 'r', 'c'))
-#define PAD_MARKER      (MAKE_MARKER ('P', 'A', 'D', ' '))
-#define afsp_MARKER     (MAKE_MARKER ('a', 'f', 's', 'p'))
-#define clm_MARKER      (MAKE_MARKER ('c', 'l', 'm', ' '))
-#define elmo_MARKER     (MAKE_MARKER ('e', 'l', 'm', 'o'))
-#define cart_MARKER     (MAKE_MARKER ('c', 'a', 'r', 't'))
-#define FLLR_MARKER     (MAKE_MARKER ('F', 'L', 'L', 'R'))
-
-#define exif_MARKER     (MAKE_MARKER ('e', 'x', 'i', 'f'))
-#define ever_MARKER     (MAKE_MARKER ('e', 'v', 'e', 'r'))
-#define etim_MARKER     (MAKE_MARKER ('e', 't', 'i', 'm'))
-#define ecor_MARKER     (MAKE_MARKER ('e', 'c', 'o', 'r'))
-#define emdl_MARKER     (MAKE_MARKER ('e', 'm', 'd', 'l'))
-#define emnt_MARKER     (MAKE_MARKER ('e', 'm', 'n', 't'))
-#define erel_MARKER     (MAKE_MARKER ('e', 'r', 'e', 'l'))
-#define eucm_MARKER     (MAKE_MARKER ('e', 'u', 'c', 'm'))
-
-#define ISFT_MARKER     (MAKE_MARKER ('I', 'S', 'F', 'T'))
-#define ICRD_MARKER     (MAKE_MARKER ('I', 'C', 'R', 'D'))
-#define ICOP_MARKER     (MAKE_MARKER ('I', 'C', 'O', 'P'))
-#define IARL_MARKER     (MAKE_MARKER ('I', 'A', 'R', 'L'))
-#define IART_MARKER     (MAKE_MARKER ('I', 'A', 'R', 'T'))
-#define INAM_MARKER     (MAKE_MARKER ('I', 'N', 'A', 'M'))
-#define IENG_MARKER     (MAKE_MARKER ('I', 'E', 'N', 'G'))
-#define IGNR_MARKER     (MAKE_MARKER ('I', 'G', 'N', 'R'))
-#define ICOP_MARKER     (MAKE_MARKER ('I', 'C', 'O', 'P'))
-#define IPRD_MARKER     (MAKE_MARKER ('I', 'P', 'R', 'D'))
-#define ISRC_MARKER     (MAKE_MARKER ('I', 'S', 'R', 'C'))
-#define ISBJ_MARKER     (MAKE_MARKER ('I', 'S', 'B', 'J'))
-#define ICMT_MARKER     (MAKE_MARKER ('I', 'C', 'M', 'T'))
+#define RIFF_MARKER            (MAKE_MARKER ('R', 'I', 'F', 'F'))
+#define RIFX_MARKER            (MAKE_MARKER ('R', 'I', 'F', 'X'))
+#define WAVE_MARKER            (MAKE_MARKER ('W', 'A', 'V', 'E'))
+#define fmt_MARKER             (MAKE_MARKER ('f', 'm', 't', ' '))
+#define data_MARKER            (MAKE_MARKER ('d', 'a', 't', 'a'))
+#define fact_MARKER            (MAKE_MARKER ('f', 'a', 'c', 't'))
+#define PEAK_MARKER            (MAKE_MARKER ('P', 'E', 'A', 'K'))
+
+#define cue_MARKER             (MAKE_MARKER ('c', 'u', 'e', ' '))
+#define LIST_MARKER            (MAKE_MARKER ('L', 'I', 'S', 'T'))
+#define slnt_MARKER            (MAKE_MARKER ('s', 'l', 'n', 't'))
+#define wavl_MARKER            (MAKE_MARKER ('w', 'a', 'v', 'l'))
+#define INFO_MARKER            (MAKE_MARKER ('I', 'N', 'F', 'O'))
+#define plst_MARKER            (MAKE_MARKER ('p', 'l', 's', 't'))
+#define adtl_MARKER            (MAKE_MARKER ('a', 'd', 't', 'l'))
+#define labl_MARKER            (MAKE_MARKER ('l', 'a', 'b', 'l'))
+#define ltxt_MARKER            (MAKE_MARKER ('l', 't', 'x', 't'))
+#define note_MARKER            (MAKE_MARKER ('n', 'o', 't', 'e'))
+#define smpl_MARKER            (MAKE_MARKER ('s', 'm', 'p', 'l'))
+#define bext_MARKER            (MAKE_MARKER ('b', 'e', 'x', 't'))
+#define iXML_MARKER            (MAKE_MARKER ('i', 'X', 'M', 'L'))
+#define levl_MARKER            (MAKE_MARKER ('l', 'e', 'v', 'l'))
+#define MEXT_MARKER            (MAKE_MARKER ('M', 'E', 'X', 'T'))
+#define DISP_MARKER            (MAKE_MARKER ('D', 'I', 'S', 'P'))
+#define acid_MARKER            (MAKE_MARKER ('a', 'c', 'i', 'd'))
+#define strc_MARKER            (MAKE_MARKER ('s', 't', 'r', 'c'))
+#define PAD_MARKER             (MAKE_MARKER ('P', 'A', 'D', ' '))
+#define afsp_MARKER            (MAKE_MARKER ('a', 'f', 's', 'p'))
+#define clm_MARKER             (MAKE_MARKER ('c', 'l', 'm', ' '))
+#define elmo_MARKER            (MAKE_MARKER ('e', 'l', 'm', 'o'))
+#define cart_MARKER            (MAKE_MARKER ('c', 'a', 'r', 't'))
+#define FLLR_MARKER            (MAKE_MARKER ('F', 'L', 'L', 'R'))
+
+#define exif_MARKER            (MAKE_MARKER ('e', 'x', 'i', 'f'))
+#define ever_MARKER            (MAKE_MARKER ('e', 'v', 'e', 'r'))
+#define etim_MARKER            (MAKE_MARKER ('e', 't', 'i', 'm'))
+#define ecor_MARKER            (MAKE_MARKER ('e', 'c', 'o', 'r'))
+#define emdl_MARKER            (MAKE_MARKER ('e', 'm', 'd', 'l'))
+#define emnt_MARKER            (MAKE_MARKER ('e', 'm', 'n', 't'))
+#define erel_MARKER            (MAKE_MARKER ('e', 'r', 'e', 'l'))
+#define eucm_MARKER            (MAKE_MARKER ('e', 'u', 'c', 'm'))
+#define olym_MARKER            (MAKE_MARKER ('o', 'l', 'y', 'm'))
+#define minf_MARKER            (MAKE_MARKER ('m', 'i', 'n', 'f'))
+#define elm1_MARKER            (MAKE_MARKER ('e', 'l', 'm', '1'))
+#define regn_MARKER            (MAKE_MARKER ('r', 'e', 'g', 'n'))
+#define ovwf_MARKER            (MAKE_MARKER ('o', 'v', 'w', 'f'))
+#define umid_MARKER            (MAKE_MARKER ('u', 'm', 'i', 'd'))
+#define SyLp_MARKER            (MAKE_MARKER ('S', 'y', 'L', 'p'))
+#define Cr8r_MARKER            (MAKE_MARKER ('C', 'r', '8', 'r'))
+#define JUNK_MARKER            (MAKE_MARKER ('J', 'U', 'N', 'K'))
+#define PMX_MARKER             (MAKE_MARKER ('_', 'P', 'M', 'X'))
+#define inst_MARKER            (MAKE_MARKER ('i', 'n', 's', 't'))
+#define AFAn_MARKER            (MAKE_MARKER ('A', 'F', 'A', 'n'))
+
+
+#define ISFT_MARKER            (MAKE_MARKER ('I', 'S', 'F', 'T'))
+#define ICRD_MARKER            (MAKE_MARKER ('I', 'C', 'R', 'D'))
+#define ICOP_MARKER            (MAKE_MARKER ('I', 'C', 'O', 'P'))
+#define IARL_MARKER            (MAKE_MARKER ('I', 'A', 'R', 'L'))
+#define IART_MARKER            (MAKE_MARKER ('I', 'A', 'R', 'T'))
+#define INAM_MARKER            (MAKE_MARKER ('I', 'N', 'A', 'M'))
+#define IENG_MARKER            (MAKE_MARKER ('I', 'E', 'N', 'G'))
+#define IGNR_MARKER            (MAKE_MARKER ('I', 'G', 'N', 'R'))
+#define ICOP_MARKER            (MAKE_MARKER ('I', 'C', 'O', 'P'))
+#define IPRD_MARKER            (MAKE_MARKER ('I', 'P', 'R', 'D'))
+#define ISRC_MARKER            (MAKE_MARKER ('I', 'S', 'R', 'C'))
+#define ISBJ_MARKER            (MAKE_MARKER ('I', 'S', 'B', 'J'))
+#define ICMT_MARKER            (MAKE_MARKER ('I', 'C', 'M', 'T'))
+#define IAUT_MARKER            (MAKE_MARKER ('I', 'A', 'U', 'T'))
+#define ITRK_MARKER            (MAKE_MARKER ('I', 'T', 'R', 'K'))
 
 /* Weird WAVPACK marker which can show up at the start of the DATA section. */
 #define wvpk_MARKER (MAKE_MARKER ('w', 'v', 'p', 'k'))
 #define WAV_BEXT_MIN_CHUNK_SIZE                602
 #define WAV_BEXT_MAX_CHUNK_SIZE                (10 * 1024)
 
+#define WAV_CART_MIN_CHUNK_SIZE                2048
+#define WAV_CART_MAX_CHUNK_SIZE                0xffffffff
+
+
 enum
 {      HAVE_RIFF       = 0x01,
        HAVE_WAVE       = 0x02,
@@ -157,25 +176,30 @@ static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX =
 ** Private static functions.
 */
 
-static int     wav_read_header  (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ;
-static int     wav_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int     wav_read_header         (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ;
+static int     wav_write_header        (SF_PRIVATE *psf, int calc_length) ;
 
 static int     wav_write_tailer (SF_PRIVATE *psf) ;
 static void wav_write_strings (SF_PRIVATE *psf, int location) ;
 static int     wav_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
 static int     wav_close (SF_PRIVATE *psf) ;
 
-static int     wav_subchunk_parse       (SF_PRIVATE *psf, int chunk) ;
-static int     exif_subchunk_parse      (SF_PRIVATE *psf, unsigned int length) ;
-static int     wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen) ;
-static int     wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen) ;
+static int     wav_subchunk_parse      (SF_PRIVATE *psf, int chunk, uint32_t length) ;
+static int     exif_subchunk_parse     (SF_PRIVATE *psf, uint32_t length) ;
+static int     wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) ;
+static int     wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen) ;
+
+static int wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ;
+static SF_CHUNK_ITERATOR * wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ;
+static int wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
+static int wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ;
 
 /*------------------------------------------------------------------------------
 ** Public function.
 */
 
 int
-wav_open        (SF_PRIVATE *psf)
+wav_open       (SF_PRIVATE *psf)
 {      WAV_PRIVATE * wpriv ;
        int     format, subformat, error, blockalign = 0, framesperblock = 0 ;
 
@@ -184,11 +208,15 @@ wav_open   (SF_PRIVATE *psf)
        psf->container_data = wpriv ;
 
        wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
-       psf->str_flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
+       psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
 
        if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
        {       if ((error = wav_read_header (psf, &blockalign, &framesperblock)))
                        return error ;
+
+               psf->next_chunk_iterator = wav_next_chunk_iterator ;
+               psf->get_chunk_size = wav_get_chunk_size ;
+               psf->get_chunk_data = wav_get_chunk_data ;
                } ;
 
        subformat = SF_CODEC (psf->sf.format) ;
@@ -233,7 +261,8 @@ wav_open     (SF_PRIVATE *psf)
                        psf->peak_info->peak_loc = SF_PEAK_START ;
                        } ;
 
-               psf->write_header = wav_write_header ;
+               psf->write_header       = wav_write_header ;
+               psf->set_chunk          = wav_set_chunk ;
                } ;
 
        psf->container_close = wav_close ;
@@ -295,15 +324,15 @@ wav_open   (SF_PRIVATE *psf)
 */
 
 static int
-wav_read_header         (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
+wav_read_header        (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 {      WAV_PRIVATE     *wpriv ;
        WAV_FMT         *wav_fmt ;
        FACT_CHUNK      fact_chunk ;
-       unsigned        dword = 0, marker, RIFFsize = 0, done = 0 ;
+       uint32_t        marker, chunk_size = 0, RIFFsize = 0, done = 0, uk ;
        int                     parsestage = 0, error, format = 0 ;
-       char            *cptr ;
+       char            buffer [256] ;
 
-       if (psf->filelength > SF_PLATFORM_S64 (0xffffffff))
+       if (psf->is_pipe == 0 && psf->filelength > SF_PLATFORM_S64 (0xffffffff))
                psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ;
 
        if ((wpriv = psf->container_data) == NULL)
@@ -311,10 +340,27 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
        wav_fmt = &wpriv->wav_fmt ;
 
        /* Set position to start of file to begin reading header. */
-       psf_binheader_readf (psf, "p", 0) ;
+       psf_binheader_readf (psf, "pmj", 0, &marker, -4) ;
+       psf->headindex = 0 ;
+
+       /* RIFX signifies big-endian format for all header and data  to prevent
+       ** lots of code copying here, we'll set the psf->rwf_endian flag once here,
+       ** and never specify endian-ness for all other header ops/
+       */
+       psf->rwf_endian = (marker == RIFF_MARKER) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
 
        while (! done)
-       {       psf_binheader_readf (psf, "m", &marker) ;
+       {       size_t jump = chunk_size & 1 ;
+
+               marker = chunk_size = 0 ;
+               psf_binheader_readf (psf, "jm4", jump, &marker, &chunk_size) ;
+               if (marker == 0)
+               {       sf_count_t pos = psf_ftell (psf) ;
+                       psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ;
+                       break ;
+                       } ;
+
+               psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ;
 
                switch (marker)
                {       case RIFF_MARKER :
@@ -324,16 +370,7 @@ wav_read_header     (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        parsestage |= HAVE_RIFF ;
 
-                                       /* RIFX signifies big-endian format for all header and data
-                                       ** to prevent lots of code copying here, we'll set the psf->rwf_endian
-                                       ** flag once here, and never specify endian-ness for all other header ops
-                                       */
-                                       if (marker == RIFF_MARKER)
-                                               psf->rwf_endian = SF_ENDIAN_LITTLE ;
-                                       else
-                                               psf->rwf_endian = SF_ENDIAN_BIG ;
-
-                                       psf_binheader_readf (psf, "4", &RIFFsize) ;
+                                       RIFFsize = chunk_size ;
 
                                        if (psf->fileoffset > 0 && psf->filelength > RIFFsize + 8)
                                        {       /* Set file length. */
@@ -343,13 +380,13 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                                else
                                                        psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ;
                                                }
-                                       else if (psf->filelength < RIFFsize + 2 * SIGNED_SIZEOF (dword))
+                                       else if (psf->filelength < RIFFsize + 2 * SIGNED_SIZEOF (marker))
                                        {       if (marker == RIFF_MARKER)
-                                                       psf_log_printf (psf, "RIFF : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (dword)) ;
+                                                       psf_log_printf (psf, "RIFF : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ;
                                                else
-                                                       psf_log_printf (psf, "RIFX : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (dword)) ;
+                                                       psf_log_printf (psf, "RIFX : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ;
 
-                                               RIFFsize = dword ;
+                                               RIFFsize = psf->filelength - 2 * SIGNED_SIZEOF (RIFFsize) ;
                                                }
                                        else
                                        {       if (marker == RIFF_MARKER)
@@ -357,14 +394,13 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                                else
                                                        psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ;
                                        } ;
-                                       break ;
 
-                       case WAVE_MARKER :
-                                       if ((parsestage & HAVE_RIFF) != HAVE_RIFF)
+                                       psf_binheader_readf (psf, "m", &marker) ;
+                                       if (marker != WAVE_MARKER)
                                                return SFE_WAV_NO_WAVE ;
                                        parsestage |= HAVE_WAVE ;
-
                                        psf_log_printf (psf, "WAVE\n") ;
+                                       chunk_size = 0 ;
                                        break ;
 
                        case fmt_MARKER :
@@ -377,10 +413,9 @@ wav_read_header     (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        parsestage |= HAVE_fmt ;
 
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       psf_log_printf (psf, "fmt  : %d\n", dword) ;
+                                       psf_log_printf (psf, "fmt  : %d\n", chunk_size) ;
 
-                                       if ((error = wav_w64_read_fmt_chunk (psf, dword)))
+                                       if ((error = wav_w64_read_fmt_chunk (psf, chunk_size)))
                                                return error ;
 
                                        format = wav_fmt->format ;
@@ -395,13 +430,14 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        parsestage |= HAVE_data ;
 
-                                       psf_binheader_readf (psf, "4", &dword) ;
+                                       psf->datalength = chunk_size ;
+                                       if (psf->datalength & 1)
+                                               psf_log_printf (psf, "*** 'data' chunk should be an even number of bytes in length.\n") ;
 
-                                       psf->datalength = dword ;
                                        psf->dataoffset = psf_ftell (psf) ;
 
                                        if (psf->dataoffset > 0)
-                                       {       if (dword == 0 && RIFFsize == 8 && psf->filelength > 44)
+                                       {       if (chunk_size == 0 && RIFFsize == 8 && psf->filelength > 44)
                                                {       psf_log_printf (psf, "*** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ;
                                                        psf->datalength = psf->filelength - psf->dataoffset ;
                                                        } ;
@@ -417,10 +453,8 @@ wav_read_header     (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                                if (psf->datalength + psf->dataoffset < psf->filelength)
                                                        psf->dataend = psf->datalength + psf->dataoffset ;
 
-                                               if (format == WAVE_FORMAT_MS_ADPCM && psf->datalength % 2)
-                                               {       psf->datalength ++ ;
-                                                       psf_log_printf (psf, "*** Data length odd. Increasing it by 1.\n") ;
-                                                       } ;
+                                               psf->datalength += chunk_size & 1 ;
+                                               chunk_size = 0 ;
                                                } ;
 
                                        if (! psf->sf.seekable || psf->dataoffset < 0)
@@ -442,15 +476,15 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        if ((parsestage & HAVE_fmt) != HAVE_fmt)
                                                psf_log_printf (psf, "*** Should have 'fmt ' chunk before 'fact'\n") ;
 
-                                       psf_binheader_readf (psf, "44", &dword, & (fact_chunk.frames)) ;
+                                       psf_binheader_readf (psf, "4", & (fact_chunk.frames)) ;
 
-                                       if (dword > SIGNED_SIZEOF (fact_chunk))
-                                               psf_binheader_readf (psf, "j", (int) (dword - SIGNED_SIZEOF (fact_chunk))) ;
+                                       if (chunk_size > SIGNED_SIZEOF (fact_chunk))
+                                               psf_binheader_readf (psf, "j", (int) (chunk_size - SIGNED_SIZEOF (fact_chunk))) ;
 
-                                       if (dword)
-                                               psf_log_printf (psf, "%M : %d\n", marker, dword) ;
+                                       if (chunk_size)
+                                               psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
                                        else
-                                               psf_log_printf (psf, "%M : %d (should not be zero)\n", marker, dword) ;
+                                               psf_log_printf (psf, "%M : %u (should not be zero)\n", marker, chunk_size) ;
 
                                        psf_log_printf (psf, "  frames  : %d\n", fact_chunk.frames) ;
                                        break ;
@@ -461,11 +495,9 @@ wav_read_header     (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
 
                                        parsestage |= HAVE_PEAK ;
 
-                                       psf_binheader_readf (psf, "4", &dword) ;
-
-                                       psf_log_printf (psf, "%M : %d\n", marker, dword) ;
-                                       if (dword != WAV_PEAK_CHUNK_SIZE (psf->sf.channels))
-                                       {       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                       if (chunk_size != WAV_PEAK_CHUNK_SIZE (psf->sf.channels))
+                                       {       psf_binheader_readf (psf, "j", chunk_size) ;
                                                psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels (%d).\n", psf->sf.channels) ;
                                                return SFE_WAV_BAD_PEAK ;
                                                } ;
@@ -484,19 +516,18 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        psf_log_printf (psf, "  time stamp : %d\n", psf->peak_info->timestamp) ;
                                        psf_log_printf (psf, "    Ch   Position       Value\n") ;
 
-                                       cptr = psf->u.cbuf ;
-                                       for (dword = 0 ; dword < (unsigned) psf->sf.channels ; dword++)
+                                       for (uk = 0 ; uk < (uint32_t) psf->sf.channels ; uk++)
                                        {       float value ;
-                                               unsigned int position ;
+                                               uint32_t position ;
 
                                                psf_binheader_readf (psf, "f4", &value, &position) ;
-                                               psf->peak_info->peaks [dword].value = value ;
-                                               psf->peak_info->peaks [dword].position = position ;
+                                               psf->peak_info->peaks [uk].value = value ;
+                                               psf->peak_info->peaks [uk].position = position ;
 
-                                               snprintf (cptr, sizeof (psf->u.cbuf), "    %2d   %-12" PRId64 "   %g\n",
-                                                               dword, psf->peak_info->peaks [dword].position, psf->peak_info->peaks [dword].value) ;
-                                               cptr [sizeof (psf->u.cbuf) - 1] = 0 ;
-                                               psf_log_printf (psf, "%s", cptr) ;
+                                               snprintf (buffer, sizeof (buffer), "    %2d   %-12" PRId64 "   %g\n",
+                                                               uk, psf->peak_info->peaks [uk].position, psf->peak_info->peaks [uk].value) ;
+                                               buffer [sizeof (buffer) - 1] = 0 ;
+                                               psf_log_printf (psf, "%s", buffer) ;
                                                } ;
 
                                        psf->peak_info->peak_loc = ((parsestage & HAVE_data) == 0) ? SF_PEAK_START : SF_PEAK_END ;
@@ -505,35 +536,37 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                        case cue_MARKER :
                                        parsestage |= HAVE_other ;
 
-                                       {       unsigned bytesread, cue_count ;
+                                       {       uint32_t thisread, bytesread, cue_count ;
                                                int id, position, chunk_id, chunk_start, block_start, offset ;
 
-                                               bytesread = psf_binheader_readf (psf, "44", &dword, &cue_count) ;
-                                               bytesread -= 4 ; /* Remove bytes for first dword. */
-                                               psf_log_printf (psf, "%M : %u\n", marker, dword) ;
+                                               bytesread = psf_binheader_readf (psf, "4", &cue_count) ;
+                                               psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
 
                                                if (cue_count > 10)
-                                               {       psf_log_printf (psf, "  Count : %d (skipping)\n", cue_count) ;
-                                                       psf_binheader_readf (psf, "j", cue_count * 24) ;
+                                               {       psf_log_printf (psf, "  Count : %u (skipping)\n", cue_count) ;
+                                                       psf_binheader_readf (psf, "j", (cue_count > 20 ? 20 : cue_count) * 24) ;
                                                        break ;
                                                        } ;
 
                                                psf_log_printf (psf, "  Count : %d\n", cue_count) ;
 
                                                while (cue_count)
-                                               {       bytesread += psf_binheader_readf (psf, "444444", &id, &position,
-                                                                       &chunk_id, &chunk_start, &block_start, &offset) ;
-                                                       psf_log_printf (psf, "   Cue ID : %2d"
-                                                                                                "  Pos : %5u  Chunk : %M"
-                                                                                                "  Chk Start : %d  Blk Start : %d"
-                                                                                                "  Offset : %5d\n",
+                                               {
+                                                       if ((thisread = psf_binheader_readf (psf, "444444", &id, &position, &chunk_id, &chunk_start, &block_start, &offset)) == 0)
+                                                               break ;
+                                                       bytesread += thisread ;
+
+                                                       psf_log_printf (psf,    "   Cue ID : %2d"
+                                                                                                       "  Pos : %5u  Chunk : %M"
+                                                                                                       "  Chk Start : %d  Blk Start : %d"
+                                                                                                       "  Offset : %5d\n",
                                                                        id, position, chunk_id, chunk_start, block_start, offset) ;
                                                        cue_count -- ;
                                                        } ;
 
-                                               if (bytesread != dword)
-                                               {       psf_log_printf (psf, "**** Chunk size weirdness (%d != %d)\n", dword, bytesread) ;
-                                                       psf_binheader_readf (psf, "j", dword - bytesread) ;
+                                               if (bytesread != chunk_size)
+                                               {       psf_log_printf (psf, "**** Chunk size weirdness (%d != %d)\n", chunk_size, bytesread) ;
+                                                       psf_binheader_readf (psf, "j", chunk_size - bytesread) ;
                                                        } ;
                                                } ;
                                        break ;
@@ -541,20 +574,18 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                        case smpl_MARKER :
                                        parsestage |= HAVE_other ;
 
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       psf_log_printf (psf, "smpl : %u\n", dword) ;
+                                       psf_log_printf (psf, "smpl : %u\n", chunk_size) ;
 
-                                       if ((error = wav_read_smpl_chunk (psf, dword)))
+                                       if ((error = wav_read_smpl_chunk (psf, chunk_size)))
                                                return error ;
                                        break ;
 
                        case acid_MARKER :
                                        parsestage |= HAVE_other ;
 
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       psf_log_printf (psf, "acid : %u\n", dword) ;
+                                       psf_log_printf (psf, "acid : %u\n", chunk_size) ;
 
-                                       if ((error = wav_read_acid_chunk (psf, dword)))
+                                       if ((error = wav_read_acid_chunk (psf, chunk_size)))
                                                return error ;
                                        break ;
 
@@ -562,7 +593,7 @@ wav_read_header      (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                        case LIST_MARKER :
                                        parsestage |= HAVE_other ;
 
-                                       if ((error = wav_subchunk_parse (psf, marker)) != 0)
+                                       if ((error = wav_subchunk_parse (psf, marker, chunk_size)) != 0)
                                                return error ;
                                        break ;
 
@@ -571,8 +602,7 @@ wav_read_header      (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        The 'bext' chunk can actually be updated, so don't need to set this.
                                        parsestage |= HAVE_other ;
                                        */
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       if ((error = wav_read_bext_chunk (psf, dword)))
+                                       if ((error = wav_read_bext_chunk (psf, chunk_size)))
                                                return error ;
                                        break ;
 
@@ -581,10 +611,13 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                                        We can eat into a 'PAD ' chunk if we need to.
                                        parsestage |= HAVE_other ;
                                        */
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       psf_log_printf (psf, "%M : %u\n", marker, dword) ;
-                                       dword += (dword & 1) ;
-                                       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                       psf_binheader_readf (psf, "j", chunk_size) ;
+                                       break ;
+
+                       case cart_MARKER:
+                                       if ((error = wav_read_cart_chunk (psf, chunk_size)))
+                                               return error ;
                                        break ;
 
                        case iXML_MARKER : /* See http://en.wikipedia.org/wiki/IXML */
@@ -592,42 +625,60 @@ wav_read_header    (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
                        case afsp_MARKER :
                        case clm_MARKER :
                        case elmo_MARKER :
-                       case cart_MARKER :
                        case levl_MARKER :
                        case plst_MARKER :
+                       case minf_MARKER :
+                       case elm1_MARKER :
+                       case regn_MARKER :
+                       case ovwf_MARKER :
+                       case inst_MARKER :
+                       case AFAn_MARKER :
+                       case umid_MARKER :
+                       case SyLp_MARKER :
+                       case Cr8r_MARKER :
+                       case JUNK_MARKER :
+                       case PMX_MARKER :
                        case DISP_MARKER :
                        case MEXT_MARKER :
                        case FLLR_MARKER :
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       psf_log_printf (psf, "%M : %u\n", marker, dword) ;
-                                       dword += (dword & 1) ;
-                                       psf_binheader_readf (psf, "j", dword) ;
+                                       psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ;
+                                       psf_binheader_readf (psf, "j", chunk_size) ;
                                        break ;
 
                        default :
+                                       if (chunk_size >= 0xffff0000)
+                                       {       done = SF_TRUE ;
+                                               psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
+                                               break ;
+                                               } ;
+
                                        if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
                                                && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
-                                       {       psf_binheader_readf (psf, "4", &dword) ;
-                                               psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, dword) ;
-                                               psf_binheader_readf (psf, "j", dword) ;
+                                       {       psf_log_printf (psf, "*** %M : %u (unknown marker)\n", marker, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_size) ;
                                                break ;
                                                } ;
                                        if (psf_ftell (psf) & 0x03)
-                                       {       psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+                                       {       psf_log_printf (psf, "  Unknown chunk marker at position %D. Resynching.\n", psf_ftell (psf) - 8) ;
                                                psf_binheader_readf (psf, "j", -3) ;
                                                /* File is too messed up so we prevent editing in RDWR mode here. */
                                                parsestage |= HAVE_other ;
                                                break ;
                                                } ;
-                                       psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 4) ;
+                                       psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 8) ;
                                        done = SF_TRUE ;
                                        break ;
-                       } ;     /* switch (dword) */
+                       } ;     /* switch (marker) */
+
+               if (chunk_size >= psf->filelength)
+               {       psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ;
+                       break ;
+                       } ;
 
                if (! psf->sf.seekable && (parsestage & HAVE_data))
                        break ;
 
-               if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (dword))
+               if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size))
                {       psf_log_printf (psf, "End\n") ;
                        break ;
                        } ;
@@ -636,6 +687,15 @@ wav_read_header     (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
        if (psf->dataoffset <= 0)
                return SFE_WAV_NO_DATA ;
 
+       if (psf->sf.channels < 1)
+               return SFE_CHANNEL_COUNT_ZERO ;
+
+       if (psf->sf.channels >= SF_MAX_CHANNELS)
+               return SFE_CHANNEL_COUNT ;
+
+       if (format != WAVE_FORMAT_PCM && (parsestage & HAVE_fact) == 0)
+               psf_log_printf (psf, "**** All non-PCM format files should have a 'fact' chunk.\n") ;
+
        /* WAVs can be little or big endian */
        psf->endian = psf->rwf_endian ;
 
@@ -882,7 +942,7 @@ wav_write_fmt_chunk (SF_PRIVATE *psf)
 static int
 wavex_write_fmt_chunk (SF_PRIVATE *psf)
 {      WAV_PRIVATE     *wpriv ;
-       int subformat, fmt_size, add_fact_chunk = 0 ;
+       int subformat, fmt_size ;
 
        if ((wpriv = psf->container_data) == NULL)
                return SFE_INTERNAL ;
@@ -975,24 +1035,20 @@ wavex_write_fmt_chunk (SF_PRIVATE *psf)
                case SF_FORMAT_DOUBLE :
                        wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ?
                                                &MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ;
-                       add_fact_chunk = SF_TRUE ;
                        break ;
 
                case SF_FORMAT_ULAW :
                        wavex_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ;
-                       add_fact_chunk = SF_TRUE ;
                        break ;
 
                case SF_FORMAT_ALAW :
                        wavex_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ;
-                       add_fact_chunk = SF_TRUE ;
                        break ;
 
 #if 0
                /* This is dead code due to return in previous switch statement. */
                case SF_FORMAT_MS_ADPCM : /* todo, GUID exists */
                        wavex_write_guid (psf, &MSGUID_SUBTYPE_MS_ADPCM) ;
-                       add_fact_chunk = SF_TRUE ;
                        break ;
                        return SFE_UNIMPLEMENTED ;
 #endif
@@ -1000,8 +1056,7 @@ wavex_write_fmt_chunk (SF_PRIVATE *psf)
                default : return SFE_UNIMPLEMENTED ;
                } ;
 
-       if (add_fact_chunk)
-               psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ;
+       psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ;
 
        return 0 ;
 } /* wavex_write_fmt_chunk */
@@ -1010,6 +1065,7 @@ wavex_write_fmt_chunk (SF_PRIVATE *psf)
 static int
 wav_write_header (SF_PRIVATE *psf, int calc_length)
 {      sf_count_t      current ;
+       uint32_t        uk ;
        int             k, error, has_data = SF_FALSE ;
 
        current = psf_ftell (psf) ;
@@ -1024,9 +1080,8 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
 
                if (psf->dataend)
                        psf->datalength -= psf->filelength - psf->dataend ;
-
-               if (psf->bytewidth > 0)
-                       psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+               else if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE)
+                       psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ;
                } ;
 
        /* Reset the current header length to zero. */
@@ -1067,7 +1122,7 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
                } ;
 
        /* The LIST/INFO chunk. */
-       if (psf->str_flags & SF_STR_LOCATE_START)
+       if (psf->strings.flags & SF_STR_LOCATE_START)
                wav_write_strings (psf, SF_STR_LOCATE_START) ;
 
        if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
@@ -1080,6 +1135,9 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
        if (psf->broadcast_16k != NULL)
                wav_write_bext_chunk (psf) ;
 
+       if (psf->cart_16k != NULL)
+               wav_write_cart_chunk (psf) ;
+
        if (psf->instrument != NULL)
        {       int             tmp ;
                double  dtune = (double) (0x40000000) / 25.0 ;
@@ -1088,7 +1146,7 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
                psf_binheader_writef (psf, "44", 0, 0) ; /* Manufacturer zero is everyone */
                tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */
                psf_binheader_writef (psf, "44", tmp, psf->instrument->basenote) ;
-               tmp = (unsigned int) (psf->instrument->detune * dtune + 0.5) ;
+               tmp = (uint32_t) (psf->instrument->detune * dtune + 0.5) ;
                psf_binheader_writef (psf, "4", tmp) ;
                psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */
                psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ;
@@ -1097,7 +1155,7 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
                {       int type ;
 
                        type = psf->instrument->loops [tmp].mode ;
-                       type = (type == SF_LOOP_FORWARD ? 0 : type==SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
+                       type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
 
                        psf_binheader_writef (psf, "44", tmp, type) ;
                        psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end - 1) ;
@@ -1105,6 +1163,10 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
                        } ;
                } ;
 
+       /* Write custom headers. */
+       for (uk = 0 ; uk < psf->wchunks.used ; uk++)
+               psf_binheader_writef (psf, "m4b", (int) psf->wchunks.chunks [uk].mark32, psf->wchunks.chunks [uk].len, psf->wchunks.chunks [uk].data, make_size_t (psf->wchunks.chunks [uk].len)) ;
+
        if (psf->headindex + 16 < psf->dataoffset)
        {       /* Add PAD data if necessary. */
                k = psf->dataoffset - (psf->headindex + 16) ;
@@ -1140,11 +1202,19 @@ wav_write_tailer (SF_PRIVATE *psf)
        psf->header [0] = 0 ;
        psf->headindex = 0 ;
 
+       if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE)
+       {       psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ;
+               psf->dataend = psf->dataoffset + psf->datalength ;
+               } ;
+
        if (psf->dataend > 0)
                psf_fseek (psf, psf->dataend, SEEK_SET) ;
        else
                psf->dataend = psf_fseek (psf, 0, SEEK_END) ;
 
+       if (psf->dataend & 1)
+               psf_binheader_writef (psf, "z", 1) ;
+
        /* Add a PEAK chunk if requested. */
        if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END)
        {       psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
@@ -1153,7 +1223,7 @@ wav_write_tailer (SF_PRIVATE *psf)
                        psf_binheader_writef (psf, "f4", psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
                } ;
 
-       if (psf->str_flags & SF_STR_LOCATE_END)
+       if (psf->strings.flags & SF_STR_LOCATE_END)
                wav_write_strings (psf, SF_STR_LOCATE_END) ;
 
        /* Write the tailer. */
@@ -1175,38 +1245,46 @@ wav_write_strings (SF_PRIVATE *psf, int location)
        psf_binheader_writef (psf, "m4m", LIST_MARKER, 0xBADBAD, INFO_MARKER) ;
 
        for (k = 0 ; k < SF_MAX_STRINGS ; k++)
-       {       if (psf->strings [k].type == 0)
+       {       if (psf->strings.data [k].type == 0)
                        break ;
-               if (psf->strings [k].type < 0 || psf->strings [k].flags != location)
+               if (psf->strings.data [k].type < 0 || psf->strings.data [k].flags != location)
                        continue ;
 
-               switch (psf->strings [k].type)
+               switch (psf->strings.data [k].type)
                {       case SF_STR_SOFTWARE :
-                               psf_binheader_writef (psf, "ms", ISFT_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", ISFT_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_TITLE :
-                               psf_binheader_writef (psf, "ms", INAM_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", INAM_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_COPYRIGHT :
-                               psf_binheader_writef (psf, "ms", ICOP_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", ICOP_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_ARTIST :
-                               psf_binheader_writef (psf, "ms", IART_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", IART_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_COMMENT :
-                               psf_binheader_writef (psf, "ms", ICMT_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", ICMT_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_DATE :
-                               psf_binheader_writef (psf, "ms", ICRD_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", ICRD_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        case SF_STR_GENRE :
-                               psf_binheader_writef (psf, "ms", IGNR_MARKER, psf->strings [k].str) ;
+                               psf_binheader_writef (psf, "ms", IGNR_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
+                               break ;
+
+                       case SF_STR_ALBUM :
+                               psf_binheader_writef (psf, "ms", IPRD_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
+                               break ;
+
+                       case SF_STR_TRACKNUMBER :
+                               psf_binheader_writef (psf, "ms", ITRK_MARKER, psf->strings.storage + psf->strings.data [k].offset) ;
                                break ;
 
                        default :
@@ -1281,45 +1359,54 @@ wav_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize)
 } /* wav_command */
 
 static int
-wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
+wav_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t chunk_length)
 {      sf_count_t      current_pos ;
-       char            *cptr ;
-       unsigned        dword, bytesread, length ;
+       char            buffer [512] ;
+       uint32_t        chunk_size, bytesread ;
 
-       current_pos = psf_fseek (psf, 0, SEEK_CUR) ;
+       current_pos = psf_fseek (psf, 0, SEEK_CUR) - 4 ;
 
-       bytesread = psf_binheader_readf (psf, "4", &length) ;
+       bytesread = sizeof (chunk_length) ;
 
-       if (length <= 8)
+       if (chunk_length <= 8)
        {       /* This case is for broken files generated by PEAK. */
-               psf_log_printf (psf, "%M : %d (weird length)\n", chunk, length) ;
-               psf_binheader_readf (psf, "mj", &chunk, length - 4) ;
+               psf_log_printf (psf, "%M : %u (weird length)\n", chunk, chunk_length) ;
+               psf_binheader_readf (psf, "mj", &chunk, chunk_length - 4) ;
                psf_log_printf (psf, "  %M\n", chunk) ;
                return 0 ;
                } ;
 
-       if (psf->headindex + length > SIGNED_SIZEOF (psf->header))
-       {       psf_log_printf (psf, "%M : %d (too long)\n", chunk, length) ;
-               psf_binheader_readf (psf, "j", length) ;
+       if (psf->headindex + chunk_length > SIGNED_SIZEOF (psf->header))
+       {       psf_log_printf (psf, "%M : %u (too long)\n", chunk, chunk_length) ;
+               psf_binheader_readf (psf, "j", chunk_length) ;
                return 0 ;
                } ;
 
-       if (current_pos + length > psf->filelength)
-       {       psf_log_printf (psf, "%M : %d (should be %d)\n", chunk, length, (int) (psf->filelength - current_pos)) ;
-               length = psf->filelength - current_pos ;
+       if (current_pos + chunk_length > psf->filelength)
+       {       psf_log_printf (psf, "%M : %u (should be %d)\n", chunk, chunk_length, (int) (psf->filelength - current_pos)) ;
+               chunk_length = psf->filelength - current_pos ;
                }
        else
-               psf_log_printf (psf, "%M : %d\n", chunk, length) ;
+               psf_log_printf (psf, "%M : %u\n", chunk, chunk_length) ;
 
-       while (bytesread < length)
-       {       bytesread += psf_binheader_readf (psf, "m", &chunk) ;
+       while (bytesread < chunk_length)
+       {       uint32_t thisread ;
+
+               if ((thisread = psf_binheader_readf (psf, "m", &chunk)) == 0)
+                       break ;
+               bytesread += thisread ;
 
                switch (chunk)
                {       case adtl_MARKER :
                        case INFO_MARKER :
-                                       /* These markers don't contain anything. */
+                                       /* These markers don't contain anything, not even a chunk lebgth. */
                                        psf_log_printf (psf, "  %M\n", chunk) ;
-                                       break ;
+                                       continue ;
+
+                       case exif_MARKER :
+                                       psf_log_printf (psf, "  %M\n", chunk) ;
+                                       bytesread += exif_subchunk_parse (psf, chunk_length - bytesread) ;
+                                       continue ;
 
                        case data_MARKER :
                                        psf_log_printf (psf, "  %M inside a LIST block??? Backing out.\n", chunk) ;
@@ -1327,7 +1414,23 @@ wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
                                        psf_binheader_readf (psf, "j", -4) ;
                                        return 0 ;
 
-                       case ISFT_MARKER :
+                       case 0 :
+                                       /*
+                                       **      Four zero bytes where a marker was expected. Assume this means
+                                       **      the rest of the chunk is garbage.
+                                       */
+                                       psf_log_printf (psf, "    *** Found weird-ass zero marker. Jumping to end of chunk.\n") ;
+                                       if (bytesread < chunk_length)
+                                               bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread + 4) ;
+                                       psf_log_printf (psf, "    *** Offset is now : 0x%X\n", psf_fseek (psf, 0, SEEK_CUR)) ;
+                                       return 0 ;
+
+                       default :
+                                       break ;
+                       } ;
+
+               switch (chunk)
+               {       case ISFT_MARKER :
                        case ICOP_MARKER :
                        case IARL_MARKER :
                        case IART_MARKER :
@@ -1339,38 +1442,36 @@ wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
                        case IPRD_MARKER :
                        case ISBJ_MARKER :
                        case ISRC_MARKER :
-                                       bytesread += psf_binheader_readf (psf, "4", &dword) ;
-                                       dword += (dword & 1) ;
-                                       if (dword >= SIGNED_SIZEOF (psf->u.cbuf))
-                                       {       psf_log_printf (psf, "  *** %M : %d (too big)\n", chunk, dword) ;
-                                               psf_binheader_readf (psf, "j", dword) ;
-                                               break ;
+                       case IAUT_MARKER :
+                       case ITRK_MARKER :
+                                       bytesread += psf_binheader_readf (psf, "4", &chunk_size) ;
+                                       chunk_size += (chunk_size & 1) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length)
+                                       {       psf_log_printf (psf, "  *** %M : %u (too big)\n", chunk, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_length) ;
+                                               return 0 ;
                                                } ;
 
-                                       cptr = psf->u.cbuf ;
-                                       psf_binheader_readf (psf, "b", cptr, dword) ;
-                                       bytesread += dword ;
-                                       cptr [dword] = 0 ;
-                                       psf_log_printf (psf, "    %M : %s\n", chunk, cptr) ;
+                                       bytesread += psf_binheader_readf (psf, "b", buffer, chunk_size) ;
+                                       buffer [chunk_size] = 0 ;
+                                       psf_log_printf (psf, "    %M : %s\n", chunk, buffer) ;
                                        break ;
 
                        case labl_MARKER :
                                        {       int mark_id ;
 
-                                               bytesread += psf_binheader_readf (psf, "44", &dword, &mark_id) ;
-                                               dword -= 4 ;
-                                               dword += (dword & 1) ;
-                                               if (dword < 1 || dword >= SIGNED_SIZEOF (psf->u.cbuf))
-                                               {       psf_log_printf (psf, "  *** %M : %d (too big)\n", chunk, dword) ;
-                                                       psf_binheader_readf (psf, "j", dword) ;
+                                               bytesread += psf_binheader_readf (psf, "44", &chunk_size, &mark_id) ;
+                                               chunk_size -= 4 ;
+                                               chunk_size += (chunk_size & 1) ;
+                                               if (chunk_size < 1 || chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length)
+                                               {       psf_log_printf (psf, "  *** %M : %u (too big)\n", chunk, chunk_size) ;
+                                                       psf_binheader_readf (psf, "j", chunk_length) ;
                                                        break ;
                                                        } ;
 
-                                               cptr = psf->u.cbuf ;
-                                               psf_binheader_readf (psf, "b", cptr, dword) ;
-                                               bytesread += dword ;
-                                               cptr [dword] = 0 ;
-                                               psf_log_printf (psf, "    %M : %d : %s\n", chunk, mark_id, cptr) ;
+                                               bytesread += psf_binheader_readf (psf, "b", buffer, chunk_size) ;
+                                               buffer [chunk_size] = 0 ;
+                                               psf_log_printf (psf, "    %M : %u : %s\n", chunk, mark_id, buffer) ;
                                                } ;
                                        break ;
 
@@ -1378,78 +1479,78 @@ wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
                        case DISP_MARKER :
                        case ltxt_MARKER :
                        case note_MARKER :
-                                       bytesread += psf_binheader_readf (psf, "4", &dword) ;
-                                       dword += (dword & 1) ;
-                                       psf_binheader_readf (psf, "j", dword) ;
-                                       bytesread += dword ;
-                                       psf_log_printf (psf, "    %M : %d\n", chunk, dword) ;
-                                       break ;
+                                       bytesread += psf_binheader_readf (psf, "4", &chunk_size) ;
+                                       chunk_size += (chunk_size & 1) ;
+                                       if (chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length)
+                                       {       psf_log_printf (psf, "  *** %M : %u (too big)\n", chunk, chunk_size) ;
+                                               psf_binheader_readf (psf, "j", chunk_length) ;
+                                               return 0 ;
+                                               } ;
 
-                       case exif_MARKER :
-                                       psf_log_printf (psf, "  %M\n", chunk) ;
-                                       bytesread += exif_subchunk_parse (psf, length - bytesread) ;
+                                       bytesread += psf_binheader_readf (psf, "j", chunk_size) ;
+                                       psf_log_printf (psf, "    %M : %u\n", chunk, chunk_size) ;
                                        break ;
 
-                       case 0 :
-                                       /*
-                                       **      Four zero bytes where a marker was expected. Assume this means
-                                       **      the rest of the chunk is garbage.
-                                       */
-                                       psf_log_printf (psf, "    *** Found weird-ass zero marker. Jumping to end of chunk.\n") ;
-                                       if (bytesread < length)
-                                               bytesread += psf_binheader_readf (psf, "j", length - bytesread + 4) ;
-                                       psf_log_printf (psf, "    *** Offset is now : 0x%X\n", psf_fseek (psf, 0, SEEK_CUR)) ;
-                                       return 0 ;
-
                        default :
-                                       psf_binheader_readf (psf, "4", &dword) ;
-                                       bytesread += sizeof (dword) ;
-                                       dword += (dword & 1) ;
-                                       psf_binheader_readf (psf, "j", dword) ;
-                                       bytesread += dword ;
-                                       psf_log_printf (psf, "    *** %M : %d\n", chunk, dword) ;
-                                       if (dword > length)
+                                       bytesread += psf_binheader_readf (psf, "4", &chunk_size) ;
+                                       chunk_size += (chunk_size & 1) ;
+                                       psf_log_printf (psf, "    *** %M : %u\n", chunk, chunk_size) ;
+                                       if (bytesread + chunk_size > chunk_length)
+                                       {       bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread + 4) ;
+                                               continue ;
+                                               }
+                                       else
+                                               bytesread += psf_binheader_readf (psf, "j", chunk_size) ;
+
+                                       if (chunk_size >= chunk_length)
                                                return 0 ;
                                        break ;
                        } ;
 
                switch (chunk)
                {       case ISFT_MARKER :
-                                       psf_store_string (psf, SF_STR_SOFTWARE, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_SOFTWARE, buffer) ;
                                        break ;
                        case ICOP_MARKER :
-                                       psf_store_string (psf, SF_STR_COPYRIGHT, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_COPYRIGHT, buffer) ;
                                        break ;
                        case INAM_MARKER :
-                                       psf_store_string (psf, SF_STR_TITLE, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_TITLE, buffer) ;
                                        break ;
                        case IART_MARKER :
-                                       psf_store_string (psf, SF_STR_ARTIST, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_ARTIST, buffer) ;
                                        break ;
                        case ICMT_MARKER :
-                                       psf_store_string (psf, SF_STR_COMMENT, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_COMMENT, buffer) ;
                                        break ;
                        case ICRD_MARKER :
-                                       psf_store_string (psf, SF_STR_DATE, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_DATE, buffer) ;
                                        break ;
                        case IGNR_MARKER :
-                                       psf_store_string (psf, SF_STR_GENRE, psf->u.cbuf) ;
+                                       psf_store_string (psf, SF_STR_GENRE, buffer) ;
+                                       break ;
+                       case IPRD_MARKER :
+                                       psf_store_string (psf, SF_STR_ALBUM, buffer) ;
+                                       break ;
+                       case ITRK_MARKER :
+                                       psf_store_string (psf, SF_STR_TRACKNUMBER, buffer) ;
                                        break ;
                        } ;
                } ;
 
        current_pos = psf_fseek (psf, 0, SEEK_CUR) - current_pos ;
 
-       if (current_pos - 4 != length)
-               psf_log_printf (psf, "**** Bad chunk length %d sbould be %D\n", length, current_pos - 4) ;
+       if (current_pos - 4 != chunk_length)
+               psf_log_printf (psf, "**** Bad chunk length %d sbould be %D\n", chunk_length, current_pos - 4) ;
 
        return 0 ;
 } /* wav_subchunk_parse */
 
 static int
-wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
-{      unsigned int bytesread = 0, dword, sampler_data, loop_count ;
-       unsigned int note, start, end, type = -1, count ;
+wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen)
+{      char buffer [512] ;
+       uint32_t thisread, bytesread = 0, dword, sampler_data, loop_count ;
+       uint32_t note, start, end, type = -1, count ;
        int j, k ;
 
        chunklen += (chunklen & 1) ;
@@ -1468,9 +1569,9 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
 
        bytesread += psf_binheader_readf (psf, "4", &dword) ;
        if (dword != 0)
-       {       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f",
-                                (1.0 * 0x80000000) / ((unsigned int) dword)) ;
-               psf_log_printf (psf, "  Pitch Fract. : %s\n", psf->u.cbuf) ;
+       {       snprintf (buffer, sizeof (buffer), "%f",
+                                       (1.0 * 0x80000000) / ((uint32_t) dword)) ;
+               psf_log_printf (psf, "  Pitch Fract. : %s\n", buffer) ;
                }
        else
                psf_log_printf (psf, "  Pitch Fract. : 0\n") ;
@@ -1479,13 +1580,16 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
        psf_log_printf (psf, "  SMPTE Format : %u\n", dword) ;
 
        bytesread += psf_binheader_readf (psf, "4", &dword) ;
-       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%02d:%02d:%02d %02d",
-                (dword >> 24) & 0x7F, (dword >> 16) & 0x7F, (dword >> 8) & 0x7F, dword & 0x7F) ;
-       psf_log_printf (psf, "  SMPTE Offset : %s\n", psf->u.cbuf) ;
+       snprintf (buffer, sizeof (buffer), "%02d:%02d:%02d %02d",
+                               (dword >> 24) & 0x7F, (dword >> 16) & 0x7F, (dword >> 8) & 0x7F, dword & 0x7F) ;
+       psf_log_printf (psf, "  SMPTE Offset : %s\n", buffer) ;
 
        bytesread += psf_binheader_readf (psf, "4", &loop_count) ;
        psf_log_printf (psf, "  Loop Count   : %u\n", loop_count) ;
 
+       if (loop_count == 0 && chunklen == bytesread)
+               return 0 ;
+
        /* Sampler Data holds the number of data bytes after the CUE chunks which
        ** is not actually CUE data. Display value after CUE data.
        */
@@ -1497,7 +1601,9 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
        psf->instrument->loop_count = loop_count ;
 
        for (j = 0 ; loop_count > 0 && chunklen - bytesread >= 24 ; j ++)
-       {       bytesread += psf_binheader_readf (psf, "4", &dword) ;
+       {       if ((thisread = psf_binheader_readf (psf, "4", &dword)) == 0)
+                       break ;
+               bytesread += thisread ;
                psf_log_printf (psf, "    Cue ID : %2u", dword) ;
 
                bytesread += psf_binheader_readf (psf, "4", &type) ;
@@ -1560,7 +1666,9 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
                        if (k > 0 && (k % 20) == 0)
                                psf_log_printf (psf, "\n      ") ;
 
-                       bytesread += psf_binheader_readf (psf, "1", &ch) ;
+                       if ((thisread = psf_binheader_readf (psf, "1", &ch)) == 0)
+                               break ;
+                       bytesread += thisread ;
                        psf_log_printf (psf, "%02X ", ch & 0xFF) ;
                        } ;
 
@@ -1607,8 +1715,9 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
 */
 
 static int
-wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen)
-{      unsigned int bytesread = 0 ;
+wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen)
+{      char buffer [512] ;
+       uint32_t bytesread = 0 ;
        int     beats, flags ;
        short rootnote, q1, meter_denom, meter_numer ;
        float q2, tempo ;
@@ -1617,7 +1726,7 @@ wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen)
 
        bytesread += psf_binheader_readf (psf, "422f", &flags, &rootnote, &q1, &q2) ;
 
-       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f", q2) ;
+       snprintf (buffer, sizeof (buffer), "%f", q2) ;
 
        psf_log_printf (psf, "  Flags     : 0x%04x (%s,%s,%s,%s,%s)\n", flags,
                        (flags & 0x01) ? "OneShot" : "Loop",
@@ -1627,12 +1736,12 @@ wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen)
                        (flags & 0x10) ? "??On" : "??Off") ;
 
        psf_log_printf (psf, "  Root note : 0x%x\n  ????      : 0x%04x\n  ????      : %s\n",
-                               rootnote, q1, psf->u.cbuf) ;
+                               rootnote, q1, buffer) ;
 
        bytesread += psf_binheader_readf (psf, "422f", &beats, &meter_denom, &meter_numer, &tempo) ;
-       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f", tempo) ;
+       snprintf (buffer, sizeof (buffer), "%f", tempo) ;
        psf_log_printf (psf, "  Beats     : %d\n  Meter     : %d/%d\n  Tempo     : %s\n",
-                               beats, meter_numer, meter_denom, psf->u.cbuf) ;
+                               beats, meter_numer, meter_denom, buffer) ;
 
        psf_binheader_readf (psf, "j", chunklen - bytesread) ;
 
@@ -1650,10 +1759,10 @@ wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen)
 } /* wav_read_acid_chunk */
 
 int
-wav_read_bext_chunk (SF_PRIVATE *psf, unsigned int chunksize)
+wav_read_bext_chunk (SF_PRIVATE *psf, uint32_t chunksize)
 {
        SF_BROADCAST_INFO_16K * b ;
-       unsigned int bytes = 0 ;
+       uint32_t bytes = 0 ;
 
        if (chunksize < WAV_BEXT_MIN_CHUNK_SIZE)
        {       psf_log_printf (psf, "bext : %u (should be >= %d)\n", chunksize, WAV_BEXT_MIN_CHUNK_SIZE) ;
@@ -1717,8 +1826,8 @@ wav_write_bext_chunk (SF_PRIVATE *psf)
        psf_binheader_writef (psf, "m4", bext_MARKER, WAV_BEXT_MIN_CHUNK_SIZE + b->coding_history_size) ;
 
        /*
-       **      Note that it is very important the the field widths of the SF_BROADCAST_INFO
-       **      struct match those for the bext chunk fields.
+       **      Note that it is very important that the field widths of the SF_BROADCAST_INFO
+       **      struct match those of the bext chunk fields.
        */
 
        psf_binheader_writef (psf, "b", b->description, sizeof (b->description)) ;
@@ -1736,6 +1845,112 @@ wav_write_bext_chunk (SF_PRIVATE *psf)
        return 0 ;
 } /* wav_write_bext_chunk */
 
+int
+wav_read_cart_chunk (SF_PRIVATE *psf, uint32_t chunksize)
+{      SF_CART_INFO_16K *c ;
+       uint32_t bytes = 0 ;
+       int k ;
+
+       if (chunksize < WAV_CART_MIN_CHUNK_SIZE)
+       {       psf_log_printf (psf, "cart : %u (should be >= %d)\n", chunksize, WAV_CART_MIN_CHUNK_SIZE) ;
+               psf_binheader_readf (psf, "j", chunksize) ;
+               return 0 ;
+               } ;
+       if (chunksize > WAV_CART_MAX_CHUNK_SIZE)
+       {       psf_log_printf (psf, "cart : %u (should be < %d)\n", chunksize, WAV_CART_MAX_CHUNK_SIZE) ;
+               psf_binheader_readf (psf, "j", chunksize) ;
+               return 0 ;
+               } ;
+
+       if (chunksize >= sizeof (SF_CART_INFO_16K))
+       {       psf_log_printf (psf, "cart : %u too big to be handled\n", chunksize) ;
+               psf_binheader_readf (psf, "j", chunksize) ;
+               return 0 ;
+               } ;
+
+       psf_log_printf (psf, "cart : %u\n", chunksize) ;
+
+       if ((psf->cart_16k = cart_var_alloc ()) == NULL)
+       {       psf->error = SFE_MALLOC_FAILED ;
+               return psf->error ;
+               } ;
+
+       c = psf->cart_16k ;
+       bytes += psf_binheader_readf (psf, "b", c->version, sizeof (c->version)) ;
+       bytes += psf_binheader_readf (psf, "b", c->title, sizeof (c->title)) ;
+       bytes += psf_binheader_readf (psf, "b", c->artist, sizeof (c->artist)) ;
+       bytes += psf_binheader_readf (psf, "b", c->cut_id, sizeof (c->cut_id)) ;
+       bytes += psf_binheader_readf (psf, "b", c->client_id, sizeof (c->client_id)) ;
+       bytes += psf_binheader_readf (psf, "b", c->category, sizeof (c->category)) ;
+       bytes += psf_binheader_readf (psf, "b", c->classification, sizeof (c->classification)) ;
+       bytes += psf_binheader_readf (psf, "b", c->out_cue, sizeof (c->out_cue)) ;
+       bytes += psf_binheader_readf (psf, "b", c->start_date, sizeof (c->start_date)) ;
+       bytes += psf_binheader_readf (psf, "b", c->start_time, sizeof (c->start_time)) ;
+       bytes += psf_binheader_readf (psf, "b", c->end_date, sizeof (c->end_date)) ;
+       bytes += psf_binheader_readf (psf, "b", c->end_time, sizeof (c->end_time)) ;
+       bytes += psf_binheader_readf (psf, "b", c->producer_app_id, sizeof (c->producer_app_id)) ;
+       bytes += psf_binheader_readf (psf, "b", c->producer_app_version, sizeof (c->producer_app_version)) ;
+       bytes += psf_binheader_readf (psf, "b", c->user_def, sizeof (c->user_def)) ;
+       bytes += psf_binheader_readf (psf, "e4", &c->level_reference, sizeof (c->level_reference)) ;
+
+       for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++)
+               bytes += psf_binheader_readf (psf, "b4", &c->post_timers [k].usage, make_size_t (4), &c->post_timers [k].value) ;
+
+       bytes += psf_binheader_readf (psf, "b", c->reserved, sizeof (c->reserved)) ;
+       bytes += psf_binheader_readf (psf, "b", c->url, sizeof (c->url)) ;
+
+       if (chunksize > WAV_CART_MIN_CHUNK_SIZE)
+       {       /* File has tag text. */
+               c->tag_text_size = chunksize - WAV_CART_MIN_CHUNK_SIZE ;
+               bytes += psf_binheader_readf (psf, "b", c->tag_text, make_size_t (c->tag_text_size)) ;
+               } ;
+
+       return 0 ;
+} /* wav_read_cart_chunk */
+
+int
+wav_write_cart_chunk (SF_PRIVATE *psf)
+{      SF_CART_INFO_16K *c ;
+       int k ;
+
+       if (psf->cart_16k == NULL)
+               return -1 ;
+
+       c = psf->cart_16k ;
+       psf_binheader_writef (psf, "m4", cart_MARKER, WAV_CART_MIN_CHUNK_SIZE + c->tag_text_size) ;
+       /*
+       **      Note that it is very important that the field widths of the SF_CART_INFO
+       **      struct match those of the cart chunk fields.
+       */
+       psf_binheader_writef (psf, "b", c->version, sizeof (c->version)) ;
+       psf_binheader_writef (psf, "b", c->title, sizeof (c->title)) ;
+       psf_binheader_writef (psf, "b", c->artist, sizeof (c->artist)) ;
+       psf_binheader_writef (psf, "b", c->cut_id, sizeof (c->cut_id)) ;
+       psf_binheader_writef (psf, "b", c->client_id, sizeof (c->client_id)) ;
+       psf_binheader_writef (psf, "b", c->category, sizeof (c->category)) ;
+       psf_binheader_writef (psf, "b", c->classification, sizeof (c->classification)) ;
+       psf_binheader_writef (psf, "b", c->out_cue, sizeof (c->out_cue)) ;
+       psf_binheader_writef (psf, "b", c->start_date, sizeof (c->start_date)) ;
+       psf_binheader_writef (psf, "b", c->start_time, sizeof (c->start_time)) ;
+       psf_binheader_writef (psf, "b", c->end_date, sizeof (c->end_date)) ;
+       psf_binheader_writef (psf, "b", c->end_time, sizeof (c->end_time)) ;
+       psf_binheader_writef (psf, "b", c->producer_app_id, sizeof (c->producer_app_id)) ;
+       psf_binheader_writef (psf, "b", c->producer_app_version, sizeof (c->producer_app_version)) ;
+       psf_binheader_writef (psf, "b", c->user_def, sizeof (c->user_def)) ;
+       psf_binheader_writef (psf, "4", c->level_reference, sizeof (c->level_reference)) ;
+
+       for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++)
+               psf_binheader_writef (psf, "b4", c->post_timers [k].usage, make_size_t (4), c->post_timers [k].value) ;
+
+       psf_binheader_writef (psf, "z", sizeof (c->reserved)) ; // just write zeros, we don't have any other use for it
+       psf_binheader_writef (psf, "b", c->url, sizeof (c->url)) ;
+
+       if (c->tag_text_size > 0)
+               psf_binheader_writef (psf, "b", c->tag_text, make_size_t (c->tag_text_size)) ;
+
+       return 0 ;
+} /* wav_write_cart_chunk */
+
 static int
 exif_fill_and_sink (SF_PRIVATE *psf, char* buf, size_t bufsz, size_t toread)
 {
@@ -1759,13 +1974,16 @@ exif_fill_and_sink (SF_PRIVATE *psf, char* buf, size_t bufsz, size_t toread)
 ** (Exif Audio File Specification) http://www.exif.org/Exif2-2.PDF
 */
 static int
-exif_subchunk_parse (SF_PRIVATE *psf, unsigned int length)
-{      unsigned marker, dword, vmajor = -1, vminor = -1, bytesread = 0 ;
+exif_subchunk_parse (SF_PRIVATE *psf, uint32_t length)
+{      uint32_t marker, dword, vmajor = -1, vminor = -1, bytesread = 0 ;
        char buf [4096] ;
+       int thisread ;
 
        while (bytesread < length)
        {
-               bytesread += psf_binheader_readf (psf, "m", &marker) ;
+               if ((thisread = psf_binheader_readf (psf, "m", &marker)) == 0)
+                       break ;
+               bytesread += thisread ;
 
                switch (marker)
                {
@@ -1779,13 +1997,22 @@ exif_subchunk_parse (SF_PRIVATE *psf, unsigned int length)
                                psf_log_printf (psf, "    EXIF Version : %u.%02u\n", vmajor, vminor) ;
                                break ;
 
+                       case olym_MARKER :
+                               bytesread += psf_binheader_readf (psf, "4", &dword) ;
+                               psf_log_printf (psf, "%M : %u\n", marker, dword) ;
+                               if (bytesread + dword > length)
+                                       break ;
+                               dword += (dword & 1) ;
+                               bytesread += psf_binheader_readf (psf, "j", dword) ;
+                               break ;
+
                        case emnt_MARKER : /* design information: null-terminated string */
                        case emdl_MARKER : /* model name ; null-terminated string */
                        case ecor_MARKER : /* manufacturer: null-terminated string */
                        case etim_MARKER : /* creation time: null-terminated string in the format "hour:minute:second.subsecond" */
                        case erel_MARKER : /* relation info: null-terminated string (filename) */
                        case eucm_MARKER : /* user comment: 4-byte size follows, then possibly unicode data */
-                               psf_binheader_readf (psf, "4", &dword) ;
+                               bytesread += psf_binheader_readf (psf, "4", &dword) ;
                                bytesread += sizeof (dword) ;
                                dword += (dword & 1) ;
 
@@ -1804,13 +2031,13 @@ exif_subchunk_parse (SF_PRIVATE *psf, unsigned int length)
                                        bytesread += psf_binheader_readf (psf, "j", 2) ;
                                        } ;
 
-                               psf_log_printf (psf, "    %M : %d (%s)\n", marker, dword, buf) ;
+                               psf_log_printf (psf, "    %M : %u (%s)\n", marker, dword, buf) ;
                                if (dword > length)
                                        return bytesread ;
                                break ;
 
                        default :
-                               psf_log_printf (psf, "    *** %M (%d): -- ignored --\n", marker, marker) ;
+                               psf_log_printf (psf, "    *** %M (%u): -- ignored --\n", marker, marker) ;
                                break ;
                        } ;
                } ;
@@ -1818,3 +2045,49 @@ exif_subchunk_parse (SF_PRIVATE *psf, unsigned int length)
        return bytesread ;
 } /* exif_subchunk_parse */
 
+/*==============================================================================
+*/
+
+static int
+wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info)
+{      return psf_save_write_chunk (&psf->wchunks, chunk_info) ;
+} /* wav_set_chunk */
+
+static SF_CHUNK_ITERATOR *
+wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator)
+{      return psf_next_chunk_iterator (&psf->rchunks, iterator) ;
+} /* wav_next_chunk_iterator */
+
+static int
+wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      int indx ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       chunk_info->datalen = psf->rchunks.chunks [indx].len ;
+
+       return SFE_NO_ERROR ;
+} /* wav_get_chunk_size */
+
+static int
+wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
+{      int indx ;
+       sf_count_t pos ;
+
+       if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
+               return SFE_UNKNOWN_CHUNK ;
+
+       if (chunk_info->data == NULL)
+               return SFE_BAD_CHUNK_DATA_PTR ;
+
+       chunk_info->id_size = psf->rchunks.chunks [indx].id_size ;
+       memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ;
+
+       pos = psf_ftell (psf) ;
+       psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ;
+       psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ;
+       psf_fseek (psf, pos, SEEK_SET) ;
+
+       return SFE_NO_ERROR ;
+} /* wav_get_chunk_data */
index ba6bd99..8639837 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 ** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
 **
 ** This program is free software; you can redistribute it and/or modify
@@ -197,7 +197,7 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
 
                case WAVE_FORMAT_ALAW :
                case WAVE_FORMAT_MULAW :
-                               if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate)
+                               if (wav_fmt->min.bytespersec != wav_fmt->min.samplerate * wav_fmt->min.blockalign)
                                        psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
                                else
                                        psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
@@ -215,8 +215,14 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2)
                                        return SFE_WAV_ADPCM_CHANNELS ;
 
-                               bytesread +=
-                               psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ;
+                               bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ;
+                               psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->ima.extrabytes) ;
+                               if (wav_fmt->ima.samplesperblock < 1)
+                               {       psf_log_printf (psf, "  Samples/Block : %d (should be > 0)\n", wav_fmt->ima.samplesperblock) ;
+                                       return SFE_WAV_ADPCM_SAMPLES ;
+                                       }
+                               else
+                                       psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
 
                                bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
                                if (wav_fmt->ima.bytespersec != (unsigned) bytespersec)
@@ -224,9 +230,6 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                else
                                        psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ima.bytespersec) ;
 
-                               psf->bytewidth = 2 ;
-                               psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->ima.extrabytes) ;
-                               psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
                                break ;
 
                case WAVE_FORMAT_MS_ADPCM :
@@ -235,9 +238,16 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2)
                                        return SFE_WAV_ADPCM_CHANNELS ;
 
-                               bytesread +=
-                               psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes),
-                                               &(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ;
+                               bytesread += psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes),
+                                                               &(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ;
+
+                               psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->msadpcm.extrabytes) ;
+                               if (wav_fmt->ima.samplesperblock < 1)
+                               {       psf_log_printf (psf, "  Samples/Block : %d (should be > 0)\n", wav_fmt->ima.samplesperblock) ;
+                                       return SFE_WAV_ADPCM_SAMPLES ;
+                                       }
+                               else
+                                       psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
 
                                bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ;
                                if (wav_fmt->min.bytespersec == (unsigned) bytespersec)
@@ -247,9 +257,6 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                else
                                        psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
 
-                               psf->bytewidth = 2 ;
-                               psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->msadpcm.extrabytes) ;
-                               psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ;
                                if (wav_fmt->msadpcm.numcoeffs > ARRAY_LEN (wav_fmt->msadpcm.coeffs))
                                {       psf_log_printf (psf, "  No. of Coeffs : %d (should be <= %d)\n", wav_fmt->msadpcm.numcoeffs, ARRAY_LEN (wav_fmt->msadpcm.coeffs)) ;
                                        wav_fmt->msadpcm.numcoeffs = ARRAY_LEN (wav_fmt->msadpcm.coeffs) ;
@@ -259,10 +266,12 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
 
                                psf_log_printf (psf, "    Index   Coeffs1   Coeffs2\n") ;
                                for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
-                               {       bytesread +=
-                                       psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ;
-                                       snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "     %2d     %7d   %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ;
-                                       psf_log_printf (psf, psf->u.cbuf) ;
+                               {       char buffer [128] ;
+
+                                       bytesread +=
+                                               psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ;
+                                       snprintf (buffer, sizeof (buffer), "     %2d     %7d   %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ;
+                                       psf_log_printf (psf, buffer) ;
                                        } ;
                                break ;
 
@@ -282,13 +291,12 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                else
                                        psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->gsm610.bytespersec) ;
 
-                               psf->bytewidth = 2 ;
                                psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->gsm610.extrabytes) ;
                                psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ;
                                break ;
 
                case WAVE_FORMAT_EXTENSIBLE :
-                               if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
+                               if (wav_fmt->ext.bytespersec != wav_fmt->ext.samplerate * wav_fmt->ext.blockalign)
                                        psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
                                else
                                        psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ext.bytespersec) ;
@@ -302,7 +310,8 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                if (wav_fmt->ext.channelmask == 0)
                                        psf_log_printf (psf, "  Channel Mask  : 0x0 (should not be zero)\n") ;
                                else
-                               {       unsigned bit ;
+                               {       char buffer [512] ;
+                                       unsigned bit ;
 
                                        wpriv->wavex_channelmask = wav_fmt->ext.channelmask ;
 
@@ -313,9 +322,9 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                                return SFE_MALLOC_FAILED ;
 
                                        /* Terminate the buffer we're going to append_snprintf into. */
-                                       psf->u.cbuf [0] = 0 ;
+                                       buffer [0] = 0 ;
 
-                                       for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) ; bit++)
+                                       for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) && k < psf->sf.channels ; bit++)
                                        {
                                                if (wav_fmt->ext.channelmask & (1 << bit))
                                                {       if (k > psf->sf.channels)
@@ -324,21 +333,23 @@ wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
                                                                } ;
 
                                                        psf->channel_map [k++] = channel_mask_bits [bit].id ;
-                                                       append_snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%s, ", channel_mask_bits [bit].name) ;
+                                                       append_snprintf (buffer, sizeof (buffer), "%s, ", channel_mask_bits [bit].name) ;
                                                        } ;
                                                } ;
 
                                        /* Remove trailing ", ". */
-                                       bit = strlen (psf->u.cbuf) ;
-                                       psf->u.cbuf [--bit] = 0 ;
-                                       psf->u.cbuf [--bit] = 0 ;
+                                       bit = strlen (buffer) ;
+                                       if (bit >= 2)
+                                       {       buffer [--bit] = 0 ;
+                                               buffer [--bit] = 0 ;
+                                               } ;
 
                                        if (k != psf->sf.channels)
                                        {       psf_log_printf (psf, "  Channel Mask  : 0x%X\n", wav_fmt->ext.channelmask) ;
                                                psf_log_printf (psf, "*** Less channel map bits than there are channels.\n") ;
                                                }
                                        else
-                                               psf_log_printf (psf, "  Channel Mask  : 0x%X (%s)\n", wav_fmt->ext.channelmask, psf->u.cbuf) ;
+                                               psf_log_printf (psf, "  Channel Mask  : 0x%X (%s)\n", wav_fmt->ext.channelmask, buffer) ;
                                        } ;
 
                                bytesread += psf_binheader_readf (psf, "422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ;
@@ -465,7 +476,8 @@ wavex_gen_channel_mask (const int *chan_map, int channels)
 
 void
 wav_w64_analyze (SF_PRIVATE *psf)
-{      AUDIO_DETECT ad ;
+{      unsigned char buffer [4096] ;
+       AUDIO_DETECT ad ;
        int format = 0 ;
 
        if (psf->is_pipe)
@@ -482,8 +494,8 @@ wav_w64_analyze (SF_PRIVATE *psf)
 
        psf_fseek (psf, 3 * 4 * 50, SEEK_SET) ;
 
-       while (psf_fread (psf->u.ucbuf, 1, 4096, psf) == 4096)
-       {       format = audio_detect (psf, &ad, psf->u.ucbuf, 4096) ;
+       while (psf_fread (buffer, 1, sizeof (buffer), psf) == sizeof (buffer))
+       {       format = audio_detect (psf, &ad, buffer, sizeof (buffer)) ;
                if (format != 0)
                        break ;
                } ;
index 9b2914a..9e781b0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -28,9 +28,9 @@
 
 enum
 {
-  /* keep sorted for wav_w64_format_str() */
+       /* keep sorted for wav_w64_format_str() */
        WAVE_FORMAT_UNKNOWN                                     = 0x0000,               /* Microsoft Corporation */
-       WAVE_FORMAT_PCM                                         = 0x0001,               /* Microsoft PCM format */
+       WAVE_FORMAT_PCM                                         = 0x0001,               /* Microsoft PCM format */
        WAVE_FORMAT_MS_ADPCM                            = 0x0002,               /* Microsoft ADPCM */
        WAVE_FORMAT_IEEE_FLOAT                          = 0x0003,               /* Micrososft 32 bit float format */
        WAVE_FORMAT_VSELP                                       = 0x0004,               /* Compaq Computer Corporation */
@@ -264,6 +264,12 @@ typedef struct
        /* Set to true when 'fmt ' chunk is ambiguous.*/
        int fmt_is_broken ;
        WAV_FMT wav_fmt ;
+
+       /*
+       ** Set to true when RF64 should be converted back to RIFF when writing the
+       ** header.
+       */
+       int rf64_downgrade ;
 } WAV_PRIVATE ;
 
 #define                WAV_W64_GSM610_BLOCKSIZE        65
@@ -291,5 +297,8 @@ int         wavex_gen_channel_mask (const int *chan_map, int channels) ;
 int            wav_read_bext_chunk (SF_PRIVATE *psf, unsigned int chunksize) ;
 int            wav_write_bext_chunk (SF_PRIVATE *psf) ;
 
+int            wav_read_cart_chunk (SF_PRIVATE *psf, unsigned int chunksize) ;
+int            wav_write_cart_chunk (SF_PRIVATE *psf) ;
+
 #endif
 
index ee60a4b..4c8ef54 100644 (file)
--- a/src/xi.c
+++ b/src/xi.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -216,7 +216,8 @@ dpcm_init (SF_PRIVATE *psf)
 
 static sf_count_t
 dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     total, bufferlen, len ;
 
        if ((pxi = psf->codec_data) == NULL)
@@ -248,18 +249,18 @@ dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
 
        if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16)
        {       total = offset ;
-               bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+               bufferlen = ARRAY_LEN (ubuf.sbuf) ;
                while (total > 0)
                {       len = (total > bufferlen) ? bufferlen : total ;
-                       total -= dpcm_read_dles2s (psf, psf->u.sbuf, len) ;
+                       total -= dpcm_read_dles2s (psf, ubuf.sbuf, len) ;
                        } ;
                }
        else
        {       total = offset ;
-               bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+               bufferlen = ARRAY_LEN (ubuf.sbuf) ;
                while (total > 0)
                {       len = (total > bufferlen) ? bufferlen : total ;
-                       total -= dpcm_read_dsc2s (psf, psf->u.sbuf, len) ;
+                       total -= dpcm_read_dsc2s (psf, ubuf.sbuf, len) ;
                        } ;
                } ;
 
@@ -351,11 +352,19 @@ xi_read_header (SF_PRIVATE *psf)
                return SFE_XI_BAD_HEADER ;
 
        buffer [22] = 0 ;
+       for (k = 21 ; k >= 0 && buffer [k] == ' ' ; k --)
+               buffer [k] = 0 ;
+
        psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ;
+       psf_store_string (psf, SF_STR_TITLE, buffer) ;
 
        psf_binheader_readf (psf, "be2", buffer, 20, &version) ;
        buffer [19] = 0 ;
+       for (k = 18 ; k >= 0 && buffer [k] == ' ' ; k --)
+               buffer [k] = 0 ;
+
        psf_log_printf (psf, "Software : %s\nVersion  : %d.%02d\n", buffer, version / 256, version % 256) ;
+       psf_store_string (psf, SF_STR_SOFTWARE, buffer) ;
 
        /* Jump note numbers (96), volume envelope (48), pan envelope (48),
        ** volume points (1), pan points (1)
@@ -387,6 +396,7 @@ xi_read_header (SF_PRIVATE *psf)
        if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
                return SFE_MALLOC_FAILED ;
 
+       psf->instrument->basenote = 0 ;
        /* Log all data for each sample. */
        for (k = 0 ; k < sample_count ; k++)
        {       psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ;
@@ -417,6 +427,14 @@ xi_read_header (SF_PRIVATE *psf)
                psf_log_printf (psf, "  pan     : %u\n  note    : %d\n  namelen : %d\n",
                                        buffer [3] & 0xFF, buffer [4], buffer [5]) ;
 
+               psf->instrument->basenote = buffer [4] ;
+               if (buffer [2] & 1)
+               {       psf->instrument->loop_count = 1 ;
+                       psf->instrument->loops [0].mode = (buffer [2] & 2) ? SF_LOOP_ALTERNATING : SF_LOOP_FORWARD ;
+                       psf->instrument->loops [0].start = loop_begin ;
+                       psf->instrument->loops [0].end = loop_end ;
+                       } ;
+
                if (k != 0)
                        continue ;
 
@@ -469,7 +487,6 @@ xi_read_header (SF_PRIVATE *psf)
        if (! psf->sf.frames && psf->blockwidth)
                psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
 
-       psf->instrument->basenote = 0 ;
        psf->instrument->gain = 1 ;
        psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
        psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
@@ -492,20 +509,21 @@ static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest,
 
 static sf_count_t
 dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               dsc2s_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               dsc2s_array (pxi, ubuf.scbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -517,20 +535,21 @@ dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               dsc2i_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               dsc2i_array (pxi, ubuf.scbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -542,7 +561,8 @@ dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           normfact ;
@@ -552,13 +572,13 @@ dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               dsc2f_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               dsc2f_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -570,7 +590,8 @@ dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
@@ -580,13 +601,13 @@ dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
-               dsc2d_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
+               dsc2d_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -601,20 +622,21 @@ dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               dles2s_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               dles2s_array (pxi, ubuf.sbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -626,20 +648,21 @@ dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               dles2i_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               dles2i_array (pxi, ubuf.sbuf, readcount, ptr + total) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -651,7 +674,8 @@ dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        float           normfact ;
@@ -661,13 +685,13 @@ dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               dles2f_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               dles2f_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -679,7 +703,8 @@ dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, readcount ;
        sf_count_t      total = 0 ;
        double          normfact ;
@@ -689,13 +714,13 @@ dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
-               dles2d_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
+               readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
+               dles2d_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ;
                total += readcount ;
                if (readcount < bufferlen)
                        break ;
@@ -721,20 +746,21 @@ static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int c
 
 static sf_count_t
 dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               s2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -746,20 +772,21 @@ dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               i2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -771,7 +798,8 @@ dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           normfact ;
@@ -781,13 +809,13 @@ dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               f2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -799,7 +827,8 @@ dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          normfact ;
@@ -809,13 +838,13 @@ dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.ucbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               d2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
-               writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+               d2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ;
+               writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -828,20 +857,21 @@ dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               s2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               s2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -853,20 +883,21 @@ dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
 
        if ((pxi = psf->codec_data) == NULL)
                return 0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               i2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               i2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -878,7 +909,8 @@ dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        float           normfact ;
@@ -888,13 +920,13 @@ dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
        normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               f2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               f2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -906,7 +938,8 @@ dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
 
 static sf_count_t
 dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
-{      XI_PRIVATE      *pxi ;
+{      BUF_UNION       ubuf ;
+       XI_PRIVATE      *pxi ;
        int                     bufferlen, writecount ;
        sf_count_t      total = 0 ;
        double          normfact ;
@@ -916,13 +949,13 @@ dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
 
        normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
 
-       bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+       bufferlen = ARRAY_LEN (ubuf.sbuf) ;
 
        while (len > 0)
        {       if (len < bufferlen)
                        bufferlen = (int) len ;
-               d2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
-               writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+               d2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ;
+               writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ;
                total += writecount ;
                if (writecount < bufferlen)
                        break ;
@@ -945,10 +978,10 @@ dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest)
 
        for (k = 0 ; k < count ; k++)
        {       last_val += src [k] ;
-               dest [k] = last_val << 8 ;
+               dest [k] = arith_shift_left (last_val, 8) ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* dsc2s_array */
 
 static void
@@ -960,10 +993,10 @@ dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest)
 
        for (k = 0 ; k < count ; k++)
        {       last_val += src [k] ;
-               dest [k] = last_val << 24 ;
+               dest [k] = arith_shift_left (last_val, 24) ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* dsc2i_array */
 
 static void
@@ -978,7 +1011,7 @@ dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float no
                dest [k] = last_val * normfact ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* dsc2f_array */
 
 static void
@@ -993,7 +1026,7 @@ dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double
                dest [k] = last_val * normfact ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* dsc2d_array */
 
 /*------------------------------------------------------------------------------
@@ -1012,7 +1045,7 @@ s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count)
                last_val = current ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* s2dsc_array */
 
 static void
@@ -1028,7 +1061,7 @@ i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count)
                last_val = current ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* i2dsc_array */
 
 static void
@@ -1044,7 +1077,7 @@ f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, fl
                last_val = current ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* f2dsc_array */
 
 static void
@@ -1060,7 +1093,7 @@ d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, d
                last_val = current ;
                } ;
 
-       pxi->last_16 = last_val << 8 ;
+       pxi->last_16 = arith_shift_left (last_val, 8) ;
 } /* d2dsc_array */
 
 /*==============================================================================
@@ -1074,7 +1107,7 @@ dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest)
        last_val = pxi->last_16 ;
 
        for (k = 0 ; k < count ; k++)
-       {       last_val += LES2H_SHORT (src [k]) ;
+       {       last_val += LE2H_16 (src [k]) ;
                dest [k] = last_val ;
                } ;
 
@@ -1089,8 +1122,8 @@ dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest)
        last_val = pxi->last_16 ;
 
        for (k = 0 ; k < count ; k++)
-       {       last_val += LES2H_SHORT (src [k]) ;
-               dest [k] = last_val << 16 ;
+       {       last_val += LE2H_16 (src [k]) ;
+               dest [k] = arith_shift_left (last_val, 16) ;
                } ;
 
        pxi->last_16 = last_val ;
@@ -1104,7 +1137,7 @@ dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfac
        last_val = pxi->last_16 ;
 
        for (k = 0 ; k < count ; k++)
-       {       last_val += LES2H_SHORT (src [k]) ;
+       {       last_val += LE2H_16 (src [k]) ;
                dest [k] = last_val * normfact ;
                } ;
 
@@ -1119,7 +1152,7 @@ dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normf
        last_val = pxi->last_16 ;
 
        for (k = 0 ; k < count ; k++)
-       {       last_val += LES2H_SHORT (src [k]) ;
+       {       last_val += LE2H_16 (src [k]) ;
                dest [k] = last_val * normfact ;
                } ;
 
@@ -1138,7 +1171,7 @@ s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count)
 
        for (k = 0 ; k < count ; k++)
        {       diff = src [k] - last_val ;
-               dest [k] = LES2H_SHORT (diff) ;
+               dest [k] = LE2H_16 (diff) ;
                last_val = src [k] ;
                } ;
 
@@ -1154,7 +1187,7 @@ i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count)
 
        for (k = 0 ; k < count ; k++)
        {       diff = (src [k] >> 16) - last_val ;
-               dest [k] = LES2H_SHORT (diff) ;
+               dest [k] = LE2H_16 (diff) ;
                last_val = src [k] >> 16 ;
                } ;
 
@@ -1171,7 +1204,7 @@ f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float n
        for (k = 0 ; k < count ; k++)
        {       current = lrintf (src [k] * normfact) ;
                diff = current - last_val ;
-               dest [k] = LES2H_SHORT (diff) ;
+               dest [k] = LE2H_16 (diff) ;
                last_val = current ;
                } ;
 
@@ -1188,7 +1221,7 @@ d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double
        for (k = 0 ; k < count ; k++)
        {       current = lrint (src [k] * normfact) ;
                diff = current - last_val ;
-               dest [k] = LES2H_SHORT (diff) ;
+               dest [k] = LE2H_16 (diff) ;
                last_val = current ;
                } ;
 
index 1d2052b..8a740ab 100644 (file)
@@ -6,16 +6,17 @@ else
 CPP_TEST = cpp_test
 endif
 
-INCLUDES = -I$(top_srcdir)/src
+AM_CPPFLAGS = -I$(top_srcdir)/src
 
 check_PROGRAMS = sfversion floating_point_test write_read_test \
        lossy_comp_test error_test ulaw_test alaw_test dwvw_test \
        peak_chunk_test command_test stdin_test stdout_test stdio_test \
        pcm_test headerless_test pipe_test benchmark header_test misc_test \
-       raw_test string_test multi_file_test dither_test \
+       raw_test string_test multi_file_test dither_test chunk_test \
        scale_clip_test win32_test fix_this aiff_rw_test virtual_io_test \
-       locale_test largefile_test win32_ordinal_test ogg_test vorbis_test \
-       checksum_test external_libs_test rdwr_test format_check_test $(CPP_TEST)
+       locale_test largefile_test win32_ordinal_test ogg_test compression_size_test \
+       checksum_test external_libs_test rdwr_test format_check_test $(CPP_TEST) \
+       channel_test long_read_write_test
 
 noinst_HEADERS = dft_cmp.h utils.h generate.h
 
@@ -31,7 +32,7 @@ autogen_sources = write_read_test.tpl write_read_test.def     \
 
 EXTRA_DIST = $(autogen_sources)
 
-CLEANFILES = *~
+CLEANFILES = *~ *.exe
 
 #===============================================================================
 # If we're cross compiling from Linux to Windows and running the test suite
@@ -128,6 +129,9 @@ string_test_LDADD = $(top_builddir)/src/libsndfile.la
 dither_test_SOURCES = dither_test.c utils.c
 dither_test_LDADD = $(top_builddir)/src/libsndfile.la
 
+chunk_test_SOURCES = chunk_test.c utils.c
+chunk_test_LDADD = $(top_builddir)/src/libsndfile.la
+
 multi_file_test_SOURCES = multi_file_test.c utils.c
 multi_file_test_LDADD = $(top_builddir)/src/libsndfile.la
 
@@ -137,8 +141,8 @@ virtual_io_test_LDADD = $(top_builddir)/src/libsndfile.la
 ogg_test_SOURCES = ogg_test.c utils.c
 ogg_test_LDADD = $(top_builddir)/src/libsndfile.la
 
-vorbis_test_SOURCES = vorbis_test.c utils.c
-vorbis_test_LDADD = $(top_builddir)/src/libsndfile.la
+compression_size_test_SOURCES = compression_size_test.c utils.c
+compression_size_test_LDADD = $(top_builddir)/src/libsndfile.la
 
 rdwr_test_SOURCES = rdwr_test.c utils.c
 rdwr_test_LDADD = $(top_builddir)/src/libsndfile.la
@@ -156,6 +160,12 @@ external_libs_test_LDADD = $(top_builddir)/src/libsndfile.la
 format_check_test_SOURCES = format_check_test.c utils.c
 format_check_test_LDADD = $(top_builddir)/src/libsndfile.la
 
+channel_test_SOURCES = channel_test.c utils.c
+channel_test_LDADD = $(top_builddir)/src/libsndfile.la
+
+long_read_write_test_SOURCES = long_read_write_test.c utils.c
+long_read_write_test_LDADD = $(top_builddir)/src/libsndfile.la
+
 cpp_test_SOURCES = cpp_test.cc utils.c
 cpp_test_LDADD = $(top_builddir)/src/libsndfile.la
 
@@ -179,31 +189,31 @@ scale_clip_test_LDADD = $(top_builddir)/src/libsndfile.la
 #===============================================================================
 
 write_read_test.c: write_read_test.def write_read_test.tpl
-       autogen --writable write_read_test.def
+       cd $(srcdir) && autogen --writable write_read_test.def && cd $(abs_builddir)
 
 pcm_test.c: pcm_test.def pcm_test.tpl
-       autogen --writable pcm_test.def
+       cd $(srcdir) && autogen --writable pcm_test.def && cd $(abs_builddir)
 
 header_test.c: header_test.def header_test.tpl
-       autogen --writable header_test.def
+       cd $(srcdir) && autogen --writable header_test.def && cd $(abs_builddir)
 
 utils.c utils.h : utils.def utils.tpl
-       autogen --writable utils.def
+       cd $(srcdir) && autogen --writable utils.def && cd $(abs_builddir)
 
 scale_clip_test.c: scale_clip_test.def scale_clip_test.tpl
-       autogen --writable scale_clip_test.def
+       cd $(srcdir) && autogen --writable scale_clip_test.def && cd $(abs_builddir)
 
 pipe_test.c: pipe_test.def pipe_test.tpl
-       autogen --writable pipe_test.def
+       cd $(srcdir) && autogen --writable pipe_test.def && cd $(abs_builddir)
 
 rdwr_test.c: rdwr_test.def rdwr_test.tpl
-       autogen --writable rdwr_test.def
+       cd $(srcdir) && autogen --writable rdwr_test.def && cd $(abs_builddir)
 
 floating_point_test.c: floating_point_test.def floating_point_test.tpl
-       autogen --writable floating_point_test.def
+       cd $(srcdir) && autogen --writable floating_point_test.def && cd $(abs_builddir)
 
 benchmark.c: benchmark.def benchmark.tpl
-       autogen --writable benchmark.def
+       cd $(srcdir) && autogen --writable benchmark.def && cd $(abs_builddir)
 
 genfiles : write_read_test.c pcm_test.c header_test.c utils.c \
                scale_clip_test.c pipe_test.c floating_point_test.c rdwr_test.c \
index 083d77f..29d4ae9 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -44,31 +98,31 @@ check_PROGRAMS = sfversion$(EXEEXT) floating_point_test$(EXEEXT) \
        pipe_test$(EXEEXT) benchmark$(EXEEXT) header_test$(EXEEXT) \
        misc_test$(EXEEXT) raw_test$(EXEEXT) string_test$(EXEEXT) \
        multi_file_test$(EXEEXT) dither_test$(EXEEXT) \
-       scale_clip_test$(EXEEXT) win32_test$(EXEEXT) fix_this$(EXEEXT) \
-       aiff_rw_test$(EXEEXT) virtual_io_test$(EXEEXT) \
-       locale_test$(EXEEXT) largefile_test$(EXEEXT) \
-       win32_ordinal_test$(EXEEXT) ogg_test$(EXEEXT) \
-       vorbis_test$(EXEEXT) checksum_test$(EXEEXT) \
-       external_libs_test$(EXEEXT) rdwr_test$(EXEEXT) \
-       format_check_test$(EXEEXT) $(am__EXEEXT_1)
+       chunk_test$(EXEEXT) scale_clip_test$(EXEEXT) \
+       win32_test$(EXEEXT) fix_this$(EXEEXT) aiff_rw_test$(EXEEXT) \
+       virtual_io_test$(EXEEXT) locale_test$(EXEEXT) \
+       largefile_test$(EXEEXT) win32_ordinal_test$(EXEEXT) \
+       ogg_test$(EXEEXT) compression_size_test$(EXEEXT) \
+       checksum_test$(EXEEXT) external_libs_test$(EXEEXT) \
+       rdwr_test$(EXEEXT) format_check_test$(EXEEXT) $(am__EXEEXT_1) \
+       channel_test$(EXEEXT) long_read_write_test$(EXEEXT)
 subdir = tests
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(srcdir)/pedantic-header-test.sh.in \
-       $(srcdir)/test_wrapper.sh.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
-       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
-       $(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
-       $(top_srcdir)/M4/extra_pkg.m4 \
-       $(top_srcdir)/M4/flexible_array.m4 \
-       $(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
-       $(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
-       $(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
-       $(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+       $(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clang.m4 \
+       $(top_srcdir)/M4/clip_mode.m4 $(top_srcdir)/M4/endian.m4 \
+       $(top_srcdir)/M4/extra_pkg.m4 $(top_srcdir)/M4/gcc_version.m4 \
+       $(top_srcdir)/M4/libtool.m4 $(top_srcdir)/M4/lrint.m4 \
+       $(top_srcdir)/M4/lrintf.m4 $(top_srcdir)/M4/ltoptions.m4 \
+       $(top_srcdir)/M4/ltsugar.m4 $(top_srcdir)/M4/ltversion.m4 \
+       $(top_srcdir)/M4/lt~obsolete.m4 \
        $(top_srcdir)/M4/mkoctfile_version.m4 \
-       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+       $(top_srcdir)/M4/octave.m4 $(top_srcdir)/M4/really_gcc.m4 \
+       $(top_srcdir)/M4/stack_protect.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+       $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES = test_wrapper.sh pedantic-header-test.sh
@@ -77,21 +131,33 @@ CONFIG_CLEAN_VPATH_FILES =
 am_aiff_rw_test_OBJECTS = utils.$(OBJEXT) aiff_rw_test.$(OBJEXT)
 aiff_rw_test_OBJECTS = $(am_aiff_rw_test_OBJECTS)
 aiff_rw_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
+am__v_lt_1 = 
 am_alaw_test_OBJECTS = utils.$(OBJEXT) alaw_test.$(OBJEXT)
 alaw_test_OBJECTS = $(am_alaw_test_OBJECTS)
 alaw_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_benchmark_OBJECTS = benchmark.$(OBJEXT)
 benchmark_OBJECTS = $(am_benchmark_OBJECTS)
 benchmark_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+am_channel_test_OBJECTS = channel_test.$(OBJEXT) utils.$(OBJEXT)
+channel_test_OBJECTS = $(am_channel_test_OBJECTS)
+channel_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_checksum_test_OBJECTS = checksum_test.$(OBJEXT) utils.$(OBJEXT)
 checksum_test_OBJECTS = $(am_checksum_test_OBJECTS)
 checksum_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+am_chunk_test_OBJECTS = chunk_test.$(OBJEXT) utils.$(OBJEXT)
+chunk_test_OBJECTS = $(am_chunk_test_OBJECTS)
+chunk_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_command_test_OBJECTS = command_test.$(OBJEXT) utils.$(OBJEXT)
 command_test_OBJECTS = $(am_command_test_OBJECTS)
 command_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+am_compression_size_test_OBJECTS = compression_size_test.$(OBJEXT) \
+       utils.$(OBJEXT)
+compression_size_test_OBJECTS = $(am_compression_size_test_OBJECTS)
+compression_size_test_DEPENDENCIES =  \
+       $(top_builddir)/src/libsndfile.la
 am_cpp_test_OBJECTS = cpp_test.$(OBJEXT) utils.$(OBJEXT)
 cpp_test_OBJECTS = $(am_cpp_test_OBJECTS)
 cpp_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
@@ -131,6 +197,10 @@ largefile_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_locale_test_OBJECTS = locale_test.$(OBJEXT) utils.$(OBJEXT)
 locale_test_OBJECTS = $(am_locale_test_OBJECTS)
 locale_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+am_long_read_write_test_OBJECTS = long_read_write_test.$(OBJEXT) \
+       utils.$(OBJEXT)
+long_read_write_test_OBJECTS = $(am_long_read_write_test_OBJECTS)
+long_read_write_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_lossy_comp_test_OBJECTS = utils.$(OBJEXT) lossy_comp_test.$(OBJEXT)
 lossy_comp_test_OBJECTS = $(am_lossy_comp_test_OBJECTS)
 lossy_comp_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
@@ -182,9 +252,6 @@ ulaw_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_virtual_io_test_OBJECTS = virtual_io_test.$(OBJEXT) utils.$(OBJEXT)
 virtual_io_test_OBJECTS = $(am_virtual_io_test_OBJECTS)
 virtual_io_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
-am_vorbis_test_OBJECTS = vorbis_test.$(OBJEXT) utils.$(OBJEXT)
-vorbis_test_OBJECTS = $(am_vorbis_test_OBJECTS)
-vorbis_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
 am_win32_ordinal_test_OBJECTS = win32_ordinal_test.$(OBJEXT) \
        utils.$(OBJEXT)
 win32_ordinal_test_OBJECTS = $(am_win32_ordinal_test_OBJECTS)
@@ -196,6 +263,18 @@ am_write_read_test_OBJECTS = utils.$(OBJEXT) generate.$(OBJEXT) \
        write_read_test.$(OBJEXT)
 write_read_test_OBJECTS = $(am_write_read_test_OBJECTS)
 write_read_test_DEPENDENCIES = $(top_builddir)/src/libsndfile.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
 depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
 am__depfiles_maybe = depfiles
@@ -206,47 +285,47 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
        $(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_$(V))
-am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
-am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
 CXXLD = $(CXX)
 CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
        $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_$(V))
-am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CXXLD_0 = @echo "  CXXLD " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
 SOURCES = $(aiff_rw_test_SOURCES) $(alaw_test_SOURCES) \
-       $(benchmark_SOURCES) $(checksum_test_SOURCES) \
-       $(command_test_SOURCES) $(cpp_test_SOURCES) \
-       $(dither_test_SOURCES) $(dwvw_test_SOURCES) \
-       $(error_test_SOURCES) $(external_libs_test_SOURCES) \
-       $(fix_this_SOURCES) $(floating_point_test_SOURCES) \
-       $(format_check_test_SOURCES) $(header_test_SOURCES) \
-       $(headerless_test_SOURCES) $(largefile_test_SOURCES) \
-       $(locale_test_SOURCES) $(lossy_comp_test_SOURCES) \
+       $(benchmark_SOURCES) $(channel_test_SOURCES) \
+       $(checksum_test_SOURCES) $(chunk_test_SOURCES) \
+       $(command_test_SOURCES) $(compression_size_test_SOURCES) \
+       $(cpp_test_SOURCES) $(dither_test_SOURCES) \
+       $(dwvw_test_SOURCES) $(error_test_SOURCES) \
+       $(external_libs_test_SOURCES) $(fix_this_SOURCES) \
+       $(floating_point_test_SOURCES) $(format_check_test_SOURCES) \
+       $(header_test_SOURCES) $(headerless_test_SOURCES) \
+       $(largefile_test_SOURCES) $(locale_test_SOURCES) \
+       $(long_read_write_test_SOURCES) $(lossy_comp_test_SOURCES) \
        $(misc_test_SOURCES) $(multi_file_test_SOURCES) \
        $(ogg_test_SOURCES) $(pcm_test_SOURCES) \
        $(peak_chunk_test_SOURCES) $(pipe_test_SOURCES) \
@@ -255,17 +334,19 @@ SOURCES = $(aiff_rw_test_SOURCES) $(alaw_test_SOURCES) \
        $(stdin_test_SOURCES) $(stdio_test_SOURCES) \
        $(stdout_test_SOURCES) $(string_test_SOURCES) \
        $(ulaw_test_SOURCES) $(virtual_io_test_SOURCES) \
-       $(vorbis_test_SOURCES) $(win32_ordinal_test_SOURCES) \
-       $(win32_test_SOURCES) $(write_read_test_SOURCES)
+       $(win32_ordinal_test_SOURCES) $(win32_test_SOURCES) \
+       $(write_read_test_SOURCES)
 DIST_SOURCES = $(aiff_rw_test_SOURCES) $(alaw_test_SOURCES) \
-       $(benchmark_SOURCES) $(checksum_test_SOURCES) \
-       $(command_test_SOURCES) $(cpp_test_SOURCES) \
-       $(dither_test_SOURCES) $(dwvw_test_SOURCES) \
-       $(error_test_SOURCES) $(external_libs_test_SOURCES) \
-       $(fix_this_SOURCES) $(floating_point_test_SOURCES) \
-       $(format_check_test_SOURCES) $(header_test_SOURCES) \
-       $(headerless_test_SOURCES) $(largefile_test_SOURCES) \
-       $(locale_test_SOURCES) $(lossy_comp_test_SOURCES) \
+       $(benchmark_SOURCES) $(channel_test_SOURCES) \
+       $(checksum_test_SOURCES) $(chunk_test_SOURCES) \
+       $(command_test_SOURCES) $(compression_size_test_SOURCES) \
+       $(cpp_test_SOURCES) $(dither_test_SOURCES) \
+       $(dwvw_test_SOURCES) $(error_test_SOURCES) \
+       $(external_libs_test_SOURCES) $(fix_this_SOURCES) \
+       $(floating_point_test_SOURCES) $(format_check_test_SOURCES) \
+       $(header_test_SOURCES) $(headerless_test_SOURCES) \
+       $(largefile_test_SOURCES) $(locale_test_SOURCES) \
+       $(long_read_write_test_SOURCES) $(lossy_comp_test_SOURCES) \
        $(misc_test_SOURCES) $(multi_file_test_SOURCES) \
        $(ogg_test_SOURCES) $(pcm_test_SOURCES) \
        $(peak_chunk_test_SOURCES) $(pipe_test_SOURCES) \
@@ -274,14 +355,38 @@ DIST_SOURCES = $(aiff_rw_test_SOURCES) $(alaw_test_SOURCES) \
        $(stdin_test_SOURCES) $(stdio_test_SOURCES) \
        $(stdout_test_SOURCES) $(string_test_SOURCES) \
        $(ulaw_test_SOURCES) $(virtual_io_test_SOURCES) \
-       $(vorbis_test_SOURCES) $(win32_ordinal_test_SOURCES) \
-       $(win32_test_SOURCES) $(write_read_test_SOURCES)
+       $(win32_ordinal_test_SOURCES) $(win32_test_SOURCES) \
+       $(write_read_test_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+       $(srcdir)/pedantic-header-test.sh.in \
+       $(srcdir)/test_wrapper.sh.in $(top_srcdir)/Cfg/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALSA_LIBS = @ALSA_LIBS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -319,13 +424,14 @@ FLAC_LIBS = @FLAC_LIBS@
 GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
 GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
 GCC_VERSION = @GCC_VERSION@
-GETCONF = @GETCONF@
 GREP = @GREP@
 HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_EXTERNAL_LIBS = @HAVE_EXTERNAL_LIBS@
 HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
 HAVE_OCTAVE = @HAVE_OCTAVE@
 HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
 HAVE_WINE = @HAVE_WINE@
+HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@
 HOST_TRIPLET = @HOST_TRIPLET@
 HTML_BGCOLOUR = @HTML_BGCOLOUR@
 HTML_FGCOLOUR = @HTML_FGCOLOUR@
@@ -389,7 +495,9 @@ SPEEX_CFLAGS = @SPEEX_CFLAGS@
 SPEEX_LIBS = @SPEEX_LIBS@
 SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
 SQLITE3_LIBS = @SQLITE3_LIBS@
+SRC_BINDIR = @SRC_BINDIR@
 STRIP = @STRIP@
+TEST_BINDIR = @TEST_BINDIR@
 TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
 VERSION = @VERSION@
 VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
@@ -428,7 +536,6 @@ host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
 htmldir = @htmldir@
-htmldocdir = @htmldocdir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
@@ -440,9 +547,11 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -457,7 +566,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 @ENABLE_TEST_COVERAGE_FALSE@CPP_TEST = cpp_test
 @ENABLE_TEST_COVERAGE_TRUE@CPP_TEST = 
-INCLUDES = -I$(top_srcdir)/src
+AM_CPPFLAGS = -I$(top_srcdir)/src
 noinst_HEADERS = dft_cmp.h utils.h generate.h
 autogen_sources = write_read_test.tpl write_read_test.def      \
                                        pcm_test.tpl pcm_test.def                               \
@@ -470,7 +579,7 @@ autogen_sources = write_read_test.tpl write_read_test.def   \
                                        benchmark.tpl benchmark.def
 
 EXTRA_DIST = $(autogen_sources)
-CLEANFILES = *~
+CLEANFILES = *~ *.exe
 
 #===============================================================================
 sfversion_SOURCES = sfversion.c
@@ -519,14 +628,16 @@ string_test_SOURCES = string_test.c utils.c
 string_test_LDADD = $(top_builddir)/src/libsndfile.la
 dither_test_SOURCES = dither_test.c utils.c
 dither_test_LDADD = $(top_builddir)/src/libsndfile.la
+chunk_test_SOURCES = chunk_test.c utils.c
+chunk_test_LDADD = $(top_builddir)/src/libsndfile.la
 multi_file_test_SOURCES = multi_file_test.c utils.c
 multi_file_test_LDADD = $(top_builddir)/src/libsndfile.la
 virtual_io_test_SOURCES = virtual_io_test.c utils.c
 virtual_io_test_LDADD = $(top_builddir)/src/libsndfile.la
 ogg_test_SOURCES = ogg_test.c utils.c
 ogg_test_LDADD = $(top_builddir)/src/libsndfile.la
-vorbis_test_SOURCES = vorbis_test.c utils.c
-vorbis_test_LDADD = $(top_builddir)/src/libsndfile.la
+compression_size_test_SOURCES = compression_size_test.c utils.c
+compression_size_test_LDADD = $(top_builddir)/src/libsndfile.la
 rdwr_test_SOURCES = rdwr_test.c utils.c
 rdwr_test_LDADD = $(top_builddir)/src/libsndfile.la
 win32_test_SOURCES = win32_test.c
@@ -538,6 +649,10 @@ external_libs_test_SOURCES = external_libs_test.c utils.c
 external_libs_test_LDADD = $(top_builddir)/src/libsndfile.la
 format_check_test_SOURCES = format_check_test.c utils.c
 format_check_test_LDADD = $(top_builddir)/src/libsndfile.la
+channel_test_SOURCES = channel_test.c utils.c
+channel_test_LDADD = $(top_builddir)/src/libsndfile.la
+long_read_write_test_SOURCES = long_read_write_test.c utils.c
+long_read_write_test_LDADD = $(top_builddir)/src/libsndfile.la
 cpp_test_SOURCES = cpp_test.cc utils.c
 cpp_test_LDADD = $(top_builddir)/src/libsndfile.la
 checksum_test_SOURCES = checksum_test.c utils.c
@@ -568,7 +683,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnu tests/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -599,118 +713,168 @@ clean-checkPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-aiff_rw_test$(EXEEXT): $(aiff_rw_test_OBJECTS) $(aiff_rw_test_DEPENDENCIES) 
+
+aiff_rw_test$(EXEEXT): $(aiff_rw_test_OBJECTS) $(aiff_rw_test_DEPENDENCIES) $(EXTRA_aiff_rw_test_DEPENDENCIES) 
        @rm -f aiff_rw_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(aiff_rw_test_OBJECTS) $(aiff_rw_test_LDADD) $(LIBS)
-alaw_test$(EXEEXT): $(alaw_test_OBJECTS) $(alaw_test_DEPENDENCIES) 
+
+alaw_test$(EXEEXT): $(alaw_test_OBJECTS) $(alaw_test_DEPENDENCIES) $(EXTRA_alaw_test_DEPENDENCIES) 
        @rm -f alaw_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(alaw_test_OBJECTS) $(alaw_test_LDADD) $(LIBS)
-benchmark$(EXEEXT): $(benchmark_OBJECTS) $(benchmark_DEPENDENCIES) 
+
+benchmark$(EXEEXT): $(benchmark_OBJECTS) $(benchmark_DEPENDENCIES) $(EXTRA_benchmark_DEPENDENCIES) 
        @rm -f benchmark$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(benchmark_OBJECTS) $(benchmark_LDADD) $(LIBS)
-checksum_test$(EXEEXT): $(checksum_test_OBJECTS) $(checksum_test_DEPENDENCIES) 
+
+channel_test$(EXEEXT): $(channel_test_OBJECTS) $(channel_test_DEPENDENCIES) $(EXTRA_channel_test_DEPENDENCIES) 
+       @rm -f channel_test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(channel_test_OBJECTS) $(channel_test_LDADD) $(LIBS)
+
+checksum_test$(EXEEXT): $(checksum_test_OBJECTS) $(checksum_test_DEPENDENCIES) $(EXTRA_checksum_test_DEPENDENCIES) 
        @rm -f checksum_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(checksum_test_OBJECTS) $(checksum_test_LDADD) $(LIBS)
-command_test$(EXEEXT): $(command_test_OBJECTS) $(command_test_DEPENDENCIES) 
+
+chunk_test$(EXEEXT): $(chunk_test_OBJECTS) $(chunk_test_DEPENDENCIES) $(EXTRA_chunk_test_DEPENDENCIES) 
+       @rm -f chunk_test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(chunk_test_OBJECTS) $(chunk_test_LDADD) $(LIBS)
+
+command_test$(EXEEXT): $(command_test_OBJECTS) $(command_test_DEPENDENCIES) $(EXTRA_command_test_DEPENDENCIES) 
        @rm -f command_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(command_test_OBJECTS) $(command_test_LDADD) $(LIBS)
-cpp_test$(EXEEXT): $(cpp_test_OBJECTS) $(cpp_test_DEPENDENCIES) 
+
+compression_size_test$(EXEEXT): $(compression_size_test_OBJECTS) $(compression_size_test_DEPENDENCIES) $(EXTRA_compression_size_test_DEPENDENCIES) 
+       @rm -f compression_size_test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(compression_size_test_OBJECTS) $(compression_size_test_LDADD) $(LIBS)
+
+cpp_test$(EXEEXT): $(cpp_test_OBJECTS) $(cpp_test_DEPENDENCIES) $(EXTRA_cpp_test_DEPENDENCIES) 
        @rm -f cpp_test$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(cpp_test_OBJECTS) $(cpp_test_LDADD) $(LIBS)
-dither_test$(EXEEXT): $(dither_test_OBJECTS) $(dither_test_DEPENDENCIES) 
+
+dither_test$(EXEEXT): $(dither_test_OBJECTS) $(dither_test_DEPENDENCIES) $(EXTRA_dither_test_DEPENDENCIES) 
        @rm -f dither_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(dither_test_OBJECTS) $(dither_test_LDADD) $(LIBS)
-dwvw_test$(EXEEXT): $(dwvw_test_OBJECTS) $(dwvw_test_DEPENDENCIES) 
+
+dwvw_test$(EXEEXT): $(dwvw_test_OBJECTS) $(dwvw_test_DEPENDENCIES) $(EXTRA_dwvw_test_DEPENDENCIES) 
        @rm -f dwvw_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(dwvw_test_OBJECTS) $(dwvw_test_LDADD) $(LIBS)
-error_test$(EXEEXT): $(error_test_OBJECTS) $(error_test_DEPENDENCIES) 
+
+error_test$(EXEEXT): $(error_test_OBJECTS) $(error_test_DEPENDENCIES) $(EXTRA_error_test_DEPENDENCIES) 
        @rm -f error_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(error_test_OBJECTS) $(error_test_LDADD) $(LIBS)
-external_libs_test$(EXEEXT): $(external_libs_test_OBJECTS) $(external_libs_test_DEPENDENCIES) 
+
+external_libs_test$(EXEEXT): $(external_libs_test_OBJECTS) $(external_libs_test_DEPENDENCIES) $(EXTRA_external_libs_test_DEPENDENCIES) 
        @rm -f external_libs_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(external_libs_test_OBJECTS) $(external_libs_test_LDADD) $(LIBS)
-fix_this$(EXEEXT): $(fix_this_OBJECTS) $(fix_this_DEPENDENCIES) 
+
+fix_this$(EXEEXT): $(fix_this_OBJECTS) $(fix_this_DEPENDENCIES) $(EXTRA_fix_this_DEPENDENCIES) 
        @rm -f fix_this$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(fix_this_OBJECTS) $(fix_this_LDADD) $(LIBS)
-floating_point_test$(EXEEXT): $(floating_point_test_OBJECTS) $(floating_point_test_DEPENDENCIES) 
+
+floating_point_test$(EXEEXT): $(floating_point_test_OBJECTS) $(floating_point_test_DEPENDENCIES) $(EXTRA_floating_point_test_DEPENDENCIES) 
        @rm -f floating_point_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(floating_point_test_OBJECTS) $(floating_point_test_LDADD) $(LIBS)
-format_check_test$(EXEEXT): $(format_check_test_OBJECTS) $(format_check_test_DEPENDENCIES) 
+
+format_check_test$(EXEEXT): $(format_check_test_OBJECTS) $(format_check_test_DEPENDENCIES) $(EXTRA_format_check_test_DEPENDENCIES) 
        @rm -f format_check_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(format_check_test_OBJECTS) $(format_check_test_LDADD) $(LIBS)
-header_test$(EXEEXT): $(header_test_OBJECTS) $(header_test_DEPENDENCIES) 
+
+header_test$(EXEEXT): $(header_test_OBJECTS) $(header_test_DEPENDENCIES) $(EXTRA_header_test_DEPENDENCIES) 
        @rm -f header_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(header_test_OBJECTS) $(header_test_LDADD) $(LIBS)
-headerless_test$(EXEEXT): $(headerless_test_OBJECTS) $(headerless_test_DEPENDENCIES) 
+
+headerless_test$(EXEEXT): $(headerless_test_OBJECTS) $(headerless_test_DEPENDENCIES) $(EXTRA_headerless_test_DEPENDENCIES) 
        @rm -f headerless_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(headerless_test_OBJECTS) $(headerless_test_LDADD) $(LIBS)
-largefile_test$(EXEEXT): $(largefile_test_OBJECTS) $(largefile_test_DEPENDENCIES) 
+
+largefile_test$(EXEEXT): $(largefile_test_OBJECTS) $(largefile_test_DEPENDENCIES) $(EXTRA_largefile_test_DEPENDENCIES) 
        @rm -f largefile_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(largefile_test_OBJECTS) $(largefile_test_LDADD) $(LIBS)
-locale_test$(EXEEXT): $(locale_test_OBJECTS) $(locale_test_DEPENDENCIES) 
+
+locale_test$(EXEEXT): $(locale_test_OBJECTS) $(locale_test_DEPENDENCIES) $(EXTRA_locale_test_DEPENDENCIES) 
        @rm -f locale_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(locale_test_OBJECTS) $(locale_test_LDADD) $(LIBS)
-lossy_comp_test$(EXEEXT): $(lossy_comp_test_OBJECTS) $(lossy_comp_test_DEPENDENCIES) 
+
+long_read_write_test$(EXEEXT): $(long_read_write_test_OBJECTS) $(long_read_write_test_DEPENDENCIES) $(EXTRA_long_read_write_test_DEPENDENCIES) 
+       @rm -f long_read_write_test$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(long_read_write_test_OBJECTS) $(long_read_write_test_LDADD) $(LIBS)
+
+lossy_comp_test$(EXEEXT): $(lossy_comp_test_OBJECTS) $(lossy_comp_test_DEPENDENCIES) $(EXTRA_lossy_comp_test_DEPENDENCIES) 
        @rm -f lossy_comp_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lossy_comp_test_OBJECTS) $(lossy_comp_test_LDADD) $(LIBS)
-misc_test$(EXEEXT): $(misc_test_OBJECTS) $(misc_test_DEPENDENCIES) 
+
+misc_test$(EXEEXT): $(misc_test_OBJECTS) $(misc_test_DEPENDENCIES) $(EXTRA_misc_test_DEPENDENCIES) 
        @rm -f misc_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(misc_test_OBJECTS) $(misc_test_LDADD) $(LIBS)
-multi_file_test$(EXEEXT): $(multi_file_test_OBJECTS) $(multi_file_test_DEPENDENCIES) 
+
+multi_file_test$(EXEEXT): $(multi_file_test_OBJECTS) $(multi_file_test_DEPENDENCIES) $(EXTRA_multi_file_test_DEPENDENCIES) 
        @rm -f multi_file_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(multi_file_test_OBJECTS) $(multi_file_test_LDADD) $(LIBS)
-ogg_test$(EXEEXT): $(ogg_test_OBJECTS) $(ogg_test_DEPENDENCIES) 
+
+ogg_test$(EXEEXT): $(ogg_test_OBJECTS) $(ogg_test_DEPENDENCIES) $(EXTRA_ogg_test_DEPENDENCIES) 
        @rm -f ogg_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(ogg_test_OBJECTS) $(ogg_test_LDADD) $(LIBS)
-pcm_test$(EXEEXT): $(pcm_test_OBJECTS) $(pcm_test_DEPENDENCIES) 
+
+pcm_test$(EXEEXT): $(pcm_test_OBJECTS) $(pcm_test_DEPENDENCIES) $(EXTRA_pcm_test_DEPENDENCIES) 
        @rm -f pcm_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(pcm_test_OBJECTS) $(pcm_test_LDADD) $(LIBS)
-peak_chunk_test$(EXEEXT): $(peak_chunk_test_OBJECTS) $(peak_chunk_test_DEPENDENCIES) 
+
+peak_chunk_test$(EXEEXT): $(peak_chunk_test_OBJECTS) $(peak_chunk_test_DEPENDENCIES) $(EXTRA_peak_chunk_test_DEPENDENCIES) 
        @rm -f peak_chunk_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(peak_chunk_test_OBJECTS) $(peak_chunk_test_LDADD) $(LIBS)
-pipe_test$(EXEEXT): $(pipe_test_OBJECTS) $(pipe_test_DEPENDENCIES) 
+
+pipe_test$(EXEEXT): $(pipe_test_OBJECTS) $(pipe_test_DEPENDENCIES) $(EXTRA_pipe_test_DEPENDENCIES) 
        @rm -f pipe_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(pipe_test_OBJECTS) $(pipe_test_LDADD) $(LIBS)
-raw_test$(EXEEXT): $(raw_test_OBJECTS) $(raw_test_DEPENDENCIES) 
+
+raw_test$(EXEEXT): $(raw_test_OBJECTS) $(raw_test_DEPENDENCIES) $(EXTRA_raw_test_DEPENDENCIES) 
        @rm -f raw_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(raw_test_OBJECTS) $(raw_test_LDADD) $(LIBS)
-rdwr_test$(EXEEXT): $(rdwr_test_OBJECTS) $(rdwr_test_DEPENDENCIES) 
+
+rdwr_test$(EXEEXT): $(rdwr_test_OBJECTS) $(rdwr_test_DEPENDENCIES) $(EXTRA_rdwr_test_DEPENDENCIES) 
        @rm -f rdwr_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(rdwr_test_OBJECTS) $(rdwr_test_LDADD) $(LIBS)
-scale_clip_test$(EXEEXT): $(scale_clip_test_OBJECTS) $(scale_clip_test_DEPENDENCIES) 
+
+scale_clip_test$(EXEEXT): $(scale_clip_test_OBJECTS) $(scale_clip_test_DEPENDENCIES) $(EXTRA_scale_clip_test_DEPENDENCIES) 
        @rm -f scale_clip_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(scale_clip_test_OBJECTS) $(scale_clip_test_LDADD) $(LIBS)
-sfversion$(EXEEXT): $(sfversion_OBJECTS) $(sfversion_DEPENDENCIES) 
+
+sfversion$(EXEEXT): $(sfversion_OBJECTS) $(sfversion_DEPENDENCIES) $(EXTRA_sfversion_DEPENDENCIES) 
        @rm -f sfversion$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sfversion_OBJECTS) $(sfversion_LDADD) $(LIBS)
-stdin_test$(EXEEXT): $(stdin_test_OBJECTS) $(stdin_test_DEPENDENCIES) 
+
+stdin_test$(EXEEXT): $(stdin_test_OBJECTS) $(stdin_test_DEPENDENCIES) $(EXTRA_stdin_test_DEPENDENCIES) 
        @rm -f stdin_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(stdin_test_OBJECTS) $(stdin_test_LDADD) $(LIBS)
-stdio_test$(EXEEXT): $(stdio_test_OBJECTS) $(stdio_test_DEPENDENCIES) 
+
+stdio_test$(EXEEXT): $(stdio_test_OBJECTS) $(stdio_test_DEPENDENCIES) $(EXTRA_stdio_test_DEPENDENCIES) 
        @rm -f stdio_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(stdio_test_OBJECTS) $(stdio_test_LDADD) $(LIBS)
-stdout_test$(EXEEXT): $(stdout_test_OBJECTS) $(stdout_test_DEPENDENCIES) 
+
+stdout_test$(EXEEXT): $(stdout_test_OBJECTS) $(stdout_test_DEPENDENCIES) $(EXTRA_stdout_test_DEPENDENCIES) 
        @rm -f stdout_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(stdout_test_OBJECTS) $(stdout_test_LDADD) $(LIBS)
-string_test$(EXEEXT): $(string_test_OBJECTS) $(string_test_DEPENDENCIES) 
+
+string_test$(EXEEXT): $(string_test_OBJECTS) $(string_test_DEPENDENCIES) $(EXTRA_string_test_DEPENDENCIES) 
        @rm -f string_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(string_test_OBJECTS) $(string_test_LDADD) $(LIBS)
-ulaw_test$(EXEEXT): $(ulaw_test_OBJECTS) $(ulaw_test_DEPENDENCIES) 
+
+ulaw_test$(EXEEXT): $(ulaw_test_OBJECTS) $(ulaw_test_DEPENDENCIES) $(EXTRA_ulaw_test_DEPENDENCIES) 
        @rm -f ulaw_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(ulaw_test_OBJECTS) $(ulaw_test_LDADD) $(LIBS)
-virtual_io_test$(EXEEXT): $(virtual_io_test_OBJECTS) $(virtual_io_test_DEPENDENCIES) 
+
+virtual_io_test$(EXEEXT): $(virtual_io_test_OBJECTS) $(virtual_io_test_DEPENDENCIES) $(EXTRA_virtual_io_test_DEPENDENCIES) 
        @rm -f virtual_io_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(virtual_io_test_OBJECTS) $(virtual_io_test_LDADD) $(LIBS)
-vorbis_test$(EXEEXT): $(vorbis_test_OBJECTS) $(vorbis_test_DEPENDENCIES) 
-       @rm -f vorbis_test$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(vorbis_test_OBJECTS) $(vorbis_test_LDADD) $(LIBS)
-win32_ordinal_test$(EXEEXT): $(win32_ordinal_test_OBJECTS) $(win32_ordinal_test_DEPENDENCIES) 
+
+win32_ordinal_test$(EXEEXT): $(win32_ordinal_test_OBJECTS) $(win32_ordinal_test_DEPENDENCIES) $(EXTRA_win32_ordinal_test_DEPENDENCIES) 
        @rm -f win32_ordinal_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(win32_ordinal_test_OBJECTS) $(win32_ordinal_test_LDADD) $(LIBS)
-win32_test$(EXEEXT): $(win32_test_OBJECTS) $(win32_test_DEPENDENCIES) 
+
+win32_test$(EXEEXT): $(win32_test_OBJECTS) $(win32_test_DEPENDENCIES) $(EXTRA_win32_test_DEPENDENCIES) 
        @rm -f win32_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(win32_test_OBJECTS) $(win32_test_LDADD) $(LIBS)
-write_read_test$(EXEEXT): $(write_read_test_OBJECTS) $(write_read_test_DEPENDENCIES) 
+
+write_read_test$(EXEEXT): $(write_read_test_OBJECTS) $(write_read_test_DEPENDENCIES) $(EXTRA_write_read_test_DEPENDENCIES) 
        @rm -f write_read_test$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(write_read_test_OBJECTS) $(write_read_test_LDADD) $(LIBS)
 
@@ -723,8 +887,11 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aiff_rw_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alaw_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/benchmark.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checksum_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunk_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compression_size_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpp_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft_cmp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither_test.Po@am__quote@
@@ -739,6 +906,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/headerless_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/largefile_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/locale_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/long_read_write_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lossy_comp_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi_file_test.Po@am__quote@
@@ -757,7 +925,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ulaw_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtual_io_test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vorbis_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_ordinal_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_read_test.Po@am__quote@
@@ -765,50 +932,44 @@ distclean-compile:
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 .cc.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
 
 .cc.obj:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .cc.lo:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
        -rm -f *.lo
@@ -816,26 +977,15 @@ mostlyclean-libtool:
 clean-libtool:
        -rm -rf .libs _libs
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -847,15 +997,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -864,6 +1010,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -913,10 +1074,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
 mostlyclean-generic:
 
 clean-generic:
@@ -1003,19 +1169,21 @@ uninstall-am:
 
 .MAKE: check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
        clean-checkPROGRAMS clean-generic clean-libtool clean-local \
-       ctags distclean distclean-compile distclean-generic \
-       distclean-libtool distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
+       cscopelist-am ctags ctags-am distclean distclean-compile \
+       distclean-generic distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am
+       tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
 
 
 #===============================================================================
@@ -1042,31 +1210,31 @@ checkprograms : $(check_PROGRAMS)
 #===============================================================================
 
 write_read_test.c: write_read_test.def write_read_test.tpl
-       autogen --writable write_read_test.def
+       cd $(srcdir) && autogen --writable write_read_test.def && cd $(abs_builddir)
 
 pcm_test.c: pcm_test.def pcm_test.tpl
-       autogen --writable pcm_test.def
+       cd $(srcdir) && autogen --writable pcm_test.def && cd $(abs_builddir)
 
 header_test.c: header_test.def header_test.tpl
-       autogen --writable header_test.def
+       cd $(srcdir) && autogen --writable header_test.def && cd $(abs_builddir)
 
 utils.c utils.h : utils.def utils.tpl
-       autogen --writable utils.def
+       cd $(srcdir) && autogen --writable utils.def && cd $(abs_builddir)
 
 scale_clip_test.c: scale_clip_test.def scale_clip_test.tpl
-       autogen --writable scale_clip_test.def
+       cd $(srcdir) && autogen --writable scale_clip_test.def && cd $(abs_builddir)
 
 pipe_test.c: pipe_test.def pipe_test.tpl
-       autogen --writable pipe_test.def
+       cd $(srcdir) && autogen --writable pipe_test.def && cd $(abs_builddir)
 
 rdwr_test.c: rdwr_test.def rdwr_test.tpl
-       autogen --writable rdwr_test.def
+       cd $(srcdir) && autogen --writable rdwr_test.def && cd $(abs_builddir)
 
 floating_point_test.c: floating_point_test.def floating_point_test.tpl
-       autogen --writable floating_point_test.def
+       cd $(srcdir) && autogen --writable floating_point_test.def && cd $(abs_builddir)
 
 benchmark.c: benchmark.def benchmark.tpl
-       autogen --writable benchmark.def
+       cd $(srcdir) && autogen --writable benchmark.def && cd $(abs_builddir)
 
 genfiles : write_read_test.c pcm_test.c header_test.c utils.c \
                scale_clip_test.c pipe_test.c floating_point_test.c rdwr_test.c \
index 273818d..43d34db 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 */
 
 
-#include       <stdio.h>
-#include       <stdlib.h>
-#include       <string.h>
-#include       <unistd.h>
-#include       <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <inttypes.h>
 
-#include       <sndfile.h>
 
-#include       "utils.h"
+#include <sndfile.h>
+
+#include "utils.h"
 
 
 static unsigned char aifc_data [] =
@@ -152,8 +154,8 @@ rw_test (const char *filename)
                } ;
 
        if (sfinfo_rd.frames != sfinfo_rw.frames)
-       {       printf ("\n\nLine %d : frame count mismatch (rd %ld != rw %ld).\n\n", __LINE__,
-                       SF_COUNT_TO_LONG (sfinfo_rd.frames), SF_COUNT_TO_LONG (sfinfo_rw.frames)) ;
+       {       printf ("\n\nLine %d : frame count mismatch (rd %" PRId64 " != rw %" PRId64 ").\n\n", __LINE__,
+                       sfinfo_rd.frames, sfinfo_rw.frames) ;
                exit (1) ;
                } ;
 
index e25101d..6d71ffe 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -189,48 +189,48 @@ unsigned char alaw_encode (int sample)
                7, 7, 7, 7, 7, 7, 7, 7
                } ;
 
-    int sign, exponent, mantissa ;
-    unsigned char Alawbyte ;
+       int sign, exponent, mantissa ;
+       unsigned char Alawbyte ;
 
-    /* Get the sample into sign-magnitude. */
-    sign = ((~sample) >> 8) & 0x80 ;                   /* set aside the sign */
-    if (sign == 0)
+       /* Get the sample into sign-magnitude. */
+       sign = ((~sample) >> 8) & 0x80 ;                        /* set aside the sign */
+       if (sign == 0)
                sample = -sample ;              /* get magnitude */
-    if (sample > ACLIP)
+       if (sample > ACLIP)
                sample = ACLIP ;                                                /* clip the magnitude */
 
-    /* Convert from 16 bit linear to ulaw. */
-    if (sample >= 256)
+       /* Convert from 16 bit linear to ulaw. */
+       if (sample >= 256)
        {       exponent = exp_lut [(sample >> 8) & 0x7F] ;
-               mantissa = ( sample >> ( exponent + 3 ) ) & 0x0F ;
+               mantissa = (sample >> (exponent + 3)) & 0x0F ;
                Alawbyte = ((exponent << 4) | mantissa) ;
                }
-    else
+       else
                Alawbyte = (sample >> 4) ;
 
        Alawbyte ^= (sign ^ 0x55) ;
 
-    return Alawbyte ;
+       return Alawbyte ;
 } /* alaw_encode */
 
 static
 int alaw_decode (unsigned int Alawbyte)
 {      static int exp_lut [8] = { 0, 264, 528, 1056, 2112, 4224, 8448, 16896 } ;
-    int sign, exponent, mantissa, sample ;
+       int sign, exponent, mantissa, sample ;
 
-    Alawbyte ^= 0x55 ;
-    sign = (Alawbyte & 0x80) ;
-    Alawbyte &= 0x7f ;                 /* get magnitude */
-    if (Alawbyte >= 16)
-       {       exponent = (Alawbyte >> 4 ) & 0x07 ;
+       Alawbyte ^= 0x55 ;
+       sign = (Alawbyte & 0x80) ;
+       Alawbyte &= 0x7f ;                      /* get magnitude */
+       if (Alawbyte >= 16)
+       {       exponent = (Alawbyte >> 4) & 0x07 ;
                mantissa = Alawbyte & 0x0F ;
-               sample = exp_lut [exponent] + (mantissa << ( exponent + 3 )) ;
+               sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ;
                }
-    else
+       else
                sample = (Alawbyte << 4) + 8 ;
-    if (sign == 0)
+       if (sign == 0)
                sample = -sample ;
 
-    return sample ;
+       return sample ;
 } /* alaw_decode */
 
index f33bfee..4983125 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -59,7 +59,7 @@
        #define WRITE_PERMS     (S_IRUSR | S_IWUSR | S_IRGRP)
 #endif
 
-#define        BUFFER_SIZE             (1<<18)
+#define        BUFFER_SIZE             (1 << 18)
 #define        BLOCK_COUNT             (30)
 #define        TEST_DURATION   (5)             /* 5 Seconds. */
 
@@ -328,7 +328,7 @@ calc_int_performance (int format, double read_rate, double write_rate)
        int_data = data ;
        item_count = BUFFER_SIZE ;
        for (k = 0 ; k < item_count ; k++)
-               int_data [k] = 32700.0 * (1<<16) * sin (2 * M_PI * k / 32000.0) ;
+               int_data [k] = 32700.0 * (1 << 16) * sin (2 * M_PI * k / 32000.0) ;
 
        /* Collect write stats */
        printf ("    Write %-5s   to  %s : ", "int", subtype) ;
index f2db29a..382bf3b 100644 (file)
@@ -1,16 +1,16 @@
 autogen definitions benchmark.tpl;
 
-data_type = { 
+data_type = {
        type_name               = short ;
        multiplier              = "32700.0" ;
        };
 
-data_type = { 
+data_type = {
        type_name               = int ;
-       multiplier              = "32700.0 * (1<<16)" ;
+       multiplier              = "32700.0 * (1 << 16)" ;
        };
 
-data_type = { 
+data_type = {
        type_name               = float ;
        multiplier              = "1.0" ;
        };
index 2a3c790..14b22e2 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -60,7 +60,7 @@
        #define WRITE_PERMS     (S_IRUSR | S_IWUSR | S_IRGRP)
 #endif
 
-#define        BUFFER_SIZE             (1<<18)
+#define        BUFFER_SIZE             (1 << 18)
 #define        BLOCK_COUNT             (30)
 #define        TEST_DURATION   (5)             /* 5 Seconds. */
 
diff --git a/tests/channel_test.c b/tests/channel_test.c
new file mode 100644 (file)
index 0000000..6fdb35d
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+** Copyright (C) 2001-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <string.h>
+#include <time.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <math.h>
+
+#include <sndfile.h>
+
+#include "utils.h"
+
+#define        BUFFER_LEN              (1 << 10)
+#define LOG_BUFFER_SIZE        1024
+
+static void    channel_test                    (void) ;
+static double  max_diff                (const float *a, const float *b, unsigned int len, unsigned int * position) ;
+
+int
+main (void) // int argc, char *argv [])
+{      channel_test () ;
+       return 0 ;
+} /* main */
+
+/*============================================================================================
+**     Here are the test functions.
+*/
+
+static void
+channel_test (void)
+{      static float    float_data [1024] ;
+       static float    read_float [1024] ;
+       static int              read_int [1024] ;
+       static short    read_short [1024] ;
+       unsigned int    ch, k, position = 0 ;
+
+       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9) ;
+
+       for (ch = 1 ; ch <= 8 ; ch++)
+       {       SNDFILE *file ;
+               SF_INFO wsfinfo, rsfinfo ;
+               sf_count_t wframes = ARRAY_LEN (float_data) / ch ;
+               double  maxdiff ;
+               char    filename [256] ;
+
+               snprintf (filename, sizeof (filename), "chan_%d.wav", ch) ;
+               print_test_name (__func__, filename) ;
+
+               sf_info_setup (&wsfinfo, SF_FORMAT_WAV | SF_FORMAT_FLOAT, 48000, ch) ;
+               sf_info_clear (&rsfinfo) ;
+
+               /* Write the test file. */
+               file = test_open_file_or_die (filename, SFM_WRITE, &wsfinfo, SF_FALSE, __LINE__) ;
+               test_writef_float_or_die (file, 0, float_data, wframes, __LINE__) ;
+               sf_close (file) ;
+
+               /* Read it as float and test. */
+               file = test_open_file_or_die (filename, SFM_READ, &rsfinfo, SF_FALSE, __LINE__) ;
+               exit_if_true (rsfinfo.frames == 0,
+                               "\n\nLine %d : Frames in file %" PRId64 ".\n\n", __LINE__, rsfinfo.frames) ;
+               exit_if_true (wframes != rsfinfo.frames,
+                               "\n\nLine %d : Wrote %" PRId64 ", read %" PRId64 " frames.\n\n", __LINE__, wframes, rsfinfo.frames) ;
+
+               sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ;
+
+               test_readf_float_or_die (file, 0, read_float, rsfinfo.frames, __LINE__) ;
+               compare_float_or_die (float_data, read_float, ch * rsfinfo.frames, __LINE__) ;
+
+               /* Read it as short and test. */
+               test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ;
+               test_readf_short_or_die (file, 0, read_short, rsfinfo.frames, __LINE__) ;
+
+               for (k = 0 ; k < ARRAY_LEN (read_float) ; k++)
+                       read_float [k] = read_short [k] * (0.9 / 0x8000) ;
+
+               maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames, &position) ;
+               exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f at index %u\n\n", __LINE__, maxdiff, position) ;
+
+               /* Read it as int and test. */
+               test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ;
+               test_readf_int_or_die (file, 0, read_int, rsfinfo.frames, __LINE__) ;
+
+               for (k = 0 ; k < ARRAY_LEN (read_float) ; k++)
+                       read_float [k] = read_int [k] * (0.9 / 0x80000000) ;
+
+               maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames, &position) ;
+               exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f at index %u\n\n", __LINE__, maxdiff, position) ;
+
+               sf_close (file) ;
+               unlink (filename) ;
+               printf ("ok\n") ;
+               } ;
+
+       return ;
+} /* channel_test */
+
+static double
+max_diff (const float *a, const float *b, unsigned int len, unsigned int * position)
+{      double mdiff = 0.0, diff ;
+       unsigned int k ;
+
+       for (k = 0 ; k < len ; k++)
+       {       diff = fabs (a [k] - b [k]) ;
+               if (diff > mdiff)
+               {       mdiff = diff ;
+                       *position = k ;
+                       } ;
+               } ;
+
+       return mdiff ;
+} /* max_diff */
index 544da93..747f233 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2008-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -44,19 +44,19 @@ checksum_orig [] =
 {
        {       SF_FORMAT_RAW | SF_FORMAT_ULAW,
                "checksum.ulaw", "cksum_ulaw.pcm16",
-               0x33aefae029e0c888LL, 0x595cd6e47edd0cffLL
+               0xbd99d34ccbe2fLL, 0xda82168ed82e9LL
                },
        {       SF_FORMAT_RAW | SF_FORMAT_ALAW,
                "checksum.alaw", "cksum_alaw.pcm16",
-               0x48c798da3572d468LL, 0x6837d74869af5bb6LL
+               0x0004afddc0fcf4bdLL, 0x2e7320230b88LL
                },
        {       SF_FORMAT_RAW | SF_FORMAT_GSM610,
                "checksum.gsm", "cksum_gsm.pcm16",
-               0x1b1f64ff2acf858fLL, 0x504179dbadd4bce6LL
+               0xa06a3faaaf684LL, 0x2d7ff668efeb9LL
                },
        {       SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM,
                "checksum.vox", "cksum_vox.pcm16",
-               0xf1147fb3a298f4dfLL, 0xfc9c0cb8b12cb0abLL
+               0x7c9d7afdb96a1LL, 0xe540df74a4b14LL
                },
 } ;
 
diff --git a/tests/chunk_test.c b/tests/chunk_test.c
new file mode 100644 (file)
index 0000000..5a036b1
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+** Copyright (C) 2003-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include       <sndfile.h>
+
+#include       "utils.h"
+
+#define        BUFFER_LEN                      (1 << 10)
+#define LOG_BUFFER_SIZE                1024
+
+static void    chunk_test (const char *filename, int format) ;
+
+static void
+chunk_test_helper (const char *filename, int format, const char * testdata) ;
+
+int
+main (int argc, char *argv [])
+{      int             do_all = 0 ;
+       int             test_count = 0 ;
+
+       if (argc != 2)
+       {       printf ("Usage : %s <test>\n", argv [0]) ;
+               printf ("    Where <test> is one of the following:\n") ;
+               printf ("           wav  - test adding chunks to WAV files\n") ;
+               printf ("           aiff - test adding chunks to AIFF files\n") ;
+               printf ("           all  - perform all tests\n") ;
+               exit (1) ;
+               } ;
+
+       do_all = ! strcmp (argv [1], "all") ;
+
+       if (do_all || ! strcmp (argv [1], "wav"))
+       {       chunk_test ("chunks_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
+               chunk_test ("chunks_pcm16.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
+               chunk_test ("chunks_pcm16.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ;
+               test_count++ ;
+               } ;
+
+       if (do_all || ! strcmp (argv [1], "aiff"))
+       {       chunk_test ("chunks_pcm16.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
+               test_count++ ;
+               } ;
+
+       if (do_all || ! strcmp (argv [1], "caf"))
+       {       chunk_test ("chunks_pcm16.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
+               chunk_test ("chunks_alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16) ;
+               test_count++ ;
+               } ;
+
+       if (test_count == 0)
+       {       printf ("Mono : ************************************\n") ;
+               printf ("Mono : *  No '%s' test defined.\n", argv [1]) ;
+               printf ("Mono : ************************************\n") ;
+               return 1 ;
+               } ;
+
+       return 0 ;
+} /* main */
+
+
+/*============================================================================================
+**     Here are the test functions.
+*/
+
+static void
+chunk_test_helper (const char *filename, int format, const char * testdata)
+{      SNDFILE                 *file ;
+       SF_INFO                 sfinfo ;
+       SF_CHUNK_INFO   chunk_info ;
+       SF_CHUNK_ITERATOR * iterator ;
+       uint32_t                length_before ;
+       int                             err, allow_fd ;
+
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+                       allow_fd = SF_FALSE ;
+                       break ;
+               default :
+                       allow_fd = SF_TRUE ;
+                       break ;
+               } ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.channels         = 1 ;
+       sfinfo.frames           = 0 ;
+       sfinfo.format           = format ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
+
+       /* Set up the chunk to write. */
+       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+       snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
+       chunk_info.id_size = 4 ;
+       chunk_info.data = strdup (testdata) ;
+       chunk_info.datalen = strlen (chunk_info.data) ;
+
+       length_before = chunk_info.datalen ;
+
+       err = sf_set_chunk (file, &chunk_info) ;
+       exit_if_true (
+               err != SF_ERR_NO_ERROR,
+               "\n\nLine %d : sf_set_chunk returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
+               ) ;
+
+       memset (chunk_info.data, 0, chunk_info.datalen) ;
+       free (chunk_info.data) ;
+
+       sf_close (file) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
+
+       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+       snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
+       chunk_info.id_size = 4 ;
+
+       iterator = sf_get_chunk_iterator (file, &chunk_info) ;
+       err = sf_get_chunk_size (iterator, &chunk_info) ;
+       exit_if_true (
+               err != SF_ERR_NO_ERROR,
+               "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
+               ) ;
+
+       exit_if_true (
+               length_before > chunk_info.datalen || chunk_info.datalen - length_before > 4,
+               "\n\nLine %d : testdata '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, testdata, chunk_info.datalen, length_before
+               ) ;
+
+       chunk_info.data = malloc (chunk_info.datalen) ;
+       err = sf_get_chunk_data (iterator, &chunk_info) ;
+       exit_if_true (
+               err != SF_ERR_NO_ERROR,
+               "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err)
+               ) ;
+
+       exit_if_true (
+               memcmp (testdata, chunk_info.data, length_before),
+               "\n\nLine %d : Data compare failed.\n    %s\n    %s\n\n", __LINE__, testdata, (char*) chunk_info.data
+               ) ;
+
+       free (chunk_info.data) ;
+
+       sf_close (file) ;
+       unlink (filename) ;
+} /* chunk_test_helper */
+
+static void
+multichunk_test_helper (const char *filename, int format, const char * testdata [], size_t testdata_len)
+{      SNDFILE                 *file ;
+       SF_INFO                 sfinfo ;
+       SF_CHUNK_INFO   chunk_info ;
+       SF_CHUNK_ITERATOR * iterator ;
+       uint32_t                length_before [testdata_len] ;
+       int                             err, allow_fd ;
+       size_t                  i ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.channels         = 1 ;
+       sfinfo.frames           = 0 ;
+       sfinfo.format           = format ;
+
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+                       allow_fd = SF_FALSE ;
+                       break ;
+               default :
+                       allow_fd = SF_TRUE ;
+                       break ;
+               } ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
+
+       /* Set up the chunk to write. */
+       for (i = 0 ; i < testdata_len ; i++)
+       {       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+               snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
+               chunk_info.id_size = 4 ;
+
+               chunk_info.data = strdup (testdata [i]) ;
+               chunk_info.datalen = strlen (chunk_info.data) ;
+
+               length_before [i] = chunk_info.datalen ;
+
+               err = sf_set_chunk (file, &chunk_info) ;
+               exit_if_true (
+                       err != SF_ERR_NO_ERROR,
+                       "\n\nLine %d : sf_set_chunk returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
+                       ) ;
+
+               memset (chunk_info.data, 0, chunk_info.datalen) ;
+               free (chunk_info.data) ;
+       }
+
+       sf_close (file) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
+
+       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+       snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ;
+       chunk_info.id_size = 4 ;
+
+       iterator = sf_get_chunk_iterator (file, &chunk_info) ;
+
+       i = 0 ;
+       while (iterator)
+       {       memset (&chunk_info, 0, sizeof (chunk_info)) ;
+               err = sf_get_chunk_size (iterator, &chunk_info) ;
+               exit_if_true (
+                       i > testdata_len,
+                       "\n\nLine %d : iterated to chunk #%d, but only %d chunks have been written\n\n", __LINE__, (int) i, (int) testdata_len
+                       ) ;
+
+               exit_if_true (
+                       err != SF_ERR_NO_ERROR,
+                       "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
+                       ) ;
+
+               exit_if_true (
+                       length_before [i] > chunk_info.datalen || chunk_info.datalen - length_before [i] > 4,
+                       "\n\nLine %d : testdata[%d] '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, (int) i, testdata [i], chunk_info.datalen, length_before [i]
+                       ) ;
+
+               chunk_info.data = malloc (chunk_info.datalen) ;
+               err = sf_get_chunk_data (iterator, &chunk_info) ;
+               exit_if_true (
+                       err != SF_ERR_NO_ERROR,
+                       "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err)
+                       ) ;
+
+               exit_if_true (
+                       4 != chunk_info.id_size,
+                       "\n\nLine %d : testdata[%d] : Bad ID length %u (previous length %u)\n\n", __LINE__, (int) i, chunk_info.id_size, 4
+                       ) ;
+               exit_if_true (
+                       memcmp ("Test", chunk_info.id, 4),
+                       "\n\nLine %d : ID compare failed at %d.\n    %s\n    %s\n\n", __LINE__, (int) i, "Test", (char*) chunk_info.id
+                       ) ;
+
+               exit_if_true (
+                       memcmp (testdata [i], chunk_info.data, length_before [i]),
+                       "\n\nLine %d : Data compare failed at %d.\n    %s\n    %s\n\n", __LINE__, (int) i, testdata [i], (char*) chunk_info.data
+                       ) ;
+
+               free (chunk_info.data) ;
+               iterator = sf_next_chunk_iterator (iterator) ;
+               i++ ;
+       }
+
+       sf_close (file) ;
+       unlink (filename) ;
+} /* multichunk_test_helper */
+
+
+static void
+chunk_test (const char *filename, int format)
+{      const char*             testdata [] =
+       {       "There can be only one.", "", "A", "AB", "ABC", "ABCD", "ABCDE" } ;
+       uint32_t k ;
+
+       print_test_name (__func__, filename) ;
+
+       for (k = 0 ; k < ARRAY_LEN (testdata) ; k++)
+               chunk_test_helper (filename, format, testdata [k]) ;
+
+       multichunk_test_helper (filename, format, testdata, ARRAY_LEN (testdata)) ;
+
+       puts ("ok") ;
+} /* chunk_test */
index be74804..1596bcb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -20,6 +20,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdint.h>
+#include <inttypes.h>
 #include <string.h>
 #include <time.h>
 
 
 #include "utils.h"
 
-#define        BUFFER_LEN              (1<<10)
+#define        BUFFER_LEN              (1 << 10)
 #define LOG_BUFFER_SIZE        1024
 
 static void    float_norm_test                 (const char *filename) ;
 static void    double_norm_test                (const char *filename) ;
 static void    format_tests                    (void) ;
-static void    calc_peak_test                  (int filetype, const char *filename) ;
+static void    calc_peak_test                  (int filetype, const char *filename, int channels) ;
 static void    truncate_test                   (const char *filename, int filetype) ;
 static void    instrument_test                 (const char *filename, int filetype) ;
 static void    channel_map_test                (const char *filename, int filetype) ;
@@ -51,6 +53,10 @@ static       void    broadcast_rdwr_test             (const char *filename, int filetype) ;
 static void    broadcast_coding_history_test   (const char *filename) ;
 static void    broadcast_coding_history_size   (const char *filename) ;
 
+/* Cart Chunk tests */
+static void    cart_test                       (const char *filename, int filetype) ;
+static void    cart_rdwr_test                  (const char *filename, int filetype) ;
+
 /* Force the start of this buffer to be double aligned. Sparc-solaris will
 ** choke if its not.
 */
@@ -76,12 +82,13 @@ main (int argc, char *argv [])
                printf ("           chanmap - test set/get of channel map data..\n") ;
                printf ("           bext    - test set/get of SF_BROADCAST_INFO.\n") ;
                printf ("           bextch  - test set/get of SF_BROADCAST_INFO coding_history.\n") ;
+               printf ("           cart    - test set/get of SF_CART_INFO.\n") ;
                printf ("           rawend  - test SFC_RAW_NEEDS_ENDSWAP.\n") ;
                printf ("           all     - perform all tests\n") ;
                exit (1) ;
                } ;
 
-       do_all =! strcmp (argv [1], "all") ;
+       do_all = ! strcmp (argv [1], "all") ;
 
        if (do_all || strcmp (argv [1], "ver") == 0)
        {       char buffer [128] ;
@@ -107,8 +114,10 @@ main (int argc, char *argv [])
                } ;
 
        if (do_all || strcmp (argv [1], "peak") == 0)
-       {       calc_peak_test (SF_ENDIAN_BIG           | SF_FORMAT_RAW, "be-peak.raw") ;
-               calc_peak_test (SF_ENDIAN_LITTLE        | SF_FORMAT_RAW, "le-peak.raw") ;
+       {       calc_peak_test (SF_ENDIAN_BIG           | SF_FORMAT_RAW, "be-peak.raw", 1) ;
+               calc_peak_test (SF_ENDIAN_LITTLE        | SF_FORMAT_RAW, "le-peak.raw", 1) ;
+               calc_peak_test (SF_ENDIAN_BIG           | SF_FORMAT_RAW, "be-peak.raw", 7) ;
+               calc_peak_test (SF_ENDIAN_LITTLE        | SF_FORMAT_RAW, "le-peak.raw", 7) ;
                test_count ++ ;
                } ;
 
@@ -147,6 +156,14 @@ main (int argc, char *argv [])
                test_count ++ ;
                } ;
 
+       if (do_all || strcmp (argv [1], "cart") == 0)
+       {       cart_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
+               cart_rdwr_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
+               cart_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
+               cart_rdwr_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
+               test_count ++ ;
+               } ;
+
        if (do_all || strcmp (argv [1], "bextch") == 0)
        {       broadcast_coding_history_test ("coding_history.wav") ;
                broadcast_coding_history_size ("coding_hist_size.wav") ;
@@ -241,7 +258,7 @@ float_norm_test (const char *filename)
                } ;
 
        if (sfinfo.frames != BUFFER_LEN)
-       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_LEN, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -357,7 +374,7 @@ double_norm_test (const char *filename)
                } ;
 
        if (sfinfo.frames != BUFFER_LEN)
-       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_LEN, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -513,28 +530,34 @@ format_tests      (void)
 } /* format_tests */
 
 static void
-calc_peak_test (int filetype, const char *filename)
+calc_peak_test (int filetype, const char *filename, int channels)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
+       char            label [128] ;
        int                     k, format ;
+       sf_count_t      buffer_len, frame_count ;
        double          peak ;
 
-       print_test_name ("calc_peak_test", filename) ;
+       snprintf (label, sizeof (label), "calc_peak_test (%d channels)", channels) ;
+       print_test_name (label, filename) ;
+
+       format = filetype | SF_FORMAT_PCM_16 ;
 
-       format = (filetype | SF_FORMAT_PCM_16) ;
+       buffer_len = BUFFER_LEN - (BUFFER_LEN % channels) ;
+       frame_count = buffer_len / channels ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.format           = format ;
-       sfinfo.channels         = 1 ;
-       sfinfo.frames           = BUFFER_LEN ;
+       sfinfo.channels         = channels ;
+       sfinfo.frames           = frame_count ;
 
        /* Create double_data with max value of 0.5. */
-       for (k = 0 ; k < BUFFER_LEN ; k++)
-               double_data [k] = (k + 1) / (2.0 * BUFFER_LEN) ;
+       for (k = 0 ; k < buffer_len ; k++)
+               double_data [k] = (k + 1) / (2.0 * buffer_len) ;
 
        file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
 
-       test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
+       test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ;
 
        sf_close (file) ;
 
@@ -545,12 +568,12 @@ calc_peak_test (int filetype, const char *filename)
                exit (1) ;
                } ;
 
-       if (sfinfo.frames != BUFFER_LEN)
-       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_LEN, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       if (sfinfo.frames != frame_count)
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
-       if (sfinfo.channels != 1)
+       if (sfinfo.channels != channels)
        {       printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
                exit (1) ;
                } ;
@@ -572,16 +595,16 @@ calc_peak_test (int filetype, const char *filename)
        format = (filetype | SF_FORMAT_FLOAT) ;
        sfinfo.samplerate       = 44100 ;
        sfinfo.format           = format ;
-       sfinfo.channels         = 1 ;
-       sfinfo.frames           = BUFFER_LEN ;
+       sfinfo.channels         = channels ;
+       sfinfo.frames           = frame_count ;
 
        /* Create double_data with max value of 0.5. */
-       for (k = 0 ; k < BUFFER_LEN ; k++)
-               double_data [k] = (k + 1) / (2.0 * BUFFER_LEN) ;
+       for (k = 0 ; k < buffer_len ; k++)
+               double_data [k] = (k + 1) / (2.0 * buffer_len) ;
 
        file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
 
-       test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
+       test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ;
 
        sf_close (file) ;
 
@@ -592,12 +615,12 @@ calc_peak_test (int filetype, const char *filename)
                exit (1) ;
                } ;
 
-       if (sfinfo.frames != BUFFER_LEN)
-       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_LEN, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       if (sfinfo.frames != frame_count)
+       {       printf ("\n\nLine %d: Incorrect number of.frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
-       if (sfinfo.channels != 1)
+       if (sfinfo.channels != channels)
        {       printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
                exit (1) ;
                } ;
@@ -699,8 +722,8 @@ instrument_test (const char *filename, int filetype)
                }
        } ;
        SF_INSTRUMENT read_inst ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
 
        print_test_name ("instrument_test", filename) ;
 
@@ -824,8 +847,8 @@ current_sf_info_test        (const char *filename)
        sf_command (outfile, SFC_GET_CURRENT_SF_INFO, &outinfo, sizeof (outinfo)) ;
 
        exit_if_true (outinfo.frames != BUFFER_LEN,
-               "\n\nLine %d : Initial sfinfo.frames (%ld) should be %d.\n\n", __LINE__,
-               SF_COUNT_TO_LONG (outinfo.frames), BUFFER_LEN
+               "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__,
+               outinfo.frames, BUFFER_LEN
                ) ;
 
        /* Read file making sure no channel map exists. */
@@ -837,8 +860,8 @@ current_sf_info_test        (const char *filename)
        sf_command (infile, SFC_GET_CURRENT_SF_INFO, &ininfo, sizeof (ininfo)) ;
 
        exit_if_true (ininfo.frames != BUFFER_LEN,
-               "\n\nLine %d : Initial sfinfo.frames (%ld) should be %d.\n\n", __LINE__,
-               SF_COUNT_TO_LONG (ininfo.frames), BUFFER_LEN
+               "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__,
+               ininfo.frames, BUFFER_LEN
                ) ;
 
        sf_close (outfile) ;
@@ -851,8 +874,8 @@ current_sf_info_test        (const char *filename)
 static void
 broadcast_test (const char *filename, int filetype)
 {      static SF_BROADCAST_INFO bc_write, bc_read ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
        int errors = 0 ;
 
        print_test_name ("broadcast_test", filename) ;
@@ -967,7 +990,7 @@ broadcast_rdwr_test (const char *filename, int filetype)
 
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
        sf_close (file) ;
-       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %lld should be %lld.\n", __LINE__, sfinfo.frames, frames) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
 
        unlink (filename) ;
        puts ("ok") ;
@@ -976,8 +999,8 @@ broadcast_rdwr_test (const char *filename, int filetype)
 static void
 check_coding_history_newlines (const char *filename)
 {      static SF_BROADCAST_INFO bc_write, bc_read ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
        unsigned k ;
 
        sfinfo.samplerate       = 22050 ;
@@ -1046,8 +1069,8 @@ check_coding_history_newlines (const char *filename)
 static void
 broadcast_coding_history_test (const char *filename)
 {      static SF_BROADCAST_INFO bc_write, bc_read ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
        const char *default_history = "A=PCM,F=22050,W=16,M=mono" ;
        const char *supplied_history =
                                        "A=PCM,F=44100,W=24,M=mono,T=other\r\n"
@@ -1150,8 +1173,8 @@ broadcast_coding_history_size (const char *filename)
 {      /* SF_BROADCAST_INFO struct with coding_history field of 1024 bytes. */
        static SF_BROADCAST_INFO_VAR (1024) bc_write ;
        static SF_BROADCAST_INFO_VAR (1024) bc_read ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
        int k ;
 
        print_test_name (__func__, filename) ;
@@ -1210,11 +1233,222 @@ broadcast_coding_history_size (const char *filename)
 
 /*==============================================================================
 */
+static void
+cart_test (const char *filename, int filetype)
+{      static SF_CART_INFO ca_write, ca_read ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
+       int errors = 0 ;
+
+       print_test_name ("cart_test", filename) ;
+
+       sfinfo.samplerate       = 11025 ;
+       sfinfo.format           = filetype ;
+       sfinfo.channels         = 1 ;
+       memset (&ca_write, 0, sizeof (ca_write)) ;
+
+       // example test data
+       snprintf (ca_write.artist, sizeof (ca_write.artist), "Test artist") ;
+       snprintf (ca_write.version, sizeof (ca_write.version), "Test version") ;
+       snprintf (ca_write.cut_id, sizeof (ca_write.cut_id), "Test cut ID") ;
+       snprintf (ca_write.client_id, sizeof (ca_write.client_id), "Test client ID") ;
+       snprintf (ca_write.category, sizeof (ca_write.category), "Test category") ;
+       snprintf (ca_write.classification, sizeof (ca_write.classification), "Test classification") ;
+       snprintf (ca_write.out_cue, sizeof (ca_write.out_cue), "Test out cue") ;
+       snprintf (ca_write.start_date, sizeof (ca_write.start_date), "%d/%02d/%02d", 2006, 3, 30) ;
+       snprintf (ca_write.start_time, sizeof (ca_write.start_time), "%02d:%02d:%02d", 20, 27, 0) ;
+       snprintf (ca_write.end_date, sizeof (ca_write.end_date), "%d/%02d/%02d", 2006, 3, 30) ;
+       snprintf (ca_write.end_time, sizeof (ca_write.end_time), "%02d:%02d:%02d", 20, 27, 0) ;
+       snprintf (ca_write.producer_app_id, sizeof (ca_write.producer_app_id), "Test producer app id") ;
+       snprintf (ca_write.producer_app_version, sizeof (ca_write.producer_app_version), "Test producer app version") ;
+       snprintf (ca_write.user_def, sizeof (ca_write.user_def), "test user def test test") ;
+       ca_write.level_reference = 42 ;
+       snprintf (ca_write.url, sizeof (ca_write.url), "http://www.test.com/test_url") ;
+       snprintf (ca_write.tag_text, sizeof (ca_write.tag_text), "tag text test! \r\n") ; // must be terminated \r\n to be valid
+       ca_write.tag_text_size = strlen (ca_write.tag_text) ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+       if (sf_command (file, SFC_SET_CART_INFO, &ca_write, sizeof (ca_write)) == SF_FALSE)
+               exit (1) ;
+
+       test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
+       sf_close (file) ;
+
+       memset (&ca_read, 0, sizeof (ca_read)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+       if (sf_command (file, SFC_GET_CART_INFO, &ca_read, sizeof (ca_read)) == SF_FALSE)
+       {       printf ("\n\nLine %d : sf_command (SFC_GET_CART_INFO) failed.\n\n", __LINE__) ;
+               exit (1) ;
+               return ;
+               } ;
+       check_log_buffer_or_die (file, __LINE__) ;
+       sf_close (file) ;
+
+
+       if (memcmp (ca_write.artist, ca_read.artist, sizeof (ca_write.artist)) != 0)
+       {       printf ("\n\nLine %d : artist mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.artist, ca_read.artist) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.version, ca_read.version, sizeof (ca_write.version)) != 0)
+       {       printf ("\n\nLine %d : version mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.version, ca_read.version) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.title, ca_read.title, sizeof (ca_write.title)) != 0)
+       {       printf ("\n\nLine %d : title mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.title, ca_read.title) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.cut_id, ca_read.cut_id, sizeof (ca_write.cut_id)) != 0)
+       {       printf ("\n\nLine %d : cut_id mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.cut_id, ca_read.cut_id) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.client_id, ca_read.client_id, sizeof (ca_write.client_id)) != 0)
+       {       printf ("\n\nLine %d : client_id mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.client_id, ca_read.client_id) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.category, ca_read.category, sizeof (ca_write.category)) != 0)
+       {       printf ("\n\nLine %d : category mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.category, ca_read.category) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.out_cue, ca_read.out_cue, sizeof (ca_write.out_cue)) != 0)
+       {       printf ("\n\nLine %d : out_cue mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.out_cue, ca_read.out_cue) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.start_date, ca_read.start_date, sizeof (ca_write.start_date)) != 0)
+       {       printf ("\n\nLine %d : start_date mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.start_date, ca_read.start_date) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.start_time, ca_read.start_time, sizeof (ca_write.start_time)) != 0)
+       {       printf ("\n\nLine %d : start_time mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.start_time, ca_read.start_time) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.end_date, ca_read.end_date, sizeof (ca_write.end_date)) != 0)
+       {       printf ("\n\nLine %d : end_date mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.end_date, ca_read.end_date) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.end_time, ca_read.end_time, sizeof (ca_write.end_time)) != 0)
+       {       printf ("\n\nLine %d : end_time mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.end_time, ca_read.end_time) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.producer_app_id, ca_read.producer_app_id, sizeof (ca_write.producer_app_id)) != 0)
+       {       printf ("\n\nLine %d : producer_app_id mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.producer_app_id, ca_read.producer_app_id) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.producer_app_version, ca_read.producer_app_version, sizeof (ca_write.producer_app_version)) != 0)
+       {       printf ("\n\nLine %d : producer_app_version mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.producer_app_version, ca_read.producer_app_version) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.user_def, ca_read.user_def, sizeof (ca_write.user_def)) != 0)
+       {       printf ("\n\nLine %d : user_def mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.user_def, ca_read.user_def) ;
+               errors ++ ;
+               } ;
+
+
+       if (ca_write.level_reference != ca_read.level_reference)
+       {       printf ("\n\nLine %d : level_reference mismatch :\n\twrite : '%d'\n\tread  : '%d'\n\n", __LINE__, ca_write.level_reference, ca_read.level_reference) ;
+               errors ++ ;
+               } ;
+
+       // TODO: make this more helpful
+       if (memcmp (ca_write.post_timers, ca_read.post_timers, sizeof (ca_write.post_timers)) != 0)
+       {       printf ("\n\nLine %d : post_timers mismatch :\n'\n\n", __LINE__) ;
+               errors ++ ;
+               } ;
+
+       if (memcmp (ca_write.url, ca_read.url, sizeof (ca_write.url)) != 0)
+       {       printf ("\n\nLine %d : url mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.url, ca_read.url) ;
+               errors ++ ;
+               } ;
+
+
+       if (memcmp (ca_write.tag_text, ca_read.tag_text, (size_t) (ca_read.tag_text_size)) != 0)
+       {       printf ("\n\nLine %d : tag_text mismatch :\n\twrite : '%s'\n\tread  : '%s'\n\n", __LINE__, ca_write.tag_text, ca_read.tag_text) ;
+               errors ++ ;
+               } ;
+
+
+       if (errors)
+               exit (1) ;
+
+       unlink (filename) ;
+       puts ("ok") ;
+} /* cart_test */
+
+static void
+cart_rdwr_test (const char *filename, int filetype)
+{      SF_CART_INFO cinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
+       sf_count_t frames ;
+
+       print_test_name (__func__, filename) ;
+
+       create_short_sndfile (filename, filetype, 2) ;
+
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+       memset (&cinfo, 0, sizeof (cinfo)) ;
+
+       snprintf (cinfo.artist, sizeof (cinfo.artist), "Test artist") ;
+       snprintf (cinfo.version, sizeof (cinfo.version), "Test version") ;
+       snprintf (cinfo.cut_id, sizeof (cinfo.cut_id), "Test cut ID") ;
+       snprintf (cinfo.client_id, sizeof (cinfo.client_id), "Test client ID") ;
+       snprintf (cinfo.category, sizeof (cinfo.category), "Test category") ;
+       snprintf (cinfo.classification, sizeof (cinfo.classification), "Test classification") ;
+       snprintf (cinfo.out_cue, sizeof (cinfo.out_cue), "Test out cue") ;
+       snprintf (cinfo.start_date, sizeof (cinfo.start_date), "%d/%02d/%02d", 2006, 3, 30) ;
+       snprintf (cinfo.start_time, sizeof (cinfo.start_time), "%02d:%02d:%02d", 20, 27, 0) ;
+       snprintf (cinfo.end_date, sizeof (cinfo.end_date), "%d/%02d/%02d", 2006, 3, 30) ;
+       snprintf (cinfo.end_time, sizeof (cinfo.end_time), "%02d:%02d:%02d", 20, 27, 0) ;
+       snprintf (cinfo.producer_app_id, sizeof (cinfo.producer_app_id), "Test producer app id") ;
+       snprintf (cinfo.producer_app_version, sizeof (cinfo.producer_app_version), "Test producer app version") ;
+       snprintf (cinfo.user_def, sizeof (cinfo.user_def), "test user def test test") ;
+       cinfo.level_reference = 42 ;
+       snprintf (cinfo.url, sizeof (cinfo.url), "http://www.test.com/test_url") ;
+       snprintf (cinfo.tag_text, sizeof (cinfo.tag_text), "tag text test!\r\n") ;
+       cinfo.tag_text_size = strlen (cinfo.tag_text) ;
+
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
+       frames = sfinfo.frames ;
+       if (sf_command (file, SFC_SET_CART_INFO, &cinfo, sizeof (cinfo)) != SF_FALSE)
+       {       printf ("\n\nLine %d : sf_command (SFC_SET_CART_INFO) should have failed but didn't.\n\n", __LINE__) ;
+               exit (1) ;
+               } ;
+       sf_close (file) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+       sf_close (file) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
+
+       unlink (filename) ;
+       puts ("ok") ;
+} /* cart_rdwr_test */
+
+/*==============================================================================
+*/
 
 static void
 channel_map_test (const char *filename, int filetype)
-{      SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
        int channel_map_read [4], channel_map_write [4] =
        {       SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE,
                SF_CHANNEL_MAP_REAR_CENTER
@@ -1283,8 +1517,8 @@ raw_needs_endswap_test (const char *filename, int filetype)
        {       SF_FORMAT_FLOAT, SF_FORMAT_DOUBLE,
                SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
                } ;
-       SNDFILE  *file ;
-       SF_INFO  sfinfo ;
+       SNDFILE *file ;
+       SF_INFO sfinfo ;
        unsigned k ;
        int needs_endswap ;
 
similarity index 66%
rename from tests/vorbis_test.c
rename to tests/compression_size_test.c
index 9f5797f..c293852 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 #include       "dft_cmp.h"
 
 #define        SAMPLE_RATE             16000
-#define        DATA_LENGTH             (SAMPLE_RATE / 8)
+#define        DATA_LENGTH             (SAMPLE_RATE)
 
 static float data_out [DATA_LENGTH] ;
 
@@ -96,81 +96,106 @@ vorbis_test (void)
        for (k = 0 ; k < ARRAY_LEN (float_data) ; k ++)
                max_abs = max_float (max_abs, fabs (float_data [k])) ;
 
-       if (max_abs > 1.021)
-       {       printf ("\n\n    Error : max_abs %f should be < 1.021.\n\n", max_abs) ;
-               exit (1) ;
-               } ;
+       exit_if_true (max_abs > 1.023,
+               "\n\nLine %d : max_abs %f should be < 1.023.\n\n", __LINE__, max_abs) ;
 
        puts ("ok") ;
        unlink (filename) ;
 } /* vorbis_test */
 
 static void
-vorbis_quality_test (void)
+compression_size_test (int format, const char * filename)
 {      /*
        **      Encode two files, one at quality 0.3 and one at quality 0.5 and then
        **      make sure that the quality 0.3 files is the smaller of the two.
        */
-       const char * q3_fname = "q3_vorbis.oga" ;
-       const char * q5_fname = "q5_vorbis.oga" ;
+       char q3_fname [64] ;
+       char q6_fname [64] ;
+       char test_name [64] ;
 
-       SNDFILE *q3_file, *q5_file ;
+       SNDFILE *q3_file, *q6_file ;
        SF_INFO sfinfo ;
-       int q3_size, q5_size ;
+       int q3_size, q6_size ;
        double quality ;
        int k ;
 
-       print_test_name (__func__, "q[35]_vorbis.oga") ;
+       snprintf (q3_fname, sizeof (q3_fname), "q3_%s", filename) ;
+       snprintf (q6_fname, sizeof (q6_fname), "q6_%s", filename) ;
+
+       snprintf (test_name, sizeof (test_name), "q[36]_%s", filename) ;
+       print_test_name (__func__, test_name) ;
 
        memset (&sfinfo, 0, sizeof (sfinfo)) ;
 
        /* Set up output file type. */
-       sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
+       sfinfo.format = format ;
        sfinfo.channels = 1 ;
        sfinfo.samplerate = SAMPLE_RATE ;
 
        /* Write the output file. */
        q3_file = test_open_file_or_die (q3_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
-       q5_file = test_open_file_or_die (q5_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
+       q6_file = test_open_file_or_die (q6_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
 
        quality = 0.3 ;
        sf_command (q3_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ;
-       quality = 0.5 ;
-       sf_command (q5_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ;
+       quality = 0.6 ;
+       sf_command (q6_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ;
 
        for (k = 0 ; k < 5 ; k++)
-       {       gen_lowpass_noise_float (data_out, ARRAY_LEN (data_out)) ;
+       {       gen_lowpass_signal_float (data_out, ARRAY_LEN (data_out)) ;
                test_write_float_or_die (q3_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ;
-               test_write_float_or_die (q5_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ;
+               test_write_float_or_die (q6_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ;
                } ;
 
        sf_close (q3_file) ;
-       sf_close (q5_file) ;
+       sf_close (q6_file) ;
 
        q3_size = file_length (q3_fname) ;
-       q5_size = file_length (q5_fname) ;
+       q6_size = file_length (q6_fname) ;
 
-       if (q3_size >= q5_size)
-       {       printf ("\n\nLine %d : q3 size (%d) >= q5 size (%d)\n\n", __LINE__, q3_size, q5_size) ;
-               exit (1) ;
-               } ;
+       exit_if_true (q3_size >= q6_size,
+               "\n\nLine %d : q3 size (%d) >= q6 size (%d)\n\n", __LINE__, q3_size, q6_size) ;
 
        puts ("ok") ;
        unlink (q3_fname) ;
-       unlink (q5_fname) ;
-} /* vorbis_quality_test */
+       unlink (q6_fname) ;
+} /* compression_size_test */
 
 
 
 int
-main (void)
-{
-       if (HAVE_EXTERNAL_LIBS)
+main (int argc, char *argv [])
+{      int all_tests = 0, tests = 0 ;
+
+       if (argc != 2)
+       {       printf (
+                       "Usage : %s <test>\n"
+                       "    Where <test> is one of:\n"
+                       "        vorbis - test Ogg/Vorbis\n"
+                       "        flac   - test FLAC\n"
+                       "        all    - perform all tests\n",
+                       argv [0]) ;
+               exit (0) ;
+               } ;
+
+       if (! HAVE_EXTERNAL_LIBS)
+       {       puts ("    No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ;
+               return 0 ;
+       } ;
+
+       if (strcmp (argv [1], "all") == 0)
+               all_tests = 1 ;
+
+       if (all_tests || strcmp (argv [1], "vorbis") == 0)
        {       vorbis_test () ;
-               vorbis_quality_test () ;
-               }
-       else
-               puts ("    No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ;
+               compression_size_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS, "vorbis.oga") ;
+               tests ++ ;
+               } ;
+
+       if (all_tests || strcmp (argv [1], "flac") == 0)
+       {       compression_size_test (SF_FORMAT_FLAC | SF_FORMAT_PCM_16, "pcm16.flac") ;
+               tests ++ ;
+               } ;
 
        return 0 ;
 } /* main */
index 752f00e..364ec86 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -159,7 +159,7 @@ read_file (const char * filename, int format)
 
        if (file.frames () != ARRAY_LEN (sbuffer) * 4)
        {       printf ("\n\n%s %d : Error : frames %ld should be %lu.\n\n", __func__, __LINE__,
-                               SF_COUNT_TO_LONG (file.frames ()), (long unsigned int) ARRAY_LEN (sbuffer) * 4 / 2) ;
+                               (long) file.frames (), (long) ARRAY_LEN (sbuffer) * 4 / 2) ;
                exit (1) ;
                } ;
 
@@ -187,14 +187,14 @@ read_file (const char * filename, int format)
        count = file.seek (file.frames () - 10, SEEK_SET) ;
        if (count != file.frames () - 10)
        {       printf ("\n\n%s %d : Error : offset (%ld) should be %ld\n\n", __func__, __LINE__,
-                               SF_COUNT_TO_LONG (count), SF_COUNT_TO_LONG (file.frames () - 10)) ;
+                               (long) count, (long) (file.frames () - 10)) ;
                exit (1) ;
                } ;
 
        count = file.read (sbuffer, ARRAY_LEN (sbuffer)) ;
        if (count != 10 * file.channels ())
        {       printf ("\n\n%s %d : Error : count (%ld) should be %ld\n\n", __func__, __LINE__,
-                               SF_COUNT_TO_LONG (count), SF_COUNT_TO_LONG (10 * file.channels ())) ;
+                               (long) count, (long) (10 * file.channels ())) ;
                exit (1) ;
                } ;
 
@@ -225,7 +225,7 @@ ceeplusplus_extra_test (void)
 
        error = file.error () ;
        if (error == 0)
-       {       printf ("\n\n%s %d : error should be zero.\n\n", __func__, __LINE__) ;
+       {       printf ("\n\n%s %d : error should not be zero.\n\n", __func__, __LINE__) ;
                exit (1) ;
                } ;
 
index c902769..b94b6a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -123,9 +123,9 @@ dft_magnitude (const double *data, double *spectrum)
                spectrum [k] = sqrt (real_part * real_part + imag_part * imag_part) ;
                } ;
 
-       spectrum [k] = 0.0 ;
+       spectrum [DFT_SPEC_LENGTH - 1] = 0.0 ;
 
-       spectrum [0] = spectrum [1] = spectrum [2] = spectrum [3] = spectrum [4] = 0.0 ;
+       spectrum [0] = spectrum [1] = spectrum [2] = 0.0 ;
 
        return ;
 } /* dft_magnitude */
index 3cbdd11..faa5fe0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 */
 
 
-#define                DFT_DATA_LENGTH         (2048)
+#define                DFT_DATA_LENGTH         (8192)
 
 double dft_cmp_float (int linenum, const float *orig, const float *test, int len, double tolerance, int allow_exit) ;
 
index 6c570ff..e9eef7c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 
 #include       "utils.h"
 
-#define        BUFFER_LEN              (1<<16)
+#define        BUFFER_LEN              (1 << 16)
 #define LOG_BUFFER_SIZE        1024
 
 static void    dither_test (const char *filename, int filetype) ;
@@ -52,7 +52,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all=!strcmp (argv [1], "all") ;
+       do_all = ! strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "wav"))
        {       dither_test ("dither.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ;
@@ -135,8 +135,6 @@ dither_test (const char *filename, int filetype)
        SF_INFO                 sfinfo ;
        SF_DITHER_INFO  dither ;
 
-       filetype = filetype ;
-
        print_test_name ("dither_test", filename) ;
 
        sfinfo.samplerate       = 44100 ;
index 2bd11d1..57bdfac 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -62,7 +62,7 @@ dwvw_test (const char *filename, int format, int bit_width)
        srand (123456) ;
 
        /* Only want to grab the top bit_width bits. */
-       bit_mask = (-1 << (32 - bit_width)) ;
+       bit_mask = arith_shift_left (-1, 32 - bit_width) ;
 
        print_test_name ("dwvw_test", filename) ;
 
@@ -77,7 +77,7 @@ dwvw_test (const char *filename, int format, int bit_width)
                } ;
 
        for ( ; k < BUFFER_SIZE ; k++)
-               write_buf [k] = bit_mask & ((rand () << 11) ^ (rand () >> 11)) ;
+               write_buf [k] = bit_mask & (arith_shift_left (rand (), 11) ^ (rand () >> 11)) ;
 
        sf_write_int (file, write_buf, BUFFER_SIZE) ;
        sf_close (file) ;
index 9df14b8..4207c0a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_SIZE             (1<<15)
+#define        BUFFER_SIZE             (1 << 15)
 #define        SHORT_BUFFER    (256)
 
 static void
index 8eabad2..8ec06c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-#include       <stdio.h>
-#include       <stdlib.h>
-#include       <string.h>
-#include       <unistd.h>
-#include       <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <inttypes.h>
 
-#include       <sndfile.h>
+#include <sndfile.h>
 
-#include       "utils.h"
+#include "utils.h"
 
-#define                BUFFER_SIZE             (1<<14) /* Should be (1<<14) */
+#define                BUFFER_SIZE             (1 << 14)
 #define                SAMPLE_RATE             (11025)
 
 #ifndef                M_PI
@@ -69,8 +70,9 @@ static void
 lcomp_test_int (const char *str, const char *filename, int filetype, double margin)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
-       int                     k, m, *orig, *data, sum_abs ;
-       long            datalen, seekpos ;
+       int                     k, m, *orig, *data ;
+       sf_count_t      datalen, seekpos ;
+       int64_t         sum_abs ;
        double          scale ;
 
        printf ("\nThis is program is not part of the libsndfile test suite.\n\n") ;
@@ -102,7 +104,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
                } ;
 
        if ((k = sf_writef_int (file, orig, datalen)) != datalen)
-       {       printf ("sf_writef_int failed with short write (%ld => %d).\n", datalen, k) ;
+       {       printf ("sf_writef_int failed with short write (%" PRId64 " => %d).\n", datalen, k) ;
                exit (1) ;
                } ;
        sf_close (file) ;
@@ -124,12 +126,12 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
                } ;
 
        if (sfinfo.frames < datalen)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + datalen / 2))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -141,7 +143,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
        check_log_buffer_or_die (file, __LINE__) ;
 
        if ((k = sf_readf_int (file, data, datalen)) != datalen)
-       {       printf ("Line %d: short read (%d should be %ld).\n", __LINE__, k, datalen) ;
+       {       printf ("Line %d: short read (%d should be %" PRId64 ").\n", __LINE__, k, datalen) ;
                exit (1) ;
                } ;
 
@@ -152,7 +154,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
                        oct_save_int (orig, data, datalen) ;
                        exit (1) ;
                        } ;
-               sum_abs = abs (sum_abs + abs (data [k])) ;
+               sum_abs += abs (data [k]) ;
                } ;
 
        if (sum_abs < 1.0)
@@ -161,7 +163,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
                } ;
 
        if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("Line %d: Incorrect read length (%ld should be %d).\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames - datalen), k) ;
+       {       printf ("Line %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, sfinfo.frames - datalen, k) ;
                exit (1) ;
                } ;
 
@@ -170,7 +172,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
        */
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [k] / scale) > decay_response (k))
+                       if (ABS (data [k] / scale) > decay_response (k))
                        {       printf ("Line %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, k, data [k], decay_response (k)) ;
                                exit (1) ;
                                } ;
@@ -209,7 +211,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
 
        /* Check seek from start of file. */
        if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
-       {       printf ("Seek to start of file + %ld failed (%d).\n", seekpos, k) ;
+       {       printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ;
                exit (1) ;
                } ;
 
@@ -224,7 +226,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
                } ;
 
        if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
-       {       printf ("Line %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %ld)\n", __LINE__, k, seekpos + 1) ;
+       {       printf ("Line %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ;
                exit (1) ;
                } ;
 
@@ -232,7 +234,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
        k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
        sf_readf_int (file, data, 1) ;
        if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
-       {       printf ("Line %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %ld).\n", __LINE__, data [0], orig [seekpos], k, seekpos + 1) ;
+       {       printf ("Line %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos], k, seekpos + 1) ;
                exit (1) ;
                } ;
 
@@ -241,7 +243,7 @@ lcomp_test_int (const char *str, const char *filename, int filetype, double marg
        k = sf_seek (file, -20, SEEK_CUR) ;
        sf_readf_int (file, data, 1) ;
        if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
-       {       printf ("sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %ld).\n", data [0], orig [seekpos], k, seekpos) ;
+       {       printf ("sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", data [0], orig [seekpos], k, seekpos) ;
                exit (1) ;
                } ;
 
index aaf5386..8b0497c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -64,13 +65,14 @@ main (int argc, char *argv [])
        if (argc == 2 && ! strstr (argv [1], "no-exit"))
                allow_exit = 0 ;
 
-#if ((HAVE_LRINTF == 0) && (HAVE_LRINT_REPLACEMENT == 0))
+#if (HAVE_LRINTF == 0)
        puts ("*** Cannot run this test on this platform because it lacks lrintf().") ;
        exit (0) ;
 #endif
 
        /* Float tests. */
-       float_scaled_test       ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ;
+       float_scaled_test       ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT,
+                                                                       OS_IS_OPENBSD ? -98.0 : -163.0) ;
 
        /* Test both signed and unsigned 8 bit files. */
        float_scaled_test       ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ;
@@ -87,8 +89,8 @@ main (int argc, char *argv [])
        float_scaled_test       ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ;
        float_scaled_test       ("gsm610.raw"   , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ;
 
-       float_scaled_test       ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ;
-       float_scaled_test       ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ;
+       float_scaled_test       ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ;
+       float_scaled_test       ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ;
        float_scaled_test       ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ;
 
        /*      PAF files do not use the same encoding method for 24 bit PCM data as other file
@@ -106,10 +108,15 @@ main (int argc, char *argv [])
        float_scaled_test       ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ;
        float_scaled_test       ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ;
 
-       float_scaled_test       ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ;
-       float_scaled_test       ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ;
+       float_scaled_test       ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ;
+       float_scaled_test       ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ;
        float_scaled_test       ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ;
 
+       float_scaled_test       ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ;
+       float_scaled_test       ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -76.0) ;
+       float_scaled_test       ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ;
+       float_scaled_test       ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ;
+
 #if HAVE_EXTERNAL_LIBS
        float_scaled_test       ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ;
        float_scaled_test       ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ;
@@ -124,7 +131,7 @@ main (int argc, char *argv [])
        ** Double tests.
        */
 
-       double_scaled_test      ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ;
+       double_scaled_test      ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ;
 
        /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */
        double_scaled_test      ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ;
@@ -141,8 +148,8 @@ main (int argc, char *argv [])
        double_scaled_test      ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ;
        double_scaled_test      ("gsm610.raw"   , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ;
 
-       double_scaled_test      ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ;
-       double_scaled_test      ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ;
+       double_scaled_test      ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ;
+       double_scaled_test      ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ;
        double_scaled_test      ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ;
 
        /*      24 bit PCM PAF files tested here. */
@@ -156,12 +163,17 @@ main (int argc, char *argv [])
        double_scaled_test      ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ;
 
        double_scaled_test      ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ;
-       double_scaled_test      ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -42.0) ;
+       double_scaled_test      ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ;
 
-       double_scaled_test      ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ;
-       double_scaled_test      ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ;
+       double_scaled_test      ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ;
+       double_scaled_test      ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ;
        double_scaled_test      ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ;
 
+       double_scaled_test      ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ;
+       double_scaled_test      ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ;
+       double_scaled_test      ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ;
+       double_scaled_test      ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -186.0) ;
+
 #if HAVE_EXTERNAL_LIBS
        double_scaled_test      ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ;
        double_scaled_test      ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ;
@@ -170,7 +182,7 @@ main (int argc, char *argv [])
        double_scaled_test      ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ;
 #endif
 
-       double_scaled_test      ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ;
+       double_scaled_test      ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ;
 
        putchar ('\n') ;
        /* Float int tests. */
@@ -196,10 +208,11 @@ float_scaled_test (const char *filename, int allow_exit, int replace_float, int
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        double          snr ;
+       int                     byterate ;
 
        print_test_name ("float_scaled_test", filename) ;
 
-       gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 1.0) ;
+       gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = DFT_DATA_LENGTH ;
@@ -219,13 +232,16 @@ float_scaled_test (const char *filename, int allow_exit, int replace_float, int
        sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
 
        exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
-       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
        exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
 
        check_log_buffer_or_die (file, __LINE__) ;
 
        test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ;
 
+       byterate = sf_current_byterate (file) ;
+       exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ;
+
        sf_close (file) ;
 
        snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ;
@@ -244,10 +260,11 @@ double_scaled_test (const char *filename, int allow_exit, int replace_float, int
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        double          snr ;
+       int                     byterate ;
 
        print_test_name ("double_scaled_test", filename) ;
 
-       gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.95) ;
+       gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = DFT_DATA_LENGTH ;
@@ -267,13 +284,16 @@ double_scaled_test (const char *filename, int allow_exit, int replace_float, int
        sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
 
        exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
-       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
        exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
 
        check_log_buffer_or_die (file, __LINE__) ;
 
        test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ;
 
+       byterate = sf_current_byterate (file) ;
+       exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ;
+
        sf_close (file) ;
 
        snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ;
@@ -299,7 +319,7 @@ float_short_little_test (const char * filename)
 
        print_test_name ("float_short_little_test", filename) ;
 
-       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ;
+       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (short_data) ;
@@ -313,7 +333,7 @@ float_short_little_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (float_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -329,7 +349,7 @@ float_short_little_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (short_data) ; k++)
-               if ((unsigned) abs (short_data [k]) > max)
+               if (abs (short_data [k]) > max)
                        max = abs (short_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01)
@@ -349,7 +369,7 @@ float_short_big_test (const char * filename)
 
        print_test_name ("float_short_big_test", filename) ;
 
-       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ;
+       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (short_data) ;
@@ -363,7 +383,7 @@ float_short_big_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (float_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -379,7 +399,7 @@ float_short_big_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (short_data) ; k++)
-               if ((unsigned) abs (short_data [k]) > max)
+               if (abs (short_data [k]) > max)
                        max = abs (short_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01)
@@ -399,7 +419,7 @@ float_int_little_test (const char * filename)
 
        print_test_name ("float_int_little_test", filename) ;
 
-       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ;
+       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (int_data) ;
@@ -413,7 +433,7 @@ float_int_little_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (float_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -429,7 +449,7 @@ float_int_little_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (int_data) ; k++)
-               if ((unsigned) abs (int_data [k]) > max)
+               if (abs (int_data [k]) > max)
                        max = abs (int_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01)
@@ -449,7 +469,7 @@ float_int_big_test (const char * filename)
 
        print_test_name ("float_int_big_test", filename) ;
 
-       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.98) ;
+       gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (int_data) ;
@@ -463,7 +483,7 @@ float_int_big_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (float_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -479,7 +499,7 @@ float_int_big_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (int_data) ; k++)
-               if ((unsigned) abs (int_data [k]) > max)
+               if (abs (int_data [k]) > max)
                        max = abs (int_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01)
@@ -499,7 +519,7 @@ double_short_little_test (const char * filename)
 
        print_test_name ("double_short_little_test", filename) ;
 
-       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ;
+       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (short_data) ;
@@ -513,7 +533,7 @@ double_short_little_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (double_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -529,7 +549,7 @@ double_short_little_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (short_data) ; k++)
-               if ((unsigned) abs (short_data [k]) > max)
+               if (abs (short_data [k]) > max)
                        max = abs (short_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01)
@@ -549,7 +569,7 @@ double_short_big_test (const char * filename)
 
        print_test_name ("double_short_big_test", filename) ;
 
-       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ;
+       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (short_data) ;
@@ -563,7 +583,7 @@ double_short_big_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (double_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -579,7 +599,7 @@ double_short_big_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (short_data) ; k++)
-               if ((unsigned) abs (short_data [k]) > max)
+               if (abs (short_data [k]) > max)
                        max = abs (short_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01)
@@ -599,7 +619,7 @@ double_int_little_test (const char * filename)
 
        print_test_name ("double_int_little_test", filename) ;
 
-       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ;
+       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (int_data) ;
@@ -613,7 +633,7 @@ double_int_little_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (double_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -629,7 +649,7 @@ double_int_little_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (int_data) ; k++)
-               if ((unsigned) abs (int_data [k]) > max)
+               if (abs (int_data [k]) > max)
                        max = abs (int_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01)
@@ -649,7 +669,7 @@ double_int_big_test (const char * filename)
 
        print_test_name ("double_int_big_test", filename) ;
 
-       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.98) ;
+       gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN (int_data) ;
@@ -663,7 +683,7 @@ double_int_big_test (const char * filename)
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN (double_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -679,7 +699,7 @@ double_int_big_test (const char * filename)
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN (int_data) ; k++)
-               if ((unsigned) abs (int_data [k]) > max)
+               if (abs (int_data [k]) > max)
                        max = abs (int_data [k]) ;
 
        if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01)
index 3441d34..e368ddf 100644 (file)
@@ -22,11 +22,11 @@ float_type = {
 
 int_type = {
        int_name                = short ;
-       int_max                 = 0x7FFF ;
+       int_max                 = "0x7FFF" ;
        } ;
 
 int_type = {
        int_name                = int ;
-       int_max                 = 0x7FFFFFFF ;
+       int_max                 = "0x7FFFFFFF" ;
        } ;
 
index 2bb6b86..247b8e6 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -60,13 +61,14 @@ main (int argc, char *argv [])
        if (argc == 2 && ! strstr (argv [1], "no-exit"))
                allow_exit = 0 ;
 
-#if ((HAVE_LRINTF == 0) && (HAVE_LRINT_REPLACEMENT == 0))
+#if (HAVE_LRINTF == 0)
        puts ("*** Cannot run this test on this platform because it lacks lrintf().") ;
        exit (0) ;
 #endif
 
        /* Float tests. */
-       float_scaled_test       ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ;
+       float_scaled_test       ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT,
+                                                                       OS_IS_OPENBSD ? -98.0 : -163.0) ;
 
        /* Test both signed and unsigned 8 bit files. */
        float_scaled_test       ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ;
@@ -83,8 +85,8 @@ main (int argc, char *argv [])
        float_scaled_test       ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ;
        float_scaled_test       ("gsm610.raw"   , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ;
 
-       float_scaled_test       ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ;
-       float_scaled_test       ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ;
+       float_scaled_test       ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ;
+       float_scaled_test       ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ;
        float_scaled_test       ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ;
 
        /*      PAF files do not use the same encoding method for 24 bit PCM data as other file
@@ -102,10 +104,15 @@ main (int argc, char *argv [])
        float_scaled_test       ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ;
        float_scaled_test       ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ;
 
-       float_scaled_test       ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ;
-       float_scaled_test       ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ;
+       float_scaled_test       ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ;
+       float_scaled_test       ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ;
        float_scaled_test       ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ;
 
+       float_scaled_test       ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ;
+       float_scaled_test       ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -76.0) ;
+       float_scaled_test       ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ;
+       float_scaled_test       ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ;
+
 #if HAVE_EXTERNAL_LIBS
        float_scaled_test       ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ;
        float_scaled_test       ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ;
@@ -120,7 +127,7 @@ main (int argc, char *argv [])
        ** Double tests.
        */
 
-       double_scaled_test      ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ;
+       double_scaled_test      ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ;
 
        /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */
        double_scaled_test      ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ;
@@ -137,8 +144,8 @@ main (int argc, char *argv [])
        double_scaled_test      ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ;
        double_scaled_test      ("gsm610.raw"   , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ;
 
-       double_scaled_test      ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -34.0) ;
-       double_scaled_test      ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -34.0) ;
+       double_scaled_test      ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ;
+       double_scaled_test      ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ;
        double_scaled_test      ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ;
 
        /*      24 bit PCM PAF files tested here. */
@@ -152,12 +159,17 @@ main (int argc, char *argv [])
        double_scaled_test      ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ;
 
        double_scaled_test      ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ;
-       double_scaled_test      ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -42.0) ;
+       double_scaled_test      ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ;
 
-       double_scaled_test      ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -90.0) ;
-       double_scaled_test      ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -140.0) ;
+       double_scaled_test      ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ;
+       double_scaled_test      ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ;
        double_scaled_test      ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ;
 
+       double_scaled_test      ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ;
+       double_scaled_test      ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ;
+       double_scaled_test      ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ;
+       double_scaled_test      ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -186.0) ;
+
 #if HAVE_EXTERNAL_LIBS
        double_scaled_test      ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ;
        double_scaled_test      ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ;
@@ -166,7 +178,7 @@ main (int argc, char *argv [])
        double_scaled_test      ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ;
 #endif
 
-       double_scaled_test      ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -300.0) ;
+       double_scaled_test      ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ;
 
        putchar ('\n') ;
        /* Float int tests. */
@@ -187,10 +199,11 @@ float_scaled_test (const char *filename, int allow_exit, int replace_float, int
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        double          snr ;
+       int                     byterate ;
 
        print_test_name ("float_scaled_test", filename) ;
 
-       gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 1.0) ;
+       gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = DFT_DATA_LENGTH ;
@@ -210,13 +223,16 @@ float_scaled_test (const char *filename, int allow_exit, int replace_float, int
        sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
 
        exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
-       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
        exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
 
        check_log_buffer_or_die (file, __LINE__) ;
 
        test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ;
 
+       byterate = sf_current_byterate (file) ;
+       exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ;
+
        sf_close (file) ;
 
        snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ;
@@ -235,10 +251,11 @@ double_scaled_test (const char *filename, int allow_exit, int replace_float, int
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        double          snr ;
+       int                     byterate ;
 
        print_test_name ("double_scaled_test", filename) ;
 
-       gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.95) ;
+       gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = DFT_DATA_LENGTH ;
@@ -258,13 +275,16 @@ double_scaled_test (const char *filename, int allow_exit, int replace_float, int
        sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
 
        exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
-       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
        exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
 
        check_log_buffer_or_die (file, __LINE__) ;
 
        test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ;
 
+       byterate = sf_current_byterate (file) ;
+       exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ;
+
        sf_close (file) ;
 
        snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ;
@@ -291,7 +311,7 @@ static void
 
        print_test_name ("[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test", filename) ;
 
-       gen_windowed_sine_[+ (get "float_name") +] ([+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), 0.98) ;
+       gen_windowed_sine_[+ (get "float_name") +] ([+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), 0.9999) ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = ARRAY_LEN ([+ (get "int_name") +]_data) ;
@@ -305,7 +325,7 @@ static void
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
 
        if (sfinfo.frames != ARRAY_LEN ([+ (get "float_name") +]_data))
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), DFT_DATA_LENGTH) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -321,7 +341,7 @@ static void
 
        max = 0 ;
        for (k = 0 ; k < ARRAY_LEN ([+ (get "int_name") +]_data) ; k++)
-               if ((unsigned) abs ([+ (get "int_name") +]_data [k]) > max)
+               if (abs ([+ (get "int_name") +]_data [k]) > max)
                        max = abs ([+ (get "int_name") +]_data [k]) ;
 
        if (1.0 * abs (max - [+ (get "int_max") +]) / [+ (get "int_max") +] > 0.01)
index d759385..653018b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include "utils.h"
 #include "generate.h"
 
-#define        SF_MAX(x,y)             ((x) > (y) ? (x) : (y))
+#define        SF_MAX(x, y)            ((x) > (y) ? (x) : (y))
 
 static float crappy_snare (float *output, int len, int offset, float gain, float maxabs) ;
 
index 9802fd9..687e03d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <inttypes.h>
+#include <math.h>
 
 #include <sys/stat.h>
-#include <math.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -42,7 +43,7 @@
 
 #include       "utils.h"
 
-#define        BUFFER_LEN              (1<<10)
+#define        BUFFER_LEN              (1 << 10)
 #define LOG_BUFFER_SIZE        1024
 
 static void    update_header_test (const char *filename, int typemajor) ;
@@ -77,7 +78,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all=!strcmp (argv [1], "all") ;
+       do_all= !strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "wav"))
        {       update_header_test ("header.wav", SF_FORMAT_WAV) ;
@@ -273,7 +274,7 @@ update_header_sub (const char *filename, int typemajor, int write_mode)
        check_log_buffer_or_die (infile, __LINE__) ;
 
        if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50)
-       {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ;
+       {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ;
                dump_log_buffer (infile) ;
                exit (1) ;
                } ;
@@ -298,7 +299,7 @@ update_header_sub (const char *filename, int typemajor, int write_mode)
        check_log_buffer_or_die (infile, __LINE__) ;
 
        if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50)
-       {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * BUFFER_LEN) ;
+       {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 2 * BUFFER_LEN) ;
                dump_log_buffer (infile) ;
                exit (1) ;
                } ;
@@ -329,8 +330,8 @@ static void
 update_seek_short_test (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    short buffer [8] ;
+       sf_count_t frames ;
+       short buffer [8] ;
        int k ;
 
        print_test_name ("update_seek_short_test", filename) ;
@@ -353,11 +354,11 @@ update_seek_short_test    (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -374,7 +375,7 @@ update_seek_short_test      (const char *filename, int filetype)
                sf_close (infile) ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
@@ -396,8 +397,8 @@ static void
 update_seek_int_test   (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    int buffer [8] ;
+       sf_count_t frames ;
+       int buffer [8] ;
        int k ;
 
        print_test_name ("update_seek_int_test", filename) ;
@@ -420,11 +421,11 @@ update_seek_int_test      (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -441,7 +442,7 @@ update_seek_int_test        (const char *filename, int filetype)
                sf_close (infile) ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
@@ -463,8 +464,8 @@ static void
 update_seek_float_test (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    float buffer [8] ;
+       sf_count_t frames ;
+       float buffer [8] ;
        int k ;
 
        print_test_name ("update_seek_float_test", filename) ;
@@ -487,11 +488,11 @@ update_seek_float_test    (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -508,7 +509,7 @@ update_seek_float_test      (const char *filename, int filetype)
                sf_close (infile) ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
@@ -530,8 +531,8 @@ static void
 update_seek_double_test        (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    double buffer [8] ;
+       sf_count_t frames ;
+       double buffer [8] ;
        int k ;
 
        print_test_name ("update_seek_double_test", filename) ;
@@ -554,11 +555,11 @@ update_seek_double_test   (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -575,7 +576,7 @@ update_seek_double_test     (const char *filename, int filetype)
                sf_close (infile) ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
@@ -642,8 +643,8 @@ static void
 extra_header_test (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    short buffer [8] ;
+       sf_count_t frames ;
+       short buffer [8] ;
        int k = 0 ;
 
        print_test_name ("extra_header_test", filename) ;
@@ -658,9 +659,9 @@ extra_header_test (const char *filename, int filetype)
        frames = ARRAY_LEN (buffer) / sfinfo.channels ;
 
        /* Test the file with extra header data. */
-       outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, 462) ;
+       outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, 463) ;
        sf_set_string (outfile, SF_STR_TITLE, filename) ;
-       test_writef_short_or_die (outfile, k, buffer, frames, 464) ;
+       test_writef_short_or_die (outfile, k, buffer, frames, 465) ;
        sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ;
        sf_close (outfile) ;
 
@@ -687,15 +688,15 @@ extra_header_test (const char *filename, int filetype)
        hexdump_file (filename, 0, 100000) ;
 
        /* Open again for read/write. */
-       outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, 491) ;
+       outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, 492) ;
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -708,26 +709,26 @@ extra_header_test (const char *filename, int filetype)
                memset (buffer, 0xA0 + k, sizeof (buffer)) ;
 
 
-               test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, 512) ;
-               test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, 513) ;
+               test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, 513) ;
+               test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, 514) ;
 
                /* Open file again and make sure no errors in log buffer. */
                if (0)
-               {       infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, 517) ;
-                       check_log_buffer_or_die (infile, 518) ;
+               {       infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, 518) ;
+                       check_log_buffer_or_die (infile, 519) ;
                        sf_close (infile) ;
                        } ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", 523, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", 524, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
 
                if ((k & 1) == 0)
-                       test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, 529) ;
+                       test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, 530) ;
                else
-                       test_writef_short_or_die (outfile, k, buffer, frames, 531) ;
+                       test_writef_short_or_die (outfile, k, buffer, frames, 532) ;
                hexdump_file (filename, 0, 100000) ;
                } ;
 
index ef8c97d..6545bb4 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <inttypes.h>
+#include <math.h>
 
 #include <sys/stat.h>
-#include <math.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -43,7 +44,7 @@
 
 #include       "utils.h"
 
-#define        BUFFER_LEN              (1<<10)
+#define        BUFFER_LEN              (1 << 10)
 #define LOG_BUFFER_SIZE        1024
 
 static void    update_header_test (const char *filename, int typemajor) ;
@@ -77,7 +78,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all=!strcmp (argv [1], "all") ;
+       do_all= !strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "wav"))
        {       update_header_test ("header.wav", SF_FORMAT_WAV) ;
@@ -273,7 +274,7 @@ update_header_sub (const char *filename, int typemajor, int write_mode)
        check_log_buffer_or_die (infile, __LINE__) ;
 
        if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50)
-       {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ;
+       {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ;
                dump_log_buffer (infile) ;
                exit (1) ;
                } ;
@@ -298,7 +299,7 @@ update_header_sub (const char *filename, int typemajor, int write_mode)
        check_log_buffer_or_die (infile, __LINE__) ;
 
        if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50)
-       {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * BUFFER_LEN) ;
+       {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 2 * BUFFER_LEN) ;
                dump_log_buffer (infile) ;
                exit (1) ;
                } ;
@@ -330,8 +331,8 @@ update_header_test (const char *filename, int typemajor)
 update_seek_[+ (get "name") +]_test    (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    [+ (get "name") +] buffer [8] ;
+       sf_count_t frames ;
+       [+ (get "name") +] buffer [8] ;
        int k ;
 
        print_test_name ("update_seek_[+ (get "name") +]_test", filename) ;
@@ -354,11 +355,11 @@ update_seek_[+ (get "name") +]_test       (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -375,7 +376,7 @@ update_seek_[+ (get "name") +]_test (const char *filename, int filetype)
                sf_close (infile) ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
@@ -443,8 +444,8 @@ static void
 extra_header_test (const char *filename, int filetype)
 {      SNDFILE *outfile, *infile ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    short buffer [8] ;
+       sf_count_t frames ;
+       short buffer [8] ;
        int k = 0 ;
 
        print_test_name ("extra_header_test", filename) ;
@@ -492,11 +493,11 @@ extra_header_test (const char *filename, int filetype)
 
        /*
        ** In auto header update mode, seeking to the end of the file with
-    ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
+       ** SEEK_SET will fail from the 2nd seek on.  seeking to 0, SEEK_END
        ** will seek to 0 anyway
        */
        if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
-    {  printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
+       {       printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
                exit (1) ;
                } ;
 
@@ -520,7 +521,7 @@ extra_header_test (const char *filename, int filetype)
                        } ;
 
                if (sfinfo.frames != k * frames)
-               {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", [+ (tpl-file-line "%2$d") +], SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
+               {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", [+ (tpl-file-line "%2$d") +], sfinfo.frames, k + frames) ;
                        dump_log_buffer (infile) ;
                        exit (1) ;
                        } ;
index 6203589..6d3e2f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -93,7 +94,7 @@ headerless_test (const char * filename, int format, int expected)
                } ;
 
        if (sfinfo.frames < BUFFER_SIZE)
-       {       printf ("Line %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -154,7 +155,7 @@ old_test (void)
                } ;
 
        if (sfinfo.frames < BUFFER_SIZE)
-       {       printf ("Line %d: Incorrect number of.frames in file. (%d => %ld)\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
diff --git a/tests/long_read_write_test.c b/tests/long_read_write_test.c
new file mode 100644 (file)
index 0000000..22f5d6c
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+** Copyright (C) 2015 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <inttypes.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sndfile.h>
+
+#include "dft_cmp.h"
+#include "utils.h"
+
+#define        BUFFER_LENGTH           10000
+#define        SAMPLE_RATE                     44010
+
+static void    short_lrw_test  (const char *filename, int filetype, const short * output, int out_len) ;
+static void    int_lrw_test    (const char *filename, int filetype, const int * output, int out_len) ;
+static void    float_lrw_test  (const char *filename, int filetype, const float * output, int out_len) ;
+static void    double_lrw_test (const char *filename, int filetype, const double * output, int out_len) ;
+
+
+static short   short_data [BUFFER_LENGTH] ;
+static int             int_data [BUFFER_LENGTH] ;
+static float   float_data [BUFFER_LENGTH] ;
+static double  double_data [BUFFER_LENGTH] ;
+
+int
+main (int argc, char *argv [])
+{      int do_all ;
+       size_t k ;
+
+       if (argc != 2)
+       {       printf ("Usage : %s <test>\n", argv [0]) ;
+               printf ("    Where <test> is one of the following:\n") ;
+               printf ("           alac        - test CAF/ALAC file functions\n") ;
+               printf ("           all         - perform all tests\n") ;
+               exit (1) ;
+               } ;
+
+       for (k = 0 ; k < ARRAY_LEN (short_data) ; k++)
+       {       int value = k / 32 ;
+               int_data [k] = (value & 1 ? -1 : 1) * value ;
+               short_data [k] = int_data [k] ;
+               float_data [k] = int_data [k] / 32000.0 ;
+               double_data [k] = int_data [k] / 32000.0 ;
+               }
+
+       do_all = ! strcmp (argv [1], "all") ;
+
+       if (do_all || strcmp (argv [1], "alac") == 0)
+       {       short_lrw_test  ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16, short_data, ARRAY_LEN (short_data)) ;
+               int_lrw_test    ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, int_data, ARRAY_LEN (int_data)) ;
+               float_lrw_test  ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, float_data, ARRAY_LEN (float_data)) ;
+               double_lrw_test ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, double_data, ARRAY_LEN (double_data)) ;
+               } ;
+
+       return 0 ;
+} /* main */
+
+/*============================================================================================
+ *     Here are the test functions.
+ */
+
+static void
+short_lrw_test (const char *filename, int filetype, const short * output, int out_len)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       int                     k ;
+       short           input [out_len] ;
+
+       print_test_name ("short_lrw_test", filename) ;
+
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = out_len ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = filetype ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+
+       test_write_short_or_die (file, 0, output, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       memset (input, 0, sizeof (input)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
+       exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_short_or_die (file, 0, input, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       for (k = 0 ; k < out_len ; k++)
+               exit_if_true (input [k] != output [k],
+                       "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ;
+
+       puts ("ok") ;
+       unlink (filename) ;
+
+       return ;
+} /* short_lrw_test */
+
+static void
+int_lrw_test (const char *filename, int filetype, const int * output, int out_len)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       int                     k ;
+       int                     input [out_len] ;
+
+       print_test_name ("int_lrw_test", filename) ;
+
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = out_len ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = filetype ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+
+       test_write_int_or_die (file, 0, output, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       memset (input, 0, sizeof (input)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
+       exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too int). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_int_or_die (file, 0, input, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       for (k = 0 ; k < out_len ; k++)
+               exit_if_true (input [k] != output [k],
+                       "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ;
+
+       puts ("ok") ;
+       unlink (filename) ;
+
+       return ;
+} /* int_lrw_test */
+
+static void
+float_lrw_test (const char *filename, int filetype, const float * output, int out_len)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       int                     k ;
+       float           input [out_len] ;
+
+       print_test_name ("float_lrw_test", filename) ;
+
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = out_len ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = filetype ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+
+       test_write_float_or_die (file, 0, output, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       memset (input, 0, sizeof (input)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
+       exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too float). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_float_or_die (file, 0, input, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       for (k = 0 ; k < out_len ; k++)
+               exit_if_true (fabs (input [k] - output [k]) > 0.00001,
+                       "\n\nLine: %d: Error on input %d, expected %f, got %f\n", __LINE__, k, output [k], input [k]) ;
+
+       puts ("ok") ;
+       unlink (filename) ;
+
+       return ;
+} /* float_lrw_test */
+
+static void
+double_lrw_test (const char *filename, int filetype, const double * output, int out_len)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       int                     k ;
+       double          input [out_len] ;
+
+       print_test_name ("double_lrw_test", filename) ;
+
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = out_len ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = filetype ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+
+       test_write_double_or_die (file, 0, output, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       memset (input, 0, sizeof (input)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
+       exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too double). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ;
+       exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_double_or_die (file, 0, input, out_len, __LINE__) ;
+
+       sf_close (file) ;
+
+       for (k = 0 ; k < out_len ; k++)
+               exit_if_true (fabs (input [k] - output [k]) > 0.00001,
+                       "\n\nLine: %d: Error on input %d, expected %f, got %f\n", __LINE__, k, output [k], input [k]) ;
+
+       puts ("ok") ;
+       unlink (filename) ;
+
+       return ;
+} /* double_lrw_test */
+
index e871760..c072373 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
+
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
 
 #include "utils.h"
 
-#define        BUFFER_SIZE             (1<<14) /* Should be (1<<14) */
+#define        BUFFER_SIZE             (1 << 14)
 #define        SAMPLE_RATE             11025
 
 #ifndef                M_PI
 #define                M_PI            3.14159265358979323846264338
 #endif
 
-#define                LCT_MAX(x,y)    ((x) > (y) ? (x) : (y))
+#define                LCT_MAX(x, y)   ((x) > (y) ? (x) : (y))
 
 static void    lcomp_test_short        (const char *filename, int filetype, int chan, double margin) ;
 static void    lcomp_test_int          (const char *filename, int filetype, int chan, double margin) ;
@@ -556,7 +558,7 @@ lcomp_test_short (const char *filename, int filetype, int channels, double margi
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos, half_max_abs ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        short                   *orig, *data ;
 
        print_test_name ("lcomp_test_short", filename) ;
@@ -593,12 +595,12 @@ lcomp_test_short (const char *filename, int filetype, int channels, double margi
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too few frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + datalen / 20))
-       {       printf ("Too many frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -629,8 +631,8 @@ lcomp_test_short (const char *filename, int filetype, int channels, double margi
                } ;
 
        if ((k = sf_readf_short (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%ld should be %d).\n", __LINE__,
-                       SF_COUNT_TO_LONG (channels * sfinfo.frames - datalen), k) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
+                       channels * sfinfo.frames - datalen, k) ;
                exit (1) ;
                } ;
 
@@ -742,7 +744,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, half_max_abs ;
-       long                    datalen, seekpos ;
+       sf_count_t              datalen, seekpos ;
        double                  scale, max_val ;
        int                             *orig, *data ;
 
@@ -790,12 +792,12 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + datalen / 20))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -826,8 +828,8 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
                } ;
 
        if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%ld should be %d).\n", __LINE__,
-                       SF_COUNT_TO_LONG (channels * sfinfo.frames - datalen), k) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
+                       channels * sfinfo.frames - datalen, k) ;
                exit (1) ;
                } ;
 
@@ -836,7 +838,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
        */
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [channels * k] / scale) > decay_response (channels * k))
+                       if (ABS (data [channels * k] / scale) > decay_response (channels * k))
                        {       printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
                                exit (1) ;
                                } ;
@@ -872,7 +874,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
 
        /* Check seek from start of file. */
        if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
-       {       printf ("Seek to start of file + %ld failed (%d).\n", seekpos, k) ;
+       {       printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ;
                exit (1) ;
                } ;
 
@@ -884,7 +886,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
                } ;
 
        if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
-       {       printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %ld)\n", __LINE__, k, seekpos + 1) ;
+       {       printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ;
                exit (1) ;
                } ;
 
@@ -892,7 +894,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
        k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
        test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
        if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
-       {       printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %ld).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
+       {       printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
                exit (1) ;
                } ;
 
@@ -901,7 +903,7 @@ lcomp_test_int (const char *filename, int filetype, int channels, double margin)
        k = sf_seek (file, -20, SEEK_CUR) ;
        test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
        if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
-       {       printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %ld).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
+       {       printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
                exit (1) ;
                } ;
 
@@ -939,7 +941,7 @@ lcomp_test_float (const char *filename, int filetype, int channels, double margi
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        float                   *orig, *data ;
        double                  half_max_abs ;
 
@@ -978,12 +980,12 @@ lcomp_test_float (const char *filename, int filetype, int channels, double margi
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + datalen / 20))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1020,8 +1022,8 @@ lcomp_test_float (const char *filename, int filetype, int channels, double margi
                } ;
 
        if ((k = sf_readf_float (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%ld should be %d).\n", __LINE__,
-                       SF_COUNT_TO_LONG (channels * sfinfo.frames - datalen), k) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
+                       channels * sfinfo.frames - datalen, k) ;
                exit (1) ;
                } ;
 
@@ -1030,7 +1032,7 @@ lcomp_test_float (const char *filename, int filetype, int channels, double margi
        */
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [channels * k]) > decay_response (channels * k))
+                       if (ABS (data [channels * k]) > decay_response (channels * k))
                        {       printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
                                exit (1) ;
                                } ;
@@ -1133,7 +1135,7 @@ lcomp_test_double (const char *filename, int filetype, int channels, double marg
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        double                  *orig, *data ;
        double                  half_max_abs ;
 
@@ -1172,12 +1174,12 @@ lcomp_test_double (const char *filename, int filetype, int channels, double marg
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + datalen / 20))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1205,7 +1207,7 @@ lcomp_test_double (const char *filename, int filetype, int channels, double marg
                        oct_save_double (orig, data, datalen) ;
                        exit (1) ;
                        } ;
-               half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ;
+               half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
                } ;
 
        if (half_max_abs < 1.0)
@@ -1214,8 +1216,8 @@ lcomp_test_double (const char *filename, int filetype, int channels, double marg
                } ;
 
        if ((k = sf_readf_double (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%ld should be %d).\n", __LINE__,
-                       SF_COUNT_TO_LONG (channels * sfinfo.frames - datalen), k) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
+                       channels * sfinfo.frames - datalen, k) ;
                exit (1) ;
                } ;
 
@@ -1224,7 +1226,7 @@ lcomp_test_double (const char *filename, int filetype, int channels, double marg
        */
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [channels * k]) > decay_response (channels * k))
+                       if (ABS (data [channels * k]) > decay_response (channels * k))
                        {       printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
                                exit (1) ;
                                } ;
@@ -1328,7 +1330,7 @@ sdlcomp_test_short        (const char *filename, int filetype, int channels, double mar
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos, half_max_abs ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        short                   *orig, *data, *smooth ;
 
 channels = 1 ;
@@ -1386,12 +1388,12 @@ channels = 1 ;
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + 400))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -1419,7 +1421,7 @@ channels = 1 ;
                        oct_save_short (orig, smooth, datalen) ;
                        exit (1) ;
                        } ;
-               half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ;
+               half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
                } ;
 
        if (half_max_abs < 1)
@@ -1428,15 +1430,15 @@ channels = 1 ;
                } ;
 
        if ((k = sf_read_short (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%d should be %ld).\n", __LINE__, k, SF_COUNT_TO_LONG (sfinfo.frames - datalen)) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
                exit (1) ;
                } ;
 
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
                (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [k]) > decay_response (k))
-                       {       printf ("\n\nLine %d: Incorrect sample (#%ld : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
+                       if (ABS (data [k]) > decay_response (k))
+                       {       printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
                                exit (1) ;
                                } ;
 
@@ -1456,7 +1458,7 @@ channels = 1 ;
 
                        for (k = 0 ; k < datalen / 7 ; k++)
                                if (error_function (1.0 * data [k], 1.0 * smooth [k], margin))
-                               {       printf ("\nLine %d: Incorrect sample C (#%d (%ld) : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
+                               {       printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
                                        for (m = 0 ; m < 10 ; m++)
                                                printf ("%d ", data [k]) ;
                                        printf ("\n") ;
@@ -1503,10 +1505,10 @@ channels = 1 ;
                /* Check that read past end of file returns number of items. */
                sf_seek (file, sfinfo.frames, SEEK_SET) ;
 
-               if ((k = sf_read_short (file, data, datalen)) != 0)
-               {       printf ("\n\nLine %d: Return value from sf_read_short past end of file incorrect (%d).\n", __LINE__, k) ;
-                       exit (1) ;
-                       } ;
+               if ((k = sf_read_short (file, data, datalen)) != 0)
+               {       printf ("\n\nLine %d: Return value from sf_read_short past end of file incorrect (%d).\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
 
                /* Check seek backward from end. */
 
@@ -1533,7 +1535,7 @@ sdlcomp_test_int  (const char *filename, int filetype, int channels, double margi
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos, half_max_abs ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        int                             *orig, *data, *smooth ;
        double                  scale ;
 
@@ -1594,12 +1596,12 @@ channels = 1 ;
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + 400))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -1632,7 +1634,7 @@ channels = 1 ;
                } ;
 
        if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%d should be %ld).\n", __LINE__, k, SF_COUNT_TO_LONG (sfinfo.frames - datalen)) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
                exit (1) ;
                } ;
 
@@ -1643,7 +1645,7 @@ channels = 1 ;
                (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G723_24)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
                        if (abs (data [k]) > decay_response (k))
-                       {       printf ("\n\nLine %d: Incorrect sample (#%ld : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
+                       {       printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
                                exit (1) ;
                                } ;
 
@@ -1663,7 +1665,7 @@ channels = 1 ;
 
                        for (k = 0 ; k < datalen / 7 ; k++)
                                if (error_function (data [k] / scale, smooth [k] / scale, margin))
-                               {       printf ("\nLine %d: Incorrect sample (#%d (%ld) : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
+                               {       printf ("\nLine %d: Incorrect sample (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
                                        for (m = 0 ; m < 10 ; m++)
                                                printf ("%d ", data [k]) ;
                                        printf ("\n") ;
@@ -1710,10 +1712,10 @@ channels = 1 ;
                /* Check that read past end of file returns number of items. */
                sf_seek (file, sfinfo.frames, SEEK_SET) ;
 
-               if ((k = sf_readf_int (file, data, datalen)) != 0)
-               {       printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ;
-                       exit (1) ;
-                       } ;
+               if ((k = sf_readf_int (file, data, datalen)) != 0)
+               {       printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
 
                /* Check seek backward from end. */
 
@@ -1740,7 +1742,7 @@ sdlcomp_test_float        (const char *filename, int filetype, int channels, double mar
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        float                   *orig, *data, *smooth ;
        double                  half_max_abs ;
 
@@ -1789,12 +1791,12 @@ printf ("** fix this ** ") ;
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + 400))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -1822,7 +1824,7 @@ printf ("** fix this ** ") ;
                        oct_save_float (orig, smooth, datalen) ;
                        exit (1) ;
                        } ;
-               half_max_abs = LCT_MAX (half_max_abs, abs (0.5 * data [k])) ;
+               half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
                } ;
 
        if (half_max_abs <= 0.0)
@@ -1832,15 +1834,15 @@ printf ("** fix this ** ") ;
                } ;
 
        if ((k = sf_read_float (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%d should be %ld).\n", __LINE__, k, SF_COUNT_TO_LONG (sfinfo.frames - datalen)) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
                exit (1) ;
                } ;
 
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
                (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [k]) > decay_response (k))
-                       {       printf ("\n\nLine %d: Incorrect sample (#%ld : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
+                       if (ABS (data [k]) > decay_response (k))
+                       {       printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
                                exit (1) ;
                                } ;
 
@@ -1860,7 +1862,7 @@ printf ("** fix this ** ") ;
 
                        for (k = 0 ; k < datalen / 7 ; k++)
                                if (error_function (data [k], smooth [k], margin))
-                               {       printf ("\nLine %d: Incorrect sample C (#%d (%ld) : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
+                               {       printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
                                        for (m = 0 ; m < 10 ; m++)
                                                printf ("%d ", (int) data [k]) ;
                                        printf ("\n") ;
@@ -1907,10 +1909,10 @@ printf ("** fix this ** ") ;
                /* Check that read past end of file returns number of items. */
                sf_seek (file, sfinfo.frames, SEEK_SET) ;
 
-               if ((k = sf_read_float (file, data, datalen)) != 0)
-               {       printf ("\n\nLine %d: Return value from sf_read_float past end of file incorrect (%d).\n", __LINE__, k) ;
-                       exit (1) ;
-                       } ;
+               if ((k = sf_read_float (file, data, datalen)) != 0)
+               {       printf ("\n\nLine %d: Return value from sf_read_float past end of file incorrect (%d).\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
 
                /* Check seek backward from end. */
 
@@ -1937,7 +1939,7 @@ sdlcomp_test_double       (const char *filename, int filetype, int channels, double ma
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
        int                             k, m, seekpos ;
-       long                    datalen ;
+       sf_count_t              datalen ;
        double                  *orig, *data, *smooth, half_max_abs ;
 
 channels = 1 ;
@@ -1980,12 +1982,12 @@ channels = 1 ;
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + 400))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -2024,15 +2026,15 @@ channels = 1 ;
                } ;
 
        if ((k = sf_read_double (file, data, datalen)) != sfinfo.frames - datalen)
-       {       printf ("\n\nLine %d: Incorrect read length (%d should be %ld).\n", __LINE__, k, SF_COUNT_TO_LONG (sfinfo.frames - datalen)) ;
+       {       printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
                exit (1) ;
                } ;
 
        if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
                (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
                for (k = 0 ; k < sfinfo.frames - datalen ; k++)
-                       if (abs (data [k]) > decay_response (k))
-                       {       printf ("\n\nLine %d: Incorrect sample (#%ld : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
+                       if (ABS (data [k]) > decay_response (k))
+                       {       printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
                                exit (1) ;
                                } ;
 
@@ -2052,7 +2054,7 @@ channels = 1 ;
 
                        for (k = 0 ; k < datalen / 7 ; k++)
                                if (error_function (data [k], smooth [k], margin))
-                               {       printf ("\nLine %d: Incorrect sample C (#%d (%ld) : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
+                               {       printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
                                        for (m = 0 ; m < 10 ; m++)
                                                printf ("%d ", (int) data [k]) ;
                                        printf ("\n") ;
@@ -2099,10 +2101,10 @@ channels = 1 ;
                /* Check that read past end of file returns number of items. */
                sf_seek (file, sfinfo.frames, SEEK_SET) ;
 
-               if ((k = sf_read_double (file, data, datalen)) != 0)
-               {       printf ("\n\nLine %d: Return value from sf_read_double past end of file incorrect (%d).\n", __LINE__, k) ;
-                       exit (1) ;
-                       } ;
+               if ((k = sf_read_double (file, data, datalen)) != 0)
+               {       printf ("\n\nLine %d: Return value from sf_read_double past end of file incorrect (%d).\n", __LINE__, k) ;
+                       exit (1) ;
+                       } ;
 
                /* Check seek backward from end. */
 
@@ -2128,8 +2130,7 @@ static void
 read_raw_test (const char *filename, int filetype, int channels)
 {      SNDFILE                 *file ;
        SF_INFO                 sfinfo ;
-       sf_count_t              count ;
-       long                    datalen ;
+       sf_count_t              count, datalen ;
        short                   *orig, *data ;
        int                             k ;
 
@@ -2167,12 +2168,12 @@ read_raw_test (const char *filename, int filetype, int channels)
                } ;
 
        if (sfinfo.frames < datalen / channels)
-       {       printf ("Too few.frames in file. (%ld should be a little more than %ld)\n", datalen, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
                exit (1) ;
                } ;
 
        if (sfinfo.frames > (datalen + 400))
-       {       printf ("Too many.frames in file. (%ld should be a little more than %ld)\n", SF_COUNT_TO_LONG (sfinfo.frames), datalen) ;
+       {       printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
                exit (1) ;
                } ;
 
@@ -2185,7 +2186,7 @@ read_raw_test (const char *filename, int filetype, int channels)
 
        count = sf_read_raw (file, orig_buffer.c, datalen + 5 * channels) ;
        if (count != sfinfo.channels * sfinfo.frames)
-       {       printf ("\nLine %d : sf_read_raw returned %ld should be %ld\n", __LINE__, SF_COUNT_TO_LONG (count), sfinfo.channels * SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\nLine %d : sf_read_raw returned %" PRId64 " should be %" PRId64 "\n", __LINE__, count, sfinfo.channels * sfinfo.frames) ;
                exit (1) ;
                } ;
 
index 55a30cc..ff45c5d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <inttypes.h>
 
 #include <sys/stat.h>
 #include <math.h>
 
 #include       "utils.h"
 
-#define        BUFFER_LEN              (1<<10)
+#define        BUFFER_LEN              (1 << 10)
 #define LOG_BUFFER_SIZE        1024
 
 static void    zero_data_test (const char *filename, int format) ;
 static void    filesystem_full_test (int format) ;
 static void    permission_test (const char *filename, int typemajor) ;
 static void    wavex_amb_test (const char *filename) ;
+static void rf64_downgrade_test (const char *filename) ;
 
 int
 main (int argc, char *argv [])
@@ -65,7 +67,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all=!strcmp (argv [1], "all") ;
+       do_all = ! strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "wav"))
        {       zero_data_test ("zerolen.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
@@ -139,9 +141,10 @@ main (int argc, char *argv [])
                } ;
 
        if (do_all || ! strcmp (argv [1], "rf64"))
-       {       zero_data_test ("zerolen.rf64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
-               filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
-               permission_test ("readonly.rf64", SF_FORMAT_W64) ;
+       {       zero_data_test ("zerolen.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
+               filesystem_full_test (SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
+               permission_test ("readonly.rf64", SF_FORMAT_RF64) ;
+               rf64_downgrade_test ("downgrade.wav") ;
                test_count++ ;
                } ;
 
@@ -413,3 +416,58 @@ wavex_amb_test (const char *filename)
        unlink (filename) ;
        puts ("ok") ;
 } /* wavex_amb_test */
+
+static void
+rf64_downgrade_test (const char *filename)
+{      static short    output  [BUFFER_LEN] ;
+       static short    input   [BUFFER_LEN] ;
+
+       SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       unsigned        k ;
+
+       print_test_name (__func__, filename) ;
+
+       sf_info_clear (&sfinfo) ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.frames           = ARRAY_LEN (output) ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = SF_FORMAT_RF64 | SF_FORMAT_PCM_16 ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_FALSE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
+       exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
+
+       test_write_short_or_die (file, 0, output, ARRAY_LEN (output), __LINE__) ;
+
+       exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
+       exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
+
+       sf_close (file) ;
+
+       memset (input, 0, sizeof (input)) ;
+       sf_info_clear (&sfinfo) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+
+       exit_if_true (sfinfo.format != (SF_FORMAT_WAVEX | SF_FORMAT_PCM_16), "\n\nLine %d: RF64 to WAV downgrade failed.\n", __LINE__) ;
+       exit_if_true (sfinfo.frames != ARRAY_LEN (output), "\n\nLine %d: Incorrect number of frames in file (too short). (%d should be %d)\n", __LINE__, (int) sfinfo.frames, (int) ARRAY_LEN (output)) ;
+       exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_short_or_die (file, 0, input, ARRAY_LEN (input), __LINE__) ;
+
+       sf_close (file) ;
+
+       for (k = 0 ; k < ARRAY_LEN (input) ; k++)
+               exit_if_true (input [k] != output [k],
+                       "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ;
+
+       puts ("ok") ;
+       unlink (filename) ;
+
+       return ;
+} /* rf64_downgrade_test */
index 041f398..502d15a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -20,6 +20,9 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -30,8 +33,6 @@
 #endif
 
 #include <fcntl.h>
-#include <math.h>
-#include <string.h>
 #include <errno.h>
 #include <sys/stat.h>
 
@@ -157,7 +158,7 @@ multi_file_test (const char *filename, int *formats, int format_count)
        {
                if (verbose)
                {       puts ("\n------------------------------------") ;
-                       printf ("This offset : %ld\n", SF_COUNT_TO_LONG (embed_info.offset + embed_info.length)) ;
+                       printf ("This offset : %" PRId64 "\n", embed_info.offset + embed_info.length) ;
                        } ;
 
                if (lseek (fd, embed_info.offset + embed_info.length, SEEK_SET) < 0)
@@ -168,7 +169,7 @@ multi_file_test (const char *filename, int *formats, int format_count)
                memset (&sfinfo, 0, sizeof (sfinfo)) ;
                if ((sndfile = sf_open_fd (fd, SFM_READ, &sfinfo, SF_FALSE)) == NULL)
                {       printf ("\n\nLine %d: sf_open_fd failed\n", __LINE__) ;
-                       printf ("Embedded file number : %d   offset : %ld\n", file_count, SF_COUNT_TO_LONG (embed_info.offset)) ;
+                       printf ("Embedded file number : %d   offset : %" PRId64 "\n", file_count, embed_info.offset) ;
                        puts (sf_strerror (sndfile)) ;
                        dump_log_buffer (sndfile) ;
                        exit (1) ;
@@ -179,7 +180,7 @@ multi_file_test (const char *filename, int *formats, int format_count)
                sf_close (sndfile) ;
 
                if (verbose)
-                       printf ("\nNext offset : %ld\nNext length : %ld\n", SF_COUNT_TO_LONG (embed_info.offset), SF_COUNT_TO_LONG (embed_info.length)) ;
+                       printf ("\nNext offset : %" PRId64 "\nNext length : %" PRId64 "\n", embed_info.offset, embed_info.length) ;
                } ;
 
        file_count -- ;
index 63f3bda..4b1be03 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -90,6 +90,9 @@ ogg_short_test (void)
        test_read_short_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ;
        compare_short_or_die (seek_data, data_in.s + 10, ARRAY_LEN (seek_data), __LINE__) ;
 
+       /* Test seek to end of file. */
+       test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ;
+
        sf_close (file) ;
 
        puts ("ok") ;
@@ -266,7 +269,7 @@ ogg_stereo_seek_test (const char * filename, int format)
        gen_windowed_sine_float (data, ARRAY_LEN (data), 0.95) ;
        for (k = 0 ; k < ARRAY_LEN (data) ; k++)
        {       stereo_out [2 * k] = data [k] ;
-               stereo_out [2 * k + 1] = data [ARRAY_LEN (data) - k - 1] ;
+               stereo_out [2 * k + 1] = data [ARRAY_LEN (data) - k - 1] ;
                } ;
 
        memset (&sfinfo, 0, sizeof (sfinfo)) ;
index 86511f6..3fd0ba0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -31,7 +32,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_SIZE             (1<<12)
+#define        BUFFER_SIZE             (1 << 12)
 
 static void    lrintf_test (void) ;
 
@@ -61,30 +62,30 @@ main (void)
 {
        lrintf_test () ;
 
-       pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ;
-       pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ;
+       pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0xa335091249dbfLL) ;
+       pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x48c433d695f3fLL) ;
 
-       pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ;
-       pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ;
+       pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xb956c881ebf08LL) ;
+       pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x2f840c55750f8LL) ;
 
-       pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ;
-       pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ;
+       pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xb6a759ab496f8LL) ;
+       pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xf3eaf9c30b6f8LL) ;
 
-       pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ;
-       pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ;
+       pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xaece1c1c17f08LL) ;
+       pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x9ddf142d0b0f8LL) ;
 
        /* Lite remove start */
-       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ;
-       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ;
+       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_FALSE) ;
+       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_FALSE) ;
 
-       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ;
-       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ;
+       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_FALSE) ;
+       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_FALSE) ;
 
-       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ;
-       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ;
+       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_TRUE) ;
+       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_TRUE) ;
 
-       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ;
-       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ;
+       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_TRUE) ;
+       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_TRUE) ;
        /* Lite remove end */
 
        return 0 ;
@@ -143,7 +144,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
 
        zero_count = 0 ;
        for (k = 0 ; k < items ; k++)
-       {       short_out [k] = ((k * ((k % 2) ? 1 : -1)) << 8) ;
+       {       short_out [k] = arith_shift_left (k * ((k % 2) ? 1 : -1), 8) ;
                zero_count = short_out [k] ? zero_count : zero_count + 1 ;
                } ;
 
@@ -173,7 +174,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -205,7 +206,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
        int_out = data_out.i ;
        int_in = data_in.i ;
        for (k = 0 ; k < items ; k++)
-       {       int_out [k] = ((k * ((k % 2) ? 1 : -1)) << 24) ;
+       {       int_out [k] = arith_shift_left (k * ((k % 2) ? 1 : -1), 24) ;
                zero_count = int_out [k] ? zero_count : zero_count + 1 ;
                } ;
 
@@ -235,7 +236,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -297,7 +298,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -360,7 +361,7 @@ pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -439,7 +440,7 @@ pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -471,7 +472,7 @@ pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
        int_out = data_out.i ;
        int_in = data_in.i ;
        for (k = 0 ; k < items ; k++)
-       {       int_out [k] = ((k * ((k % 2) ? 3 : -3)) << 16) ;
+       {       int_out [k] = arith_shift_left (k * ((k % 2) ? 3 : -3), 16) ;
                zero_count = int_out [k] ? zero_count : zero_count + 1 ;
                } ;
 
@@ -501,7 +502,7 @@ pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -563,7 +564,7 @@ pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -626,7 +627,7 @@ pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -705,7 +706,7 @@ pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -737,7 +738,7 @@ pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
        int_out = data_out.i ;
        int_in = data_in.i ;
        for (k = 0 ; k < items ; k++)
-       {       int_out [k] = ((k * ((k % 2) ? 3333 : -3333)) << 8) ;
+       {       int_out [k] = arith_shift_left (k * ((k % 2) ? 3333 : -3333), 8) ;
                zero_count = int_out [k] ? zero_count : zero_count + 1 ;
                } ;
 
@@ -767,7 +768,7 @@ pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -829,7 +830,7 @@ pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -892,7 +893,7 @@ pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -971,7 +972,7 @@ pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1033,7 +1034,7 @@ pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1095,7 +1096,7 @@ pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1158,7 +1159,7 @@ pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1199,7 +1200,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
        int                             sign ;
        double                  *data, error ;
 
-       print_test_name (replace_float ?  "pcm_test_float (replace)" : "pcm_test_float", filename) ;
+       print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ;
 
        items = BUFFER_SIZE ;
 
@@ -1247,7 +1248,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1268,6 +1269,9 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                        } ;
                } ;
 
+       /* Seek to end of file. */
+       test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -1371,7 +1375,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                } ;
 
        if (sfinfo.frames != frames)
-       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1455,7 +1459,7 @@ pcm_test_double (const char *filename, int        filetype, uint64_t hash, int replace_
 
        /* This is the best test routine. Other should be brought up to this standard. */
 
-       print_test_name (replace_float ?  "pcm_test_double (replace)" : "pcm_test_double", filename) ;
+       print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ;
 
        items = BUFFER_SIZE ;
 
@@ -1510,7 +1514,7 @@ pcm_test_double (const char *filename, int        filetype, uint64_t hash, int replace_
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1644,7 +1648,7 @@ pcm_test_double (const char *filename, int        filetype, uint64_t hash, int replace_
                } ;
 
        if (sfinfo.frames != frames)
-       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ;
                exit (1) ;
                } ;
 
index b81f059..2cc91b5 100644 (file)
@@ -3,8 +3,8 @@ autogen definitions pcm_test.tpl;
 data_type = {
        name            = "bits_8" ;
        item_count      = 127 ;
-       short_func      = "((k * ((k % 2) ? 1 : -1)) << 8)" ;
-       int_func        = "((k * ((k % 2) ? 1 : -1)) << 24)" ;
+       short_func      = "arith_shift_left (k * ((k % 2) ? 1 : -1), 8)" ;
+       int_func        = "arith_shift_left (k * ((k % 2) ? 1 : -1), 24)" ;
        float_func      = "(k * ((k % 2) ? 1 : -1))" ;
        } ;
 
@@ -12,7 +12,7 @@ data_type = {
        name            = "bits_16" ;
        item_count      = 1024 ;
        short_func      = "(k * ((k % 2) ? 3 : -3))" ;
-       int_func        = "((k * ((k % 2) ? 3 : -3)) << 16)" ;
+       int_func        = "arith_shift_left (k * ((k % 2) ? 3 : -3), 16)" ;
        float_func      = "(k * ((k % 2) ? 3 : -3))" ;
        } ;
 
@@ -20,7 +20,7 @@ data_type = {
        name            = "bits_24" ;
        item_count      = 1024 ;
        short_func      = "(k * ((k % 2) ? 3 : -3))" ;
-       int_func        = "((k * ((k % 2) ? 3333 : -3333)) << 8)" ;
+       int_func        = "arith_shift_left (k * ((k % 2) ? 3333 : -3333), 8)" ;
        float_func      = "(k * ((k % 2) ? 3333 : -3333))" ;
        } ;
 
index 949ad4e..96aea93 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -32,7 +33,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_SIZE             (1<<12)
+#define        BUFFER_SIZE             (1 << 12)
 
 static void    lrintf_test (void) ;
 
@@ -61,30 +62,30 @@ main (void)
 {
        lrintf_test () ;
 
-       pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ;
-       pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ;
+       pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0xa335091249dbfLL) ;
+       pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x48c433d695f3fLL) ;
 
-       pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ;
-       pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ;
+       pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xb956c881ebf08LL) ;
+       pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x2f840c55750f8LL) ;
 
-       pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ;
-       pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ;
+       pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xb6a759ab496f8LL) ;
+       pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xf3eaf9c30b6f8LL) ;
 
-       pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ;
-       pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ;
+       pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xaece1c1c17f08LL) ;
+       pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG         | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x9ddf142d0b0f8LL) ;
 
        /* Lite remove start */
-       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ;
-       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ;
+       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_FALSE) ;
+       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_FALSE) ;
 
-       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ;
-       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ;
+       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_FALSE) ;
+       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_FALSE) ;
 
-       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ;
-       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ;
+       pcm_test_float  ("le-float.raw", SF_ENDIAN_LITTLE       | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_TRUE) ;
+       pcm_test_float  ("be-float.raw", SF_ENDIAN_BIG          | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_TRUE) ;
 
-       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ;
-       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ;
+       pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE      | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_TRUE) ;
+       pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_TRUE) ;
        /* Lite remove end */
 
        return 0 ;
@@ -174,7 +175,7 @@ pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -236,7 +237,7 @@ pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -298,7 +299,7 @@ pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -361,7 +362,7 @@ pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash)
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -403,7 +404,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
        int                             sign ;
        double                  *data, error ;
 
-       print_test_name (replace_float ?  "pcm_test_float (replace)" : "pcm_test_float", filename) ;
+       print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ;
 
        items = BUFFER_SIZE ;
 
@@ -451,7 +452,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -472,6 +473,9 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                        } ;
                } ;
 
+       /* Seek to end of file. */
+       test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -575,7 +579,7 @@ pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_f
                } ;
 
        if (sfinfo.frames != frames)
-       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -659,7 +663,7 @@ pcm_test_double (const char *filename, int  filetype, uint64_t hash, int replace_
 
        /* This is the best test routine. Other should be brought up to this standard. */
 
-       print_test_name (replace_float ?  "pcm_test_double (replace)" : "pcm_test_double", filename) ;
+       print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ;
 
        items = BUFFER_SIZE ;
 
@@ -714,7 +718,7 @@ pcm_test_double (const char *filename, int  filetype, uint64_t hash, int replace_
                } ;
 
        if (sfinfo.frames != items)
-       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -848,7 +852,7 @@ pcm_test_double (const char *filename, int  filetype, uint64_t hash, int replace_
                } ;
 
        if (sfinfo.frames != frames)
-       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ;
                exit (1) ;
                } ;
 
index 14656aa..9e5332a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -31,7 +32,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_LEN              (1<<15)
+#define        BUFFER_LEN              (1 << 15)
 #define LOG_BUFFER_SIZE        1024
 
 
@@ -305,56 +306,55 @@ check_logged_peaks (char *buffer)
 static void
 read_write_peak_test (const char *filename, int filetype)
 {      SNDFILE *file ;
-    SF_INFO    sfinfo ;
+       SF_INFO sfinfo ;
 
-    double   small_data [10] ;
-    double   max_peak = 0.0 ;
-    unsigned k ;
+       double  small_data [10], max_peak = 0.0 ;
+       unsigned k ;
 
        print_test_name (__func__, filename) ;
 
-    for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++)
-        small_data [k] = 0.1 ;
+       for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++)
+               small_data [k] = 0.1 ;
 
-    sfinfo.samplerate  = 44100 ;
-    sfinfo.channels            = 2 ;
-    sfinfo.format              = filetype ;
-    sfinfo.frames              = 0 ;
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.channels         = 2 ;
+       sfinfo.format           = filetype ;
+       sfinfo.frames           = 0 ;
 
        /* Open the file, add peak chunk and write samples with value 0.1. */
-    file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
 
-    sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
+       sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
 
        test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ;
 
-    sf_close (file) ;
+       sf_close (file) ;
 
-    /* Open the fiel RDWR, write sample valied 1.25. */
-    file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
+       /* Open the fiel RDWR, write sample valied 1.25. */
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
 
-    for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++)
-        small_data [k] = 1.0 ;
+       for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++)
+               small_data [k] = 1.0 ;
 
        test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ;
 
-    sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ;
+       sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ;
 
-    sf_close (file) ;
+       sf_close (file) ;
 
-    exit_if_true (max_peak < 0.1, "\n\nLine %d : max peak (%5.3f) should not be 0.1.\n\n", __LINE__, max_peak) ;
+       exit_if_true (max_peak < 0.1, "\n\nLine %d : max peak (%5.3f) should not be 0.1.\n\n", __LINE__, max_peak) ;
 
-    /* Open the file and test the values written to the PEAK chunk. */
-    file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
+       /* Open the file and test the values written to the PEAK chunk. */
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
 
        exit_if_true (sfinfo.channels * sfinfo.frames != 2 * ARRAY_LEN (small_data),
-                       "Line %d : frame count is %ld, should be %d\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * ARRAY_LEN (small_data)) ;
+                       "Line %d : frame count is %" PRId64 ", should be %zd\n", __LINE__, sfinfo.frames, 2 * ARRAY_LEN (small_data)) ;
 
-    sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (double)) ;
+       sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (double)) ;
 
-    sf_close (file) ;
+       sf_close (file) ;
 
-    exit_if_true (max_peak < 1.0, "\n\nLine %d : max peak (%5.3f) should be 1.0.\n\n", __LINE__, max_peak) ;
+       exit_if_true (max_peak < 1.0, "\n\nLine %d : max peak (%5.3f) should be 1.0.\n\n", __LINE__, max_peak) ;
 
        unlink (filename) ;
        puts ("ok") ;
index 10fa572..fe28313 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#if (OS_IS_WIN32 || HAVE_PIPE == 0 || HAVE_WAITPID == 0)
+#if (OS_IS_WIN32 || defined __OS2__ || HAVE_PIPE == 0 || HAVE_WAITPID == 0)
 
 int
 main (void)
index 5215556..1bc1f43 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#if (OS_IS_WIN32 || HAVE_PIPE == 0 || HAVE_WAITPID == 0)
+#if (OS_IS_WIN32 || defined __OS2__ || HAVE_PIPE == 0 || HAVE_WAITPID == 0)
 
 int
 main (void)
index 96fd926..6728e36 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -31,7 +32,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_LEN              (1<<10)
+#define        BUFFER_LEN              (1 << 10)
 #define LOG_BUFFER_SIZE        1024
 
 static void    raw_offset_test (const char *filename, int typeminor) ;
@@ -83,8 +84,8 @@ raw_offset_test (const char *filename, int typeminor)
        sndfile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
        check_log_buffer_or_die (sndfile, __LINE__) ;
 
-       if (abs (BUFFER_LEN - sfinfo.frames) > 1)
-       {       printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ;
+       if (ABS (BUFFER_LEN - sfinfo.frames) > 1)
+       {       printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ;
                dump_log_buffer (sndfile) ;
                exit (1) ;
                } ;
index d6f1222..def53e2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2010-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -70,8 +70,8 @@ static void
 rdwr_short_test        (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    short buffer [160] ;
+       sf_count_t frames ;
+       short buffer [160] ;
 
        print_test_name ("rdwr_short_test", filename) ;
 
@@ -104,8 +104,8 @@ static void
 rdwr_int_test  (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    int buffer [160] ;
+       sf_count_t frames ;
+       int buffer [160] ;
 
        print_test_name ("rdwr_int_test", filename) ;
 
@@ -138,8 +138,8 @@ static void
 rdwr_float_test        (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    float buffer [160] ;
+       sf_count_t frames ;
+       float buffer [160] ;
 
        print_test_name ("rdwr_float_test", filename) ;
 
@@ -172,8 +172,8 @@ static void
 rdwr_double_test       (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    double buffer [160] ;
+       sf_count_t frames ;
+       double buffer [160] ;
 
        print_test_name ("rdwr_double_test", filename) ;
 
@@ -206,8 +206,8 @@ static void
 rdwr_raw_test  (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    unsigned char buffer [160] ;
+       sf_count_t frames ;
+       unsigned char buffer [160] ;
 
        print_test_name ("rdwr_raw_test", filename) ;
 
index dc862e2..8cfdd36 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2010-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software ; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -70,8 +70,8 @@ main (void)
 rdwr_[+ (get "name") +]_test   (const char *filename)
 {      SNDFILE *file ;
        SF_INFO sfinfo ;
-    sf_count_t frames ;
-    [+ (get "type") +] buffer [160] ;
+       sf_count_t frames ;
+       [+ (get "type") +] buffer [160] ;
 
        print_test_name ("rdwr_[+ (get "name") +]_test", filename) ;
 
index 57b0b96..defca24 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-#include <math.h>
-
 #include <sndfile.h>
 
 #include "utils.h"
@@ -175,7 +175,7 @@ flt_scale_clip_test_16 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -305,7 +305,7 @@ flt_scale_clip_test_24 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -435,7 +435,7 @@ flt_scale_clip_test_32 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -565,7 +565,7 @@ flt_scale_clip_test_08 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -697,7 +697,7 @@ dbl_scale_clip_test_16 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -827,7 +827,7 @@ dbl_scale_clip_test_24 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -957,7 +957,7 @@ dbl_scale_clip_test_32 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1087,7 +1087,7 @@ dbl_scale_clip_test_08 (const char *filename, int filetype, float maxval)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1219,7 +1219,7 @@ static void flt_short_clip_read_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1292,7 +1292,7 @@ static void flt_int_clip_read_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1366,7 +1366,7 @@ static void dbl_short_clip_read_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1439,7 +1439,7 @@ static void dbl_int_clip_read_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1516,7 +1516,7 @@ static void short_flt_scale_write_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != 3 * BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1609,7 +1609,7 @@ static void short_dbl_scale_write_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != 3 * BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1703,7 +1703,7 @@ static void int_flt_scale_write_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != 3 * BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1796,7 +1796,7 @@ static void int_dbl_scale_write_test (const char *filename, int filetype)
                } ;
 
        if (sfinfo.frames != 3 * BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
index 3459819..9974f11 100644 (file)
@@ -19,13 +19,13 @@ float_type = {
 int_type = {
        int_type_name   = "short" ;
        int_short_name  = "s" ;
-       int_max_value   = 0x7FFFF ;
+       int_max_value   = "0x7FFFF" ;
        } ;
 
 int_type = {
        int_type_name   = "int" ;
        int_short_name  = "i" ;
-       int_max_value   = 0x7FFFFFFF ;
+       int_max_value   = "0x7FFFFFFF" ;
        } ;
 
 
index d8a8b32..39ddf57 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-#include <math.h>
-
 #include <sndfile.h>
 
 #include "utils.h"
@@ -167,7 +167,7 @@ main (void)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -301,7 +301,7 @@ main (void)
                } ;
 
        if (sfinfo.frames != BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -380,7 +380,7 @@ main (void)
                } ;
 
        if (sfinfo.frames != 3 * BUFFER_SIZE)
-       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %ld).\n\n", __LINE__, 3 * BUFFER_SIZE, SF_COUNT_TO_LONG (sfinfo.frames)) ;
+       {       printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ;
                exit (1) ;
                } ;
 
index 1d941bd..a893915 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 
 #include "utils.h"
 
-#define        BUFFER_LEN              (1<<16)
+#define        BUFFER_LEN              (1 << 16)
 
 static void    stdin_test      (int typemajor, int count) ;
 
@@ -123,9 +123,9 @@ main (int argc, char *argv [])
                } ;
 
        if (test_count == 0)
-       {       fprintf (stderr, "************************************\n") ;
-               fprintf (stderr, "*  No '%s' test defined.\n", argv [1]) ;
-               fprintf (stderr, "************************************\n") ;
+       {       fprintf (stderr, "\n*****************************************\n") ;
+               fprintf (stderr, "*  stdin_test : No '%s' test defined.\n", argv [1]) ;
+               fprintf (stderr, "*****************************************\n") ;
                return 1 ;
                } ;
 
index 042a59a..9404698 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2001-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all =! strcmp (argv [1], "all") ;
+       do_all = ! strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "raw"))
        {       stdout_test     (SF_FORMAT_RAW, PIPE_TEST_LEN) ;
@@ -111,9 +111,9 @@ main (int argc, char *argv [])
                } ;
 
        if (test_count == 0)
-       {       fprintf (stderr, "************************************\n") ;
-               fprintf (stderr, "*  No '%s' test defined.\n", argv [1]) ;
-               fprintf (stderr, "************************************\n") ;
+       {       fprintf (stderr, "\n******************************************\n") ;
+               fprintf (stderr, "*  stdout_test : No '%s' test defined.\n", argv [1]) ;
+               fprintf (stderr, "******************************************\n") ;
                return 1 ;
                } ;
 
@@ -138,8 +138,14 @@ stdout_test        (int typemajor, int count)
                data [k] = PIPE_INDEX (k) ;
 
        if ((file = sf_open ("-", SFM_WRITE, &sfinfo)) == NULL)
-       {       fprintf (stderr, "sf_open_write failed with error : ") ;
-               fprintf (stderr, "%s\n", sf_strerror (NULL)) ;
+       {       fprintf (stderr, "%s % d: sf_open_write failed with error : %s\n",
+                                                                       __func__, __LINE__, sf_strerror (NULL)) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.frames != 0)
+       {       fprintf (stderr, "%s % d: Frames is %d (should be 0).\n",
+                                                                       __func__, __LINE__, (int) sfinfo.frames) ;
                exit (1) ;
                } ;
 
index 758612e..eac716e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003-2013 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <inttypes.h>
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -39,6 +40,8 @@ static void   string_start_end_test (const char *filename, int typemajor) ;
 static void    string_multi_set_test (const char *filename, int typemajor) ;
 static void    string_rdwr_test (const char *filename, int typemajor) ;
 static void    string_short_rdwr_test (const char *filename, int typemajor) ;
+static void    string_rdwr_grow_test (const char *filename, int typemajor) ;
+static void    string_header_update (const char *filename, int typemajor) ;
 
 static void    software_string_test (const char *filename) ;
 
@@ -60,13 +63,15 @@ main (int argc, char *argv [])
                exit (1) ;
                } ;
 
-       do_all =! strcmp (argv [1], "all") ;
+       do_all = ! strcmp (argv [1], "all") ;
 
        if (do_all || ! strcmp (argv [1], "wav"))
        {       string_start_end_test ("strings.wav", SF_FORMAT_WAV) ;
                string_multi_set_test ("multi.wav", SF_FORMAT_WAV) ;
                string_rdwr_test ("rdwr.wav", SF_FORMAT_WAV) ;
                string_short_rdwr_test ("short_rdwr.wav", SF_FORMAT_WAV) ;
+               string_rdwr_grow_test ("rdwr_grow.wav", SF_FORMAT_WAV) ;
+               string_header_update ("header_update.wav", SF_FORMAT_WAV) ;
 
                string_start_end_test ("strings.wavex", SF_FORMAT_WAVEX) ;
                string_multi_set_test ("multi.wavex", SF_FORMAT_WAVEX) ;
@@ -85,10 +90,14 @@ main (int argc, char *argv [])
        if (do_all || ! strcmp (argv [1], "aiff"))
        {       string_start_end_test ("strings.aiff", SF_FORMAT_AIFF) ;
                /*
+               TODO : Fix src/aiff.c so these tests pass.
                string_multi_set_test ("multi.aiff", SF_FORMAT_AIFF) ;
                string_rdwr_test ("rdwr.aiff", SF_FORMAT_AIFF) ;
                string_short_rdwr_test ("short_rdwr.aiff", SF_FORMAT_AIFF) ;
+               string_rdwr_grow_test ("rdwr_grow.aiff", SF_FORMAT_AIFF) ;
+               string_header_update ("header_update.aiff", SF_FORMAT_AIFF) ;
                */
+
                test_count++ ;
                } ;
 
@@ -158,10 +167,9 @@ string_start_end_test (const char *filename, int typemajor)
        SF_INFO         sfinfo ;
        int                     errors = 0 ;
 
-       typemajor = typemajor ;
-
        print_test_name ("string_start_end_test", filename) ;
 
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
        sfinfo.samplerate       = 44100 ;
        sfinfo.channels         = 1 ;
        sfinfo.frames           = 0 ;
@@ -307,6 +315,7 @@ string_start_test (const char *filename, int typemajor)
 
        print_test_name ("string_start_test", filename) ;
 
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
        sfinfo.samplerate       = 44100 ;
        sfinfo.channels         = 1 ;
        sfinfo.frames           = 0 ;
@@ -442,6 +451,7 @@ string_multi_set_test (const char *filename, int typemajor)
 
        print_test_name (__func__, filename) ;
 
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
        sfinfo.format           = typemajor | SF_FORMAT_PCM_16 ;
        sfinfo.samplerate       = 44100 ;
        sfinfo.channels         = 1 ;
@@ -518,7 +528,7 @@ string_rdwr_test (const char *filename, int typemajor)
        sf_close (file) ;
 
        file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
-       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %lld should be %lld.\n", __LINE__, sfinfo.frames, frames) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
        str = sf_get_string (file, SF_STR_TITLE) ;
        exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ;
        exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ;
@@ -545,7 +555,7 @@ string_rdwr_test (const char *filename, int typemajor)
        exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ;
        exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ;
 
-       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %lld should be %lld.\n", __LINE__, sfinfo.frames, frames) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
 
        sf_close (file) ;
        unlink (filename) ;
@@ -579,7 +589,7 @@ string_short_rdwr_test (const char *filename, int typemajor)
 
        /* Open the file RDWR. */
        file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
-       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %lld should be %lld.\n", __LINE__, sfinfo.frames, frames) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
        str = sf_get_string (file, SF_STR_TITLE) ;
        exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ;
        exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ;
@@ -623,8 +633,7 @@ str_count (const char * haystack, const char * needle)
        return count ;
 } /* str_count */
 
-#define MIN(a,b)  ((a) < (b) ? (a) : (b))
-
+#define MIN(a, b)      ((a) < (b) ? (a) : (b))
 
 static void
 software_string_test (const char *filename)
@@ -634,7 +643,7 @@ software_string_test (const char *filename)
 
        for (k = 0 ; k < 50 ; k++)
        {       const char *result ;
-               char sfname [64] ;
+               char sfname [64] = "" ;
                SNDFILE *file ;
                SF_INFO info ;
 
@@ -654,10 +663,133 @@ software_string_test (const char *filename)
                exit_if_true (result == NULL, "\n\nLine %d : sf_get_string (file, SF_STR_SOFTWARE) returned NULL.\n\n", __LINE__) ;
 
                exit_if_true (strstr (result, sfname) != result,
-                       "\n\nLine %d : String '%s''%s' -> '%s'\n\n", sfname, result) ;
+                       "\n\nLine %d : Can't fine string '%s' in '%s'\n\n", __LINE__, sfname, result) ;
                sf_close (file) ;
                } ;
 
        unlink (filename) ;
        puts ("ok") ;
-} /* new_test_test */
+} /* software_string_test */
+
+
+static void
+string_rdwr_grow_test (const char *filename, int typemajor)
+{      SNDFILE *file ;
+       SF_INFO sfinfo ;
+       sf_count_t frames ;
+       const char * str ;
+
+       print_test_name (__func__, filename) ;
+
+       /* Create a file that contains some strings. Then open the file in RDWR mode and
+                grow the file by writing more audio data to it. Check that the audio data has
+                been added to the file, and that the strings are still there. */
+
+       /* Create a short file that contains a string. */
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.channels         = 2 ;
+       sfinfo.frames           = 0 ;
+       sfinfo.format           = typemajor | SF_FORMAT_PCM_16 ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+       /* Write data to file. */
+       test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
+
+       /* Write some strings at end of file. */
+       sf_set_string (file, SF_STR_TITLE , title) ;
+       sf_set_string (file, SF_STR_COMMENT, comment) ;
+       sf_close (file) ;
+
+
+       /* Now open file again in SFM_RDWR mode and write more audio data to it. */
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
+       /* Write more data to file.  */
+       test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
+       sf_close (file) ;
+
+
+       /* Now open file again. It should now contain two BUFFER_LEN's worth of frames and the strings. */
+       frames = 2 * BUFFER_LEN / sfinfo.channels ;
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
+
+       /* Check the strings */
+       str = sf_get_string (file, SF_STR_TITLE) ;
+       exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ;
+       exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ;
+
+       str = sf_get_string (file, SF_STR_COMMENT) ;
+       exit_if_true (str == NULL, "\n\nLine %d : SF_STR_COMMENT string is NULL.\n", __LINE__) ;
+       exit_if_true (strcmp (str, comment) != 0, "\n\nLine %d : SF_STR_COMMENT doesn't match what was written.\n", __LINE__) ;
+
+       sf_close (file) ;
+       unlink (filename) ;
+
+       puts ("ok") ;
+} /* string_rdwr_grow_test */
+
+static void
+string_header_update (const char *filename, int typemajor)
+{      SNDFILE *file , *file1 ;
+       SF_INFO sfinfo , sfinfo1 ;
+       sf_count_t frames ;
+       const char * str ;
+       const int GROW_BUFFER_AMOUNT = 4 ; /* this should be less than half the size of the string header */
+
+       print_test_name (__func__, filename) ;
+
+       /* Create a short file. */
+       memset (&sfinfo, 0, sizeof (sfinfo)) ;
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.channels         = 2 ;
+       sfinfo.frames           = 0 ;
+       sfinfo.format           = typemajor | SF_FORMAT_PCM_16 ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
+       test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ;
+       sf_set_string (file, SF_STR_TITLE, long_title) ;
+       sf_close (file) ;
+
+
+       /* Check that SFC_UPDATE_HEADER_NOW correctly calculates datalength. */
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
+       /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */
+       test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ;
+
+       /* Update the header without closing the file. */
+       sf_command (file, SFC_UPDATE_HEADER_NOW, NULL, 0) ;
+
+       /* The file should now contain BUFFER_LEN + GROW_BUFFER_AMOUNT frames.
+               Open a second handle to the file and check the reported length. */
+       memset (&sfinfo1, 0, sizeof (sfinfo1)) ;
+       file1 = test_open_file_or_die (filename, SFM_READ, &sfinfo1, SF_TRUE, __LINE__) ;
+
+       frames = (BUFFER_LEN + GROW_BUFFER_AMOUNT) / sfinfo.channels ;
+       exit_if_true (frames != sfinfo1.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo1.frames, frames) ;
+
+       /* The strings are probably not readable by the second soundfile handle because write_tailer has not yet been called.
+               It's a design decision whether SFC_UPDATE_HEADER_NOW should write the tailer. I think it's fine that it doesn't.  */
+
+       sf_close (file1) ;
+       sf_close (file) ;
+
+
+       /* Check that sf_close correctly calculates datalength. */
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
+       /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */
+       test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ;
+       sf_close (file) ;
+
+
+       /* Open file again and verify data and string. */
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
+       frames = (BUFFER_LEN + 2*GROW_BUFFER_AMOUNT) / sfinfo.channels ;
+       exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
+       str = sf_get_string (file, SF_STR_TITLE) ;
+       exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ;
+       exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ;
+       sf_close (file) ;
+       unlink (filename) ;
+       puts ("ok") ;
+} /* string_header_update */
index 1595246..e743806 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+# Copyright (C) 2008-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 #
 # All rights reserved.
 #
@@ -33,7 +33,7 @@
 
 HOST_TRIPLET=@HOST_TRIPLET@
 PACKAGE_VERSION=@PACKAGE_VERSION@
-LIB_VERSION=`echo $PACKAGE_VERSION | sed "s/[a-z].*//"`
+LIB_VERSION=$(echo $PACKAGE_VERSION | sed "s/[a-z].*//")
 
 if test -f tests/sfversion@EXEEXT@ ; then
        cd tests
@@ -53,9 +53,9 @@ if test -f libsndfile.so.$LIB_VERSION ; then
                fi
        fi
 
-sfversion=`./sfversion@EXEEXT@ | sed "s/-exp$//"`
+sfversion=$(./sfversion@EXEEXT@ | sed "s/-exp$//")
 
-if test $sfversion != libsndfile-$PACKAGE_VERSION ; then
+if test "$sfversion" != libsndfile-$PACKAGE_VERSION ; then
        echo "Error : sfversion ($sfversion) and PACKAGE_VERSION ($PACKAGE_VERSION) don't match."
        exit 1
        fi
@@ -93,6 +93,7 @@ if test -x test_main@EXEEXT@ ; then
 ./command_test@EXEEXT@ bext
 ./command_test@EXEEXT@ bextch
 ./command_test@EXEEXT@ chanmap
+./command_test@EXEEXT@ cart
 ./floating_point_test@EXEEXT@
 ./checksum_test@EXEEXT@
 ./scale_clip_test@EXEEXT@
@@ -102,6 +103,7 @@ if test -x test_main@EXEEXT@ ; then
 ./win32_ordinal_test@EXEEXT@
 ./external_libs_test@EXEEXT@
 ./format_check_test@EXEEXT@
+./channel_test@EXEEXT@
 
 # The w64 G++ compiler requires an extra runtime DLL which we don't have,
 # so skip this test.
@@ -133,6 +135,7 @@ echo "=========================="
 ./string_test@EXEEXT@ aiff
 ./multi_file_test@EXEEXT@ aiff
 ./aiff_rw_test@EXEEXT@
+./chunk_test@EXEEXT@ aiff
 echo "----------------------------------------------------------------------"
 echo "  $sfversion passed tests on AIFF files."
 echo "----------------------------------------------------------------------"
@@ -157,6 +160,8 @@ echo "----------------------------------------------------------------------"
 ./header_test@EXEEXT@ caf
 ./peak_chunk_test@EXEEXT@ caf
 ./misc_test@EXEEXT@ caf
+./chunk_test@EXEEXT@ caf
+./long_read_write_test@EXEEXT@ alac
 echo "----------------------------------------------------------------------"
 echo "  $sfversion passed tests on CAF files."
 echo "----------------------------------------------------------------------"
@@ -175,6 +180,7 @@ echo "----------------------------------------------------------------------"
 ./misc_test@EXEEXT@ wav
 ./string_test@EXEEXT@ wav
 ./multi_file_test@EXEEXT@ wav
+./chunk_test@EXEEXT@ wav
 echo "----------------------------------------------------------------------"
 echo "  $sfversion passed tests on WAV files."
 echo "----------------------------------------------------------------------"
@@ -333,6 +339,7 @@ echo "----------------------------------------------------------------------"
 
 # flac-tests
 ./write_read_test@EXEEXT@ flac
+./compression_size_test@EXEEXT@ flac
 ./string_test@EXEEXT@ flac
 echo "----------------------------------------------------------------------"
 echo "  $sfversion passed tests on FLAC files."
@@ -340,7 +347,7 @@ echo "----------------------------------------------------------------------"
 
 # vorbis-tests
 ./ogg_test@EXEEXT@
-./vorbis_test@EXEEXT@
+./compression_size_test@EXEEXT@ vorbis
 ./lossy_comp_test@EXEEXT@ ogg_vorbis
 ./string_test@EXEEXT@ ogg
 ./misc_test@EXEEXT@ ogg
index c2644f1..fc0d497 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -203,21 +203,21 @@ unsigned char ulaw_encode (int sample)
                7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
                } ;
 
-    int sign, exponent, mantissa ;
-    unsigned char ulawbyte ;
+       int sign, exponent, mantissa ;
+       unsigned char ulawbyte ;
 
-    /* Get the sample into sign-magnitude. */
-    sign = (sample >> 8) & 0x80 ;                                      /* set aside the sign */
-    if ( sign != 0 )
+       /* Get the sample into sign-magnitude. */
+       sign = (sample >> 8) & 0x80 ;                                   /* set aside the sign */
+       if (sign != 0)
                sample = -sample ;                                                      /* get magnitude */
-    if ( sample > uCLIP )
+       if (sample > uCLIP)
                sample = uCLIP ;                                                        /* clip the magnitude */
 
-    /* Convert from 16 bit linear to ulaw. */
-    sample = sample + uBIAS ;
-    exponent = exp_lut [( sample >> 7 ) & 0xFF] ;
-    mantissa = (sample >> ( exponent + 3 ) ) & 0x0F ;
-    ulawbyte = ~ (sign | ( exponent << 4 ) | mantissa) ;
+       /* Convert from 16 bit linear to ulaw. */
+       sample = sample + uBIAS ;
+       exponent = exp_lut [(sample >> 7) & 0xFF] ;
+       mantissa = (sample >> (exponent + 3)) & 0x0F ;
+       ulawbyte = ~ (sign | (exponent << 4) | mantissa) ;
 
        return ulawbyte ;
 } /* ulaw_encode */
@@ -242,16 +242,16 @@ unsigned char ulaw_encode (int sample)
 static
 int ulaw_decode (unsigned int ulawbyte)
 {      static int exp_lut [8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 } ;
-    int sign, exponent, mantissa, sample ;
-
-    ulawbyte = ~ ulawbyte ;
-    sign = (ulawbyte & 0x80) ;
-    exponent = (ulawbyte >> 4) & 0x07 ;
-    mantissa = ulawbyte & 0x0F ;
-    sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ;
-    if (sign != 0)
+       int sign, exponent, mantissa, sample ;
+
+       ulawbyte = ~ ulawbyte ;
+       sign = (ulawbyte & 0x80) ;
+       exponent = (ulawbyte >> 4) & 0x07 ;
+       mantissa = ulawbyte & 0x0F ;
+       sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ;
+       if (sign != 0)
                sample = -sample ;
 
-    return sample ;
+       return sample ;
 } /* ulaw_decode */
 
index 882c969..18b4f36 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -71,13 +71,8 @@ gen_windowed_sine_float (float *data, int len, double maximum)
 {      int k ;
 
        memset (data, 0, len * sizeof (float)) ;
-       /*
-       **      Choose a frequency of 1/32 so that it aligns perfectly with a DFT
-       **      bucket to minimise spreading of energy over more than one bucket.
-       **      Also do not want to make the frequency too high as some of the
-       **      codecs (ie gsm610) have a quite severe high frequency roll off.
-       */
-       len /= 2 ;
+
+       len = (5 * len) / 6 ;
 
        for (k = 0 ; k < len ; k++)
        {       data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ;
@@ -94,13 +89,8 @@ gen_windowed_sine_double (double *data, int len, double maximum)
 {      int k ;
 
        memset (data, 0, len * sizeof (double)) ;
-       /*
-       **      Choose a frequency of 1/32 so that it aligns perfectly with a DFT
-       **      bucket to minimise spreading of energy over more than one bucket.
-       **      Also do not want to make the frequency too high as some of the
-       **      codecs (ie gsm610) have a quite severe high frequency roll off.
-       */
-       len /= 2 ;
+
+       len = (5 * len) / 6 ;
 
        for (k = 0 ; k < len ; k++)
        {       data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ;
@@ -152,17 +142,17 @@ check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num
 
        while ((read_count = fread (buf, 1, sizeof (buf), file)))
                for (k = 0 ; k < read_count ; k++)
-                       cksum = cksum * 511 + buf [k] ;
+                       cksum = (cksum * 511 + buf [k]) & 0xfffffffffffff ;
 
        fclose (file) ;
 
        if (target_hash == 0)
-       {       printf (" 0x%016" PRIx64 "\n", cksum) ;
+       {       printf (" 0x%" PRIx64 "\n", cksum) ;
                return ;
                } ;
 
        if (cksum != target_hash)
-       {       printf ("\n\nLine %d: incorrect hash value 0x%016" PRIx64 " should be 0x%016" PRIx64 ".\n\n", line_num, cksum, target_hash) ;
+       {       printf ("\n\nLine %d: incorrect hash value 0x%" PRIx64 " should be 0x%" PRIx64 ".\n\n", line_num, cksum, target_hash) ;
                exit (1) ;
                } ;
 
@@ -401,7 +391,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
        int k, m, ch, readcount ;
 
        if (length > 1000000)
-       {       printf ("\n\nError : length (%ld) too long.\n\n", SF_COUNT_TO_LONG (offset)) ;
+       {       printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ;
                exit (1) ;
                } ;
 
@@ -411,7 +401,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
                } ;
 
        if (fseek (file, offset, SEEK_SET) != 0)
-       {       printf ("\n\nError : fseek(file, %ld, SEEK_SET) failed : %s\n\n", SF_COUNT_TO_LONG (offset), strerror (errno)) ;
+       {       printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ;
                exit (1) ;
                } ;
 
@@ -420,7 +410,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
        for (k = 0 ; k < length ; k+= sizeof (buffer))
        {       readcount = fread (buffer, 1, sizeof (buffer), file) ;
 
-               printf ("%08lx : ", SF_COUNT_TO_LONG (offset + k)) ;
+               printf ("%08" PRIx64 " : ", offset + k) ;
 
                for (m = 0 ; m < readcount ; m++)
                        printf ("%02x ", buffer [m] & 0xFF) ;
@@ -549,7 +539,7 @@ test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count
        {       printf ("\n\nLine %d ", line_num) ;
                if (pass > 0)
                        printf ("(pass %d): ", pass) ;
-               printf ("Read position (%ld) should be %ld.\n", SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (read_pos)) ;
+               printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ;
                exit (1) ;
                } ;
 
@@ -558,8 +548,7 @@ test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : Write position (%ld) should be %ld.\n",
-                                               SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (write_pos)) ;
+               printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ;
                exit (1) ;
                } ;
 
@@ -612,9 +601,8 @@ test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_p
        channel_name = (channels == 1) ? "Mono" : "Stereo" ;
 
        if ((position = sf_seek (file, offset, whence)) != new_pos)
-       {       printf ("\n\nLine %d : %s : sf_seek (file, %ld, %s) returned %ld (should be %ld).\n\n",
-                                       line_num, channel_name, SF_COUNT_TO_LONG (offset), whence_name,
-                                       SF_COUNT_TO_LONG (position), SF_COUNT_TO_LONG (new_pos)) ;
+       {       printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n",
+                                       line_num, channel_name, offset, whence_name, position, new_pos) ;
                exit (1) ;
                } ;
 
@@ -630,8 +618,8 @@ test_read_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t items,
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_short failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_short failed with short read (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -648,8 +636,8 @@ test_read_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t items, int
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_int failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_int failed with short read (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -666,8 +654,8 @@ test_read_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t items,
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_float failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_float failed with short read (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -684,8 +672,8 @@ test_read_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t items
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_double failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_double failed with short read (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -703,8 +691,8 @@ test_readf_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t frames
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_readf_short failed with short readf (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_readf_short failed with short readf (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -721,8 +709,8 @@ test_readf_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t frames, in
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_readf_int failed with short readf (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_readf_int failed with short readf (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -739,8 +727,8 @@ test_readf_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t frames
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_readf_float failed with short readf (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_readf_float failed with short readf (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -757,8 +745,8 @@ test_readf_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t fram
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_readf_double failed with short readf (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_readf_double failed with short readf (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -776,8 +764,7 @@ test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_raw failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -796,8 +783,8 @@ test_write_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_short failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_short failed with short write (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -814,8 +801,8 @@ test_write_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t item
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_int failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_int failed with short write (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -832,8 +819,8 @@ test_write_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_float failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_float failed with short write (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -850,8 +837,8 @@ test_write_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_double failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_double failed with short write (%" PRId64 " => %" PRId64 ").\n",
+                                               items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -869,8 +856,8 @@ test_writef_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_writef_short failed with short writef (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_writef_short failed with short writef (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -887,8 +874,8 @@ test_writef_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t fra
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_writef_int failed with short writef (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_writef_int failed with short writef (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -905,8 +892,8 @@ test_writef_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_writef_float failed with short writef (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_writef_float failed with short writef (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -923,8 +910,8 @@ test_writef_double_or_die (SNDFILE *file, int pass, const double *test, sf_count
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_writef_double failed with short writef (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (frames), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_writef_double failed with short writef (%" PRId64 " => %" PRId64 ").\n",
+                                               frames, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -942,8 +929,7 @@ test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t ite
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_raw failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -954,52 +940,52 @@ test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t ite
 
 
 void
-compare_short_or_die (const short *left, const short *right, unsigned count, int line_num)
+compare_short_or_die (const short *expected, const short *actual, unsigned count, int line_num)
 {
        unsigned k ;
 
-       for (k = 0 ; k < count ;k++)
-               if (left [k] != right [k])
-               {       printf ("\n\nLine %d : Error at index %d, " "% d" " should be " "% d" ".\n\n", line_num, k, left [k], right [k]) ;
+       for (k = 0 ; k < count ; k++)
+               if (expected [k] != actual [k])
+               {       printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
                        exit (1) ;
                        } ;
 
        return ;
 } /* compare_short_or_die */
 void
-compare_int_or_die (const int *left, const int *right, unsigned count, int line_num)
+compare_int_or_die (const int *expected, const int *actual, unsigned count, int line_num)
 {
        unsigned k ;
 
-       for (k = 0 ; k < count ;k++)
-               if (left [k] != right [k])
-               {       printf ("\n\nLine %d : Error at index %d, " "% d" " should be " "% d" ".\n\n", line_num, k, left [k], right [k]) ;
+       for (k = 0 ; k < count ; k++)
+               if (expected [k] != actual [k])
+               {       printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
                        exit (1) ;
                        } ;
 
        return ;
 } /* compare_int_or_die */
 void
-compare_float_or_die (const float *left, const float *right, unsigned count, int line_num)
+compare_float_or_die (const float *expected, const float *actual, unsigned count, int line_num)
 {
        unsigned k ;
 
-       for (k = 0 ; k < count ;k++)
-               if (left [k] != right [k])
-               {       printf ("\n\nLine %d : Error at index %d, " "% g" " should be " "% g" ".\n\n", line_num, k, left [k], right [k]) ;
+       for (k = 0 ; k < count ; k++)
+               if (expected [k] != actual [k])
+               {       printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
                        exit (1) ;
                        } ;
 
        return ;
 } /* compare_float_or_die */
 void
-compare_double_or_die (const double *left, const double *right, unsigned count, int line_num)
+compare_double_or_die (const double *expected, const double *actual, unsigned count, int line_num)
 {
        unsigned k ;
 
-       for (k = 0 ; k < count ;k++)
-               if (left [k] != right [k])
-               {       printf ("\n\nLine %d : Error at index %d, " "% g" " should be " "% g" ".\n\n", line_num, k, left [k], right [k]) ;
+       for (k = 0 ; k < count ; k++)
+               if (expected [k] != actual [k])
+               {       printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
                        exit (1) ;
                        } ;
 
@@ -1068,7 +1054,7 @@ void
 check_open_file_count_or_die (int lineno)
 {
 #if OS_IS_WIN32
-       lineno = 0 ;
+       (void) lineno ;
        return ;
 #else
        int k, count = 0 ;
@@ -1110,24 +1096,26 @@ write_mono_file (const char * filename, int format, int srate, float * output, i
 } /* write_mono_file */
 
 void
-gen_lowpass_noise_float (float *data, int len)
-{      int32_t value = 0x1243456 ;
+gen_lowpass_signal_float (float *data, int len)
+{      int64_t value = 0x1243456 ;
        double sample, last_val = 0.0 ;
        int k ;
 
        for (k = 0 ; k < len ; k++)
        {       /* Not a crypto quality RNG. */
-               value = 11117 * value + 211231 ;
-               value = 11117 * value + 211231 ;
-               value = 11117 * value + 211231 ;
+               value = (11117 * value + 211231) & 0xffffffff ;
+               value = (11117 * value + 211231) & 0xffffffff ;
+               value = (11117 * value + 211231) & 0xffffffff ;
 
                sample = value / (0x7fffffff * 1.000001) ;
                sample = 0.2 * sample - 0.9 * last_val ;
 
-               data [k] = last_val = sample ;
+               last_val = sample ;
+
+               data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ;
                } ;
 
-} /* gen_lowpass_noise_float */
+} /* gen_lowpass_signal_float */
 
 
 /*
index 79da286..7c1c370 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -32,10 +32,10 @@ extern "C" {
 #include <stdint.h>
 #include <stdarg.h>
 
-#define SF_COUNT_TO_LONG(x)    ((long) (x))
 #define        ARRAY_LEN(x)            ((int) (sizeof (x)) / (sizeof ((x) [0])))
 #define SIGNED_SIZEOF(x)       ((int64_t) (sizeof (x)))
 #define        NOT(x)                          (! (x))
+#define        ABS(x)                          ((x) >= 0 ? (x) : -(x))
 
 #define        PIPE_INDEX(x)   ((x) + 500)
 #define        PIPE_TEST_LEN   12345
@@ -55,6 +55,16 @@ void dump_data_to_file (const char *filename, const void *data, unsigned int dat
 
 void   write_mono_file (const char * filename, int format, int srate, float * output, int len) ;
 
+#ifdef __GNUC__
+static inline void
+exit_if_true (int test, const char *format, ...)
+#if (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO)
+       __attribute__ ((format (gnu_printf, 2, 3))) ;
+#else
+       __attribute__ ((format (printf, 2, 3))) ;
+#endif
+#endif
+
 static inline void
 exit_if_true (int test, const char *format, ...)
 {      if (test)
@@ -66,6 +76,11 @@ exit_if_true (int test, const char *format, ...)
                } ;
 } /* exit_if_true */
 
+static inline int32_t
+arith_shift_left (int32_t x, int shift)
+{      return (int32_t) (((uint32_t) x) << shift) ;
+} /* arith_shift_left */
+
 /*
 **     Functions for saving two vectors of data in an ascii text file which
 **     can then be loaded into GNU octave for comparison.
@@ -161,14 +176,14 @@ void      test_writef_double_or_die
 void
 test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ;
 
-void compare_short_or_die (const short *left, const short *right, unsigned count, int line_num) ;
-void compare_int_or_die (const int *left, const int *right, unsigned count, int line_num) ;
-void compare_float_or_die (const float *left, const float *right, unsigned count, int line_num) ;
-void compare_double_or_die (const double *left, const double *right, unsigned count, int line_num) ;
+void compare_short_or_die (const short *expected, const short *actual, unsigned count, int line_num) ;
+void compare_int_or_die (const int *expected, const int *actual, unsigned count, int line_num) ;
+void compare_float_or_die (const float *expected, const float *actual, unsigned count, int line_num) ;
+void compare_double_or_die (const double *expected, const double *actual, unsigned count, int line_num) ;
 
 
 
-void   gen_lowpass_noise_float (float *data, int len) ;
+void   gen_lowpass_signal_float (float *data, int len) ;
 
 sf_count_t             file_length (const char * fname) ;
 sf_count_t             file_length_fd (int fd) ;
index f517e23..35aaaf3 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template h c +]
 /*
-** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -34,10 +34,10 @@ extern "C" {
 #include <stdint.h>
 #include <stdarg.h>
 
-#define SF_COUNT_TO_LONG(x)    ((long) (x))
 #define        ARRAY_LEN(x)            ((int) (sizeof (x)) / (sizeof ((x) [0])))
 #define SIGNED_SIZEOF(x)       ((int64_t) (sizeof (x)))
 #define        NOT(x)                          (! (x))
+#define        ABS(x)                          ((x) >= 0 ? (x) : -(x))
 
 #define        PIPE_INDEX(x)   ((x) + 500)
 #define        PIPE_TEST_LEN   12345
@@ -58,6 +58,16 @@ void dump_data_to_file (const char *filename, const void *data, unsigned int dat
 
 void   write_mono_file (const char * filename, int format, int srate, float * output, int len) ;
 
+#ifdef __GNUC__
+static inline void
+exit_if_true (int test, const char *format, ...)
+#if (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO)
+       __attribute__ ((format (gnu_printf, 2, 3))) ;
+#else
+       __attribute__ ((format (printf, 2, 3))) ;
+#endif
+#endif
+
 static inline void
 exit_if_true (int test, const char *format, ...)
 {      if (test)
@@ -69,6 +79,11 @@ exit_if_true (int test, const char *format, ...)
                } ;
 } /* exit_if_true */
 
+static inline int32_t
+arith_shift_left (int32_t x, int shift)
+{      return (int32_t) (((uint32_t) x) << shift) ;
+} /* arith_shift_left */
+
 /*
 **     Functions for saving two vectors of data in an ascii text file which
 **     can then be loaded into GNU octave for comparison.
@@ -136,11 +151,11 @@ void
 test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ;
 
 [+ FOR io_type
-+]void compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *left, const [+ (get "io_element") +] *right, unsigned count, int line_num) ;
++]void compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num) ;
 [+ ENDFOR io_type +]
 
 
-void   gen_lowpass_noise_float (float *data, int len) ;
+void   gen_lowpass_signal_float (float *data, int len) ;
 
 sf_count_t             file_length (const char * fname) ;
 sf_count_t             file_length_fd (int fd) ;
@@ -199,13 +214,8 @@ gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double
 {      int k ;
 
        memset (data, 0, len * sizeof ([+ (get "name") +])) ;
-       /*
-       **      Choose a frequency of 1/32 so that it aligns perfectly with a DFT
-       **      bucket to minimise spreading of energy over more than one bucket.
-       **      Also do not want to make the frequency too high as some of the
-       **      codecs (ie gsm610) have a quite severe high frequency roll off.
-       */
-       len /= 2 ;
+
+       len = (5 * len) / 6 ;
 
        for (k = 0 ; k < len ; k++)
        {       data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ;
@@ -257,17 +267,17 @@ check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num
 
        while ((read_count = fread (buf, 1, sizeof (buf), file)))
                for (k = 0 ; k < read_count ; k++)
-                       cksum = cksum * 511 + buf [k] ;
+                       cksum = (cksum * 511 + buf [k]) & 0xfffffffffffff ;
 
        fclose (file) ;
 
        if (target_hash == 0)
-       {       printf (" 0x%016" PRIx64 "\n", cksum) ;
+       {       printf (" 0x%" PRIx64 "\n", cksum) ;
                return ;
                } ;
 
        if (cksum != target_hash)
-       {       printf ("\n\nLine %d: incorrect hash value 0x%016" PRIx64 " should be 0x%016" PRIx64 ".\n\n", line_num, cksum, target_hash) ;
+       {       printf ("\n\nLine %d: incorrect hash value 0x%" PRIx64 " should be 0x%" PRIx64 ".\n\n", line_num, cksum, target_hash) ;
                exit (1) ;
                } ;
 
@@ -421,7 +431,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
        int k, m, ch, readcount ;
 
        if (length > 1000000)
-       {       printf ("\n\nError : length (%ld) too long.\n\n", SF_COUNT_TO_LONG (offset)) ;
+       {       printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ;
                exit (1) ;
                } ;
 
@@ -431,7 +441,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
                } ;
 
        if (fseek (file, offset, SEEK_SET) != 0)
-       {       printf ("\n\nError : fseek(file, %ld, SEEK_SET) failed : %s\n\n", SF_COUNT_TO_LONG (offset), strerror (errno)) ;
+       {       printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ;
                exit (1) ;
                } ;
 
@@ -440,7 +450,7 @@ hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
        for (k = 0 ; k < length ; k+= sizeof (buffer))
        {       readcount = fread (buffer, 1, sizeof (buffer), file) ;
 
-               printf ("%08lx : ", SF_COUNT_TO_LONG (offset + k)) ;
+               printf ("%08" PRIx64 " : ", offset + k) ;
 
                for (m = 0 ; m < readcount ; m++)
                        printf ("%02x ", buffer [m] & 0xFF) ;
@@ -569,7 +579,7 @@ test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count
        {       printf ("\n\nLine %d ", line_num) ;
                if (pass > 0)
                        printf ("(pass %d): ", pass) ;
-               printf ("Read position (%ld) should be %ld.\n", SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (read_pos)) ;
+               printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ;
                exit (1) ;
                } ;
 
@@ -578,8 +588,7 @@ test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : Write position (%ld) should be %ld.\n",
-                                               SF_COUNT_TO_LONG (pos), SF_COUNT_TO_LONG (write_pos)) ;
+               printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ;
                exit (1) ;
                } ;
 
@@ -632,9 +641,8 @@ test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_p
        channel_name = (channels == 1) ? "Mono" : "Stereo" ;
 
        if ((position = sf_seek (file, offset, whence)) != new_pos)
-       {       printf ("\n\nLine %d : %s : sf_seek (file, %ld, %s) returned %ld (should be %ld).\n\n",
-                                       line_num, channel_name, SF_COUNT_TO_LONG (offset), whence_name,
-                                       SF_COUNT_TO_LONG (position), SF_COUNT_TO_LONG (new_pos)) ;
+       {       printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n",
+                                       line_num, channel_name, offset, whence_name, position, new_pos) ;
                exit (1) ;
                } ;
 
@@ -650,8 +658,8 @@ test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, in
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG ([+ (get "count_name") +]), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n",
+                                               [+ (get "count_name") +], count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -669,8 +677,7 @@ test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_read_raw failed with short read (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -689,8 +696,8 @@ test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, in
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG ([+ (get "count_name") +]), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n",
+                                               [+ (get "count_name") +], count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -708,8 +715,7 @@ test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t ite
        {       printf ("\n\nLine %d", line_num) ;
                if (pass > 0)
                        printf (" (pass %d)", pass) ;
-               printf (" : sf_write_raw failed with short write (%ld => %ld).\n",
-                                               SF_COUNT_TO_LONG (items), SF_COUNT_TO_LONG (count)) ;
+               printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ;
                fflush (stdout) ;
                puts (sf_strerror (file)) ;
                exit (1) ;
@@ -721,13 +727,13 @@ test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t ite
 
 [+ FOR io_type
 +]void
-compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *left, const [+ (get "io_element") +] *right, unsigned count, int line_num)
+compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num)
 {
        unsigned k ;
 
-       for (k = 0 ; k < count ;k++)
-               if (left [k] != right [k])
-               {       printf ("\n\nLine %d : Error at index %d, " [+ (get "format_str") +] " should be " [+ (get "format_str") +] ".\n\n", line_num, k, left [k], right [k]) ;
+       for (k = 0 ; k < count ; k++)
+               if (expected [k] != actual [k])
+               {       printf ("\n\nLine %d : Error at index %d, got " [+ (get "format_str") +] ", should be " [+ (get "format_str") +] ".\n\n", line_num, k, actual [k], expected [k]) ;
                        exit (1) ;
                        } ;
 
@@ -796,7 +802,7 @@ void
 check_open_file_count_or_die (int lineno)
 {
 #if OS_IS_WIN32
-       lineno = 0 ;
+       (void) lineno ;
        return ;
 #else
        int k, count = 0 ;
@@ -838,24 +844,26 @@ write_mono_file (const char * filename, int format, int srate, float * output, i
 } /* write_mono_file */
 
 void
-gen_lowpass_noise_float (float *data, int len)
-{      int32_t value = 0x1243456 ;
+gen_lowpass_signal_float (float *data, int len)
+{      int64_t value = 0x1243456 ;
        double sample, last_val = 0.0 ;
        int k ;
 
        for (k = 0 ; k < len ; k++)
        {       /* Not a crypto quality RNG. */
-               value = 11117 * value + 211231 ;
-               value = 11117 * value + 211231 ;
-               value = 11117 * value + 211231 ;
+               value = (11117 * value + 211231) & 0xffffffff ;
+               value = (11117 * value + 211231) & 0xffffffff ;
+               value = (11117 * value + 211231) & 0xffffffff ;
 
                sample = value / (0x7fffffff * 1.000001) ;
                sample = 0.2 * sample - 0.9 * last_val ;
 
-               data [k] = last_val = sample ;
+               last_val = sample ;
+
+               data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ;
                } ;
 
-} /* gen_lowpass_noise_float */
+} /* gen_lowpass_signal_float */
 
 
 /*
index ce8723f..49f7860 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,6 @@
 */
 
 #include "sfconfig.h"
-#include "sndfile.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -106,7 +105,7 @@ win32_ordinal_test (void)
                } ;
 
        if (hmod == NULL)
-       {       puts ("\n\nError : cannot load DLL.\n") ;
+       {       printf ("\n\nError : cannot load DLL (cwd is %s).\n", getcwd (buffer, sizeof (buffer))) ;
                exit (1) ;
                } ;
 
index 9f8a8f5..f733cee 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
+#include <inttypes.h>
+
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-#include       <math.h>
-
-#if (defined (WIN32) || defined (_WIN32))
-#include       <fcntl.h>
-static int truncate (const char *filename, int ignored) ;
-#endif
-
-#include       <sndfile.h>
+#include <sndfile.h>
 
-#include       "utils.h"
-#include       "generate.h"
+#include "utils.h"
+#include "generate.h"
 
 #define        SAMPLE_RATE                     11025
-#define        DATA_LENGTH                     (1<<12)
+#define        DATA_LENGTH                     (1 << 12)
 
 #define        SILLY_WRITE_COUNT       (234)
 
-static void    pcm_test_char (const char *str, int format, int long_file_okz) ;
-static void    pcm_test_short (const char *str, int format, int long_file_okz) ;
-static void    pcm_test_24bit (const char *str, int format, int long_file_okz) ;
-static void    pcm_test_int (const char *str, int format, int long_file_okz) ;
-static void    pcm_test_float (const char *str, int format, int long_file_okz) ;
-static void    pcm_test_double (const char *str, int format, int long_file_okz) ;
+static void    pcm_test_char (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_short (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_20bit (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_24bit (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_int (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_float (const char *str, int format, int long_file_ok) ;
+static void    pcm_test_double (const char *str, int format, int long_file_ok) ;
 
 static void empty_file_test (const char *filename, int format) ;
 
@@ -193,6 +190,12 @@ main (int argc, char **argv)
                /* Lite remove start */
                pcm_test_float  ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
                pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
+
+               pcm_test_short  ("alac16.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ;
+               pcm_test_20bit  ("alac20.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ;
+               pcm_test_24bit  ("alac24.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ;
+               pcm_test_int    ("alac32.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ;
+
                /* Lite remove end */
                test_count++ ;
                } ;
@@ -361,6 +364,7 @@ main (int argc, char **argv)
        {       pcm_test_char   ("char.sd2"             , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ;
                pcm_test_short  ("short.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ;
                pcm_test_24bit  ("24bit.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ;
+               pcm_test_int    ("32bit.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ;
                test_count++ ;
                } ;
 
@@ -411,12 +415,13 @@ main (int argc, char **argv)
 
 static void    create_short_file (const char *filename) ;
 
-#define        CHAR_ERROR(x,y)         (abs ((x) - (y)) > 255)
-#define        INT_ERROR(x,y)          (((x) - (y)) != 0)
-#define        TRIBYTE_ERROR(x,y)      (abs ((x) - (y)) > 255)
-#define        FLOAT_ERROR(x,y)        (fabs ((x) - (y)) > 1e-5)
+#define        CHAR_ERROR(x, y)                (abs ((x) - (y)) > 255)
+#define        INT_ERROR(x, y)                 (((x) - (y)) != 0)
+#define        BIT_20_ERROR(x, y)              (abs ((x) - (y)) > 4095)
+#define        TRIBYTE_ERROR(x, y)             (abs ((x) - (y)) > 255)
+#define        FLOAT_ERROR(x, y)               (fabs ((x) - (y)) > 1e-5)
 
-#define CONVERT_DATA(k,len,new,orig)                                   \
+#define CONVERT_DATA(k, len, new, orig)                                        \
                        {       for ((k) = 0 ; (k) < (len) ; (k) ++)    \
                                        (new) [k] = (orig) [k] ;                        \
                                }
@@ -467,7 +472,12 @@ pcm_test_char (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_char_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -482,9 +492,14 @@ pcm_test_char (const char *filename, int format, int long_file_ok)
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_char_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -499,7 +514,7 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
        SF_INFO         sfinfo ;
        short           *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -538,12 +553,12 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -562,16 +577,590 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_short_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (CHAR_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
+       /* Seek to start of file. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       test_read_short_or_die (file, 0, test, 4, __LINE__) ;
+       for (k = 0 ; k < 4 ; k++)
+               if (CHAR_ERROR (orig [k], test [k]))
+               {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* For some codecs we can't go past here. */
+       if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
+                       (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
+       {       sf_close (file) ;
+               unlink (filename) ;
+               printf ("no seek : ") ;
+               return ;
+               } ;
+
+       /* Seek to offset from start of file. */
+       test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
+
+       test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
+       for (k = 10 ; k < 14 ; k++)
+               if (CHAR_ERROR (orig [k], test [k]))
+               {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to offset from current position. */
+       test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
+
+       test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ;
+       for (k = 20 ; k < 24 ; k++)
+               if (CHAR_ERROR (orig [k], test [k]))
+               {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to offset from end of file. */
+       test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
+
+       test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
+       for (k = 10 ; k < 14 ; k++)
+               if (CHAR_ERROR (orig [k], test [k]))
+               {       printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       count = 0 ;
+       while (count < sfinfo.frames)
+               count += sf_read_short (file, test, 311) ;
+
+       /* Check that no error has occurred. */
+       if (sf_error (file))
+       {       printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
+               puts (sf_strerror (file)) ;
+               exit (1) ;
+               } ;
+
+       /* Check that we haven't read beyond EOF. */
+       if (count > sfinfo.frames)
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
+               exit (1) ;
+               } ;
+
+       test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
+
+       sf_close (file) ;
+
+       multi_seek_test (filename, format) ;
+       write_seek_extend_test (filename, format) ;
+
+} /* mono_char_test */
+
+static void
+stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       short           *orig, *test ;
+       int                     k, items, frames ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
+       sfinfo.channels         = 2 ;
+       sfinfo.format           = format ;
+
+       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
+
+       orig = orig_data.s ;
+       test = test_data.s ;
+
+       /* Make this a macro so gdb steps over it in one go. */
+       CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
+
+       items = DATA_LENGTH ;
+       frames = items / sfinfo.channels ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
+
+       sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
+
+       test_writef_short_or_die (file, 0, orig, frames, __LINE__) ;
+
+       sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
+
+       sf_close (file) ;
+
+       memset (test, 0, items * sizeof (short)) ;
+
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
+               memset (&sfinfo, 0, sizeof (sfinfo)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
+
+       if (sfinfo.format != format)
+       {       printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
+                               __LINE__, format, sfinfo.format) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.frames < frames)
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
+               exit (1) ;
+               } ;
+
+       if (! long_file_ok && sfinfo.frames > frames)
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.channels != 2)
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
+               exit (1) ;
+               } ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_readf_short_or_die (file, 0, test, frames, __LINE__) ;
+       for (k = 0 ; k < items ; k++)
+               if (CHAR_ERROR (test [k], orig [k]))
+               {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to start of file. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       test_readf_short_or_die (file, 0, test, 2, __LINE__) ;
+       for (k = 0 ; k < 4 ; k++)
+               if (CHAR_ERROR (test [k], orig [k]))
+               {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to offset from start of file. */
+       test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
+
+       /* Check for errors here. */
+       if (sf_error (file))
+       {       printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
+               puts (sf_strerror (file)) ;
+               exit (1) ;
+               } ;
+
+       if (sf_read_short (file, test, 1) > 0)
+       {       printf ("Line %d: Should return 0.\n", __LINE__) ;
+               exit (1) ;
+               } ;
+
+       if (! sf_error (file))
+       {       printf ("Line %d: Should return an error.\n", __LINE__) ;
+               exit (1) ;
+               } ;
+       /*-----------------------*/
+
+       test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ;
+       for (k = 20 ; k < 24 ; k++)
+               if (CHAR_ERROR (test [k], orig [k]))
+               {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to offset from current position. */
+       test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
+
+       test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
+       for (k = 40 ; k < 44 ; k++)
+               if (CHAR_ERROR (test [k], orig [k]))
+               {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       /* Seek to offset from end of file. */
+       test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
+
+       test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
+       for (k = 20 ; k < 24 ; k++)
+               if (CHAR_ERROR (test [k], orig [k]))
+               {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       exit (1) ;
+                       } ;
+
+       sf_close (file) ;
+} /* stereo_char_test */
+
+static void
+mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       short           *orig, *test ;
+       int                     k, pass ;
+
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
+       orig = orig_data.s ;
+       test = test_data.s ;
+
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = DATA_LENGTH ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = format ;
+
+       if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
+               || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
+               || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
+               unlink (filename) ;
+       else
+       {       /* Create a short file. */
+               create_short_file (filename) ;
+
+               /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
+               ** If this returns a valif pointer sf_open() screwed up.
+               */
+               if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
+               {       printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
+                       exit (1) ;
+                       } ;
+
+               /* Truncate the file to zero bytes. */
+               if (truncate (filename, 0) < 0)
+               {       printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
+                       perror (NULL) ;
+                       exit (1) ;
+                       } ;
+               } ;
+
+       /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
+       ** all the usual data required when opening the file in WRITE mode.
+       */
+       sfinfo.samplerate       = SAMPLE_RATE ;
+       sfinfo.frames           = DATA_LENGTH ;
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = format ;
+
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
+
+       /* Do 3 writes followed by reads. After each, check the data and the current
+       ** read and write offsets.
+       */
+       for (pass = 1 ; pass <= 3 ; pass ++)
+       {       orig [20] = pass * 2 ;
+
+               /* Write some data. */
+               test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
+
+               test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
+
+               /* Read what we just wrote. */
+               test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
+
+               /* Check the data. */
+               for (k = 0 ; k < DATA_LENGTH ; k++)
+                       if (CHAR_ERROR (orig [k], test [k]))
+                       {       printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
+                               oct_save_short (orig, test, DATA_LENGTH) ;
+                               exit (1) ;
+                               } ;
+
+               test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
+               } ; /* for (pass ...) */
+
+       sf_close (file) ;
+
+       /* Open the file again to check the data. */
+       file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
+
+       if (sfinfo.format != format)
+       {       printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.frames < 3 * DATA_LENGTH)
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
+               exit (1) ;
+               }
+
+       if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.channels != 1)
+       {       printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
+               exit (1) ;
+               } ;
+
+       if (! long_file_ok)
+               test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
+       else
+               test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
+
+       for (pass = 1 ; pass <= 3 ; pass ++)
+       {       orig [20] = pass * 2 ;
+
+               test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
+
+               /* Read what we just wrote. */
+               test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
+
+               /* Check the data. */
+               for (k = 0 ; k < DATA_LENGTH ; k++)
+                       if (CHAR_ERROR (orig [k], test [k]))
+                       {       printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
+                               oct_save_short (orig, test, DATA_LENGTH) ;
+                               exit (1) ;
+                               } ;
+
+               } ; /* for (pass ...) */
+
+       sf_close (file) ;
+} /* mono_rdwr_short_test */
+
+static void
+new_rdwr_char_test (const char *filename, int format, int allow_fd)
+{      SNDFILE *wfile, *rwfile ;
+       SF_INFO sfinfo ;
+       short           *orig, *test ;
+       int             items, frames ;
+
+       orig = orig_data.s ;
+       test = test_data.s ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
+       sfinfo.channels         = 2 ;
+       sfinfo.format           = format ;
+
+       items = DATA_LENGTH ;
+       frames = items / sfinfo.channels ;
+
+       wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
+       sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
+       test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ;
+       sf_write_sync (wfile) ;
+       test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ;
+       sf_write_sync (wfile) ;
+
+       rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
+       if (sfinfo.frames != 2 * frames)
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
+               exit (1) ;
+               } ;
+
+       test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ;
+
+       test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ;
+       test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ;
+
+       sf_close (wfile) ;
+       sf_close (rwfile) ;
+} /* new_rdwr_char_test */
+
+
+/*======================================================================================
+*/
+
+static void mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void new_rdwr_short_test (const char *filename, int format, int allow_fd) ;
+static void multi_seek_test (const char * filename, int format) ;
+static void write_seek_extend_test (const char * filename, int format) ;
+
+static void
+pcm_test_short (const char *filename, int format, int long_file_ok)
+{      SF_INFO         sfinfo ;
+       short           *orig ;
+       int                     k, allow_fd ;
+
+       /* Sd2 files cannot be opened from an existing file descriptor. */
+       allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
+
+       print_test_name ("pcm_test_short", filename) ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = format ;
+
+       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
+
+       orig = orig_data.s ;
+
+       /* Make this a macro so gdb steps over it in one go. */
+       CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
+
+       /* Some test broken out here. */
+
+       mono_short_test (filename, format, long_file_ok, allow_fd) ;
+
+       /* Sub format DWVW does not allow seeking. */
+       if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
+                       (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
+       {       unlink (filename) ;
+               printf ("no seek : ok\n") ;
+               return ;
+               } ;
+
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
+               mono_rdwr_short_test (filename, format, long_file_ok, allow_fd) ;
+
+       /* If the format doesn't support stereo we're done. */
+       sfinfo.channels = 2 ;
+       if (sf_format_check (&sfinfo) == 0)
+       {       unlink (filename) ;
+               puts ("no stereo : ok") ;
+               return ;
+               } ;
+
+       stereo_short_test (filename, format, long_file_ok, allow_fd) ;
+
+       /* New read/write test. Not sure if this is needed yet. */
+
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
+               new_rdwr_short_test (filename, format, allow_fd) ;
+
+       delete_file (format, filename) ;
+
+       puts ("ok") ;
+       return ;
+} /* pcm_test_short */
+
+static void
+mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
+{      SNDFILE         *file ;
+       SF_INFO         sfinfo ;
+       short           *orig, *test ;
+       sf_count_t      count ;
+       int                     k, items, total ;
+
+       sfinfo.samplerate       = 44100 ;
+       sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
+       sfinfo.channels         = 1 ;
+       sfinfo.format           = format ;
+
+       orig = orig_data.s ;
+       test = test_data.s ;
+
+       items = DATA_LENGTH ;
+
+       file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
+
+       sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
+
+       test_write_short_or_die (file, 0, orig, items, __LINE__) ;
+       sf_write_sync (file) ;
+       test_write_short_or_die (file, 0, orig, items, __LINE__) ;
+       sf_write_sync (file) ;
+
+       /* Add non-audio data after the audio. */
+       sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
+
+       sf_close (file) ;
+
+       memset (test, 0, items * sizeof (short)) ;
+
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
+               memset (&sfinfo, 0, sizeof (sfinfo)) ;
+
+       file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
+
+       if (sfinfo.format != format)
+       {       printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.frames < 2 * items)
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
+               exit (1) ;
+               } ;
+
+       if (! long_file_ok && sfinfo.frames > 2 * items)
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
+               exit (1) ;
+               } ;
+
+       if (sfinfo.channels != 1)
+       {       printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
+               exit (1) ;
+               } ;
+
+       check_log_buffer_or_die (file, __LINE__) ;
+
+       test_read_short_or_die (file, 0, test, items, __LINE__) ;
+       for (k = 0 ; k < items ; k++)
+               if (INT_ERROR (orig [k], test [k]))
+               {       printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
+                       oct_save_short (orig, test, items) ;
+                       exit (1) ;
+                       } ;
+
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_short_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (INT_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
        test_read_short_or_die (file, 0, test, 4, __LINE__) ;
        for (k = 0 ; k < 4 ; k++)
-               if (CHAR_ERROR (orig [k], test [k]))
+               if (INT_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -585,7 +1174,7 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
 
        test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
        for (k = 10 ; k < 14 ; k++)
-               if (CHAR_ERROR (orig [k], test [k]))
+               if (INT_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -595,7 +1184,7 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
 
        test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (CHAR_ERROR (orig [k], test [k]))
+               if (INT_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -605,7 +1194,7 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
 
        test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
        for (k = 10 ; k < 14 ; k++)
-               if (CHAR_ERROR (orig [k], test [k]))
+               if (INT_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -626,7 +1215,7 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -637,10 +1226,10 @@ mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd
        multi_seek_test (filename, format) ;
        write_seek_extend_test (filename, format) ;
 
-} /* mono_char_test */
+} /* mono_short_test */
 
 static void
-stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
+stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        short           *orig, *test ;
@@ -686,14 +1275,14 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -706,7 +1295,7 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
 
        test_readf_short_or_die (file, 0, test, frames, __LINE__) ;
        for (k = 0 ; k < items ; k++)
-               if (CHAR_ERROR (test [k], orig [k]))
+               if (INT_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -716,7 +1305,7 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
 
        test_readf_short_or_die (file, 0, test, 2, __LINE__) ;
        for (k = 0 ; k < 4 ; k++)
-               if (CHAR_ERROR (test [k], orig [k]))
+               if (INT_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -744,7 +1333,7 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
 
        test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (CHAR_ERROR (test [k], orig [k]))
+               if (INT_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -754,7 +1343,7 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
 
        test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
        for (k = 40 ; k < 44 ; k++)
-               if (CHAR_ERROR (test [k], orig [k]))
+               if (INT_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -764,21 +1353,33 @@ stereo_char_test (const char *filename, int format, int long_file_ok, int allow_
 
        test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (CHAR_ERROR (test [k], orig [k]))
+               if (INT_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
 
        sf_close (file) ;
-} /* stereo_char_test */
+} /* stereo_short_test */
 
 static void
-mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
+mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
        short           *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.s ;
        test = test_data.s ;
 
@@ -837,7 +1438,7 @@ mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int all
 
                /* Check the data. */
                for (k = 0 ; k < DATA_LENGTH ; k++)
-                       if (CHAR_ERROR (orig [k], test [k]))
+                       if (INT_ERROR (orig [k], test [k]))
                        {       printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
                                oct_save_short (orig, test, DATA_LENGTH) ;
                                exit (1) ;
@@ -857,12 +1458,12 @@ mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int all
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -886,7 +1487,7 @@ mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int all
 
                /* Check the data. */
                for (k = 0 ; k < DATA_LENGTH ; k++)
-                       if (CHAR_ERROR (orig [k], test [k]))
+                       if (INT_ERROR (orig [k], test [k]))
                        {       printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
                                oct_save_short (orig, test, DATA_LENGTH) ;
                                exit (1) ;
@@ -898,7 +1499,7 @@ mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int all
 } /* mono_rdwr_short_test */
 
 static void
-new_rdwr_char_test (const char *filename, int format, int allow_fd)
+new_rdwr_short_test (const char *filename, int format, int allow_fd)
 {      SNDFILE *wfile, *rwfile ;
        SF_INFO sfinfo ;
        short           *orig, *test ;
@@ -924,7 +1525,7 @@ new_rdwr_char_test (const char *filename, int format, int allow_fd)
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -935,45 +1536,45 @@ new_rdwr_char_test (const char *filename, int format, int allow_fd)
 
        sf_close (wfile) ;
        sf_close (rwfile) ;
-} /* new_rdwr_char_test */
+} /* new_rdwr_short_test */
 
 
 /*======================================================================================
 */
 
-static void mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
-static void stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
-static void mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
-static void new_rdwr_short_test (const char *filename, int format, int allow_fd) ;
+static void mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
+static void new_rdwr_20bit_test (const char *filename, int format, int allow_fd) ;
 static void multi_seek_test (const char * filename, int format) ;
 static void write_seek_extend_test (const char * filename, int format) ;
 
 static void
-pcm_test_short (const char *filename, int format, int long_file_ok)
+pcm_test_20bit (const char *filename, int format, int long_file_ok)
 {      SF_INFO         sfinfo ;
-       short           *orig ;
+       int             *orig ;
        int                     k, allow_fd ;
 
        /* Sd2 files cannot be opened from an existing file descriptor. */
        allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
 
-       print_test_name ("pcm_test_short", filename) ;
+       print_test_name ("pcm_test_20bit", filename) ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
        sfinfo.channels         = 1 ;
        sfinfo.format           = format ;
 
-       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
+       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ;
 
-       orig = orig_data.s ;
+       orig = orig_data.i ;
 
        /* Make this a macro so gdb steps over it in one go. */
        CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
 
        /* Some test broken out here. */
 
-       mono_short_test (filename, format, long_file_ok, allow_fd) ;
+       mono_20bit_test (filename, format, long_file_ok, allow_fd) ;
 
        /* Sub format DWVW does not allow seeking. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
@@ -983,8 +1584,13 @@ pcm_test_short (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
-               mono_rdwr_short_test (filename, format, long_file_ok, allow_fd) ;
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
+               mono_rdwr_20bit_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
        sfinfo.channels = 2 ;
@@ -994,36 +1600,41 @@ pcm_test_short (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       stereo_short_test (filename, format, long_file_ok, allow_fd) ;
+       stereo_20bit_test (filename, format, long_file_ok, allow_fd) ;
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
-               new_rdwr_short_test (filename, format, allow_fd) ;
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
+               new_rdwr_20bit_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
 
        puts ("ok") ;
        return ;
-} /* pcm_test_short */
+} /* pcm_test_20bit */
 
 static void
-mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
+mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
-       short           *orig, *test ;
+       int             *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
        sfinfo.channels         = 1 ;
        sfinfo.format           = format ;
 
-       orig = orig_data.s ;
-       test = test_data.s ;
+       orig = orig_data.i ;
+       test = test_data.i ;
 
        items = DATA_LENGTH ;
 
@@ -1031,9 +1642,9 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
 
        sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
 
-       test_write_short_or_die (file, 0, orig, items, __LINE__) ;
+       test_write_int_or_die (file, 0, orig, items, __LINE__) ;
        sf_write_sync (file) ;
-       test_write_short_or_die (file, 0, orig, items, __LINE__) ;
+       test_write_int_or_die (file, 0, orig, items, __LINE__) ;
        sf_write_sync (file) ;
 
        /* Add non-audio data after the audio. */
@@ -1041,7 +1652,7 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
 
        sf_close (file) ;
 
-       memset (test, 0, items * sizeof (short)) ;
+       memset (test, 0, items * sizeof (int)) ;
 
        if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
                memset (&sfinfo, 0, sizeof (sfinfo)) ;
@@ -1054,12 +1665,12 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -1070,24 +1681,42 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
 
        check_log_buffer_or_die (file, __LINE__) ;
 
-       test_read_short_or_die (file, 0, test, items, __LINE__) ;
+       test_read_int_or_die (file, 0, test, items, __LINE__) ;
        for (k = 0 ; k < items ; k++)
-               if (INT_ERROR (orig [k], test [k]))
+               if (BIT_20_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
-                       oct_save_short (orig, test, items) ;
+                       oct_save_int (orig, test, items) ;
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (BIT_20_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
-       test_read_short_or_die (file, 0, test, 4, __LINE__) ;
+       test_read_int_or_die (file, 0, test, 4, __LINE__) ;
        for (k = 0 ; k < 4 ; k++)
-               if (INT_ERROR (orig [k], test [k]))
+               if (BIT_20_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -1099,9 +1728,9 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
        /* Seek to offset from start of file. */
        test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
 
-       test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
+       test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
        for (k = 10 ; k < 14 ; k++)
-               if (INT_ERROR (orig [k], test [k]))
+               if (BIT_20_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -1109,9 +1738,9 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
        /* Seek to offset from current position. */
        test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
 
-       test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ;
+       test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (INT_ERROR (orig [k], test [k]))
+               if (BIT_20_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -1119,9 +1748,9 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
        /* Seek to offset from end of file. */
        test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
 
-       test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
+       test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
        for (k = 10 ; k < 14 ; k++)
-               if (INT_ERROR (orig [k], test [k]))
+               if (BIT_20_ERROR (orig [k], test [k]))
                {       printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
                        exit (1) ;
                        } ;
@@ -1131,7 +1760,7 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
 
        count = 0 ;
        while (count < sfinfo.frames)
-               count += sf_read_short (file, test, 311) ;
+               count += sf_read_int (file, test, 311) ;
 
        /* Check that no error has occurred. */
        if (sf_error (file))
@@ -1142,7 +1771,7 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1153,13 +1782,13 @@ mono_short_test (const char *filename, int format, int long_file_ok, int allow_f
        multi_seek_test (filename, format) ;
        write_seek_extend_test (filename, format) ;
 
-} /* mono_short_test */
+} /* mono_20bit_test */
 
 static void
-stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
+stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
-       short           *orig, *test ;
+       int             *orig, *test ;
        int                     k, items, frames ;
 
        sfinfo.samplerate       = 44100 ;
@@ -1167,10 +1796,10 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
        sfinfo.channels         = 2 ;
        sfinfo.format           = format ;
 
-       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
+       gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ;
 
-       orig = orig_data.s ;
-       test = test_data.s ;
+       orig = orig_data.i ;
+       test = test_data.i ;
 
        /* Make this a macro so gdb steps over it in one go. */
        CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
@@ -1182,13 +1811,13 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
 
        sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
 
-       test_writef_short_or_die (file, 0, orig, frames, __LINE__) ;
+       test_writef_int_or_die (file, 0, orig, frames, __LINE__) ;
 
        sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
 
        sf_close (file) ;
 
-       memset (test, 0, items * sizeof (short)) ;
+       memset (test, 0, items * sizeof (int)) ;
 
        if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
                memset (&sfinfo, 0, sizeof (sfinfo)) ;
@@ -1202,14 +1831,14 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -1220,9 +1849,9 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
 
        check_log_buffer_or_die (file, __LINE__) ;
 
-       test_readf_short_or_die (file, 0, test, frames, __LINE__) ;
+       test_readf_int_or_die (file, 0, test, frames, __LINE__) ;
        for (k = 0 ; k < items ; k++)
-               if (INT_ERROR (test [k], orig [k]))
+               if (BIT_20_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -1230,9 +1859,9 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
-       test_readf_short_or_die (file, 0, test, 2, __LINE__) ;
+       test_readf_int_or_die (file, 0, test, 2, __LINE__) ;
        for (k = 0 ; k < 4 ; k++)
-               if (INT_ERROR (test [k], orig [k]))
+               if (BIT_20_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -1247,7 +1876,7 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
                exit (1) ;
                } ;
 
-       if (sf_read_short (file, test, 1) > 0)
+       if (sf_read_int (file, test, 1) > 0)
        {       printf ("Line %d: Should return 0.\n", __LINE__) ;
                exit (1) ;
                } ;
@@ -1258,9 +1887,9 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
                } ;
        /*-----------------------*/
 
-       test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ;
+       test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (INT_ERROR (test [k], orig [k]))
+               if (BIT_20_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -1268,9 +1897,9 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
        /* Seek to offset from current position. */
        test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
 
-       test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
+       test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
        for (k = 40 ; k < 44 ; k++)
-               if (INT_ERROR (test [k], orig [k]))
+               if (BIT_20_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
@@ -1278,25 +1907,37 @@ stereo_short_test (const char *filename, int format, int long_file_ok, int allow
        /* Seek to offset from end of file. */
        test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
 
-       test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
+       test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
        for (k = 20 ; k < 24 ; k++)
-               if (INT_ERROR (test [k], orig [k]))
+               if (BIT_20_ERROR (test [k], orig [k]))
                {       printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
                        exit (1) ;
                        } ;
 
        sf_close (file) ;
-} /* stereo_short_test */
+} /* stereo_20bit_test */
 
 static void
-mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
+mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
 {      SNDFILE         *file ;
        SF_INFO         sfinfo ;
-       short           *orig, *test ;
+       int             *orig, *test ;
        int                     k, pass ;
 
-       orig = orig_data.s ;
-       test = test_data.s ;
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
+       orig = orig_data.i ;
+       test = test_data.i ;
 
        sfinfo.samplerate       = SAMPLE_RATE ;
        sfinfo.frames           = DATA_LENGTH ;
@@ -1344,18 +1985,18 @@ mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int al
        {       orig [20] = pass * 2 ;
 
                /* Write some data. */
-               test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
+               test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
 
                test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
 
                /* Read what we just wrote. */
-               test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
+               test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
 
                /* Check the data. */
                for (k = 0 ; k < DATA_LENGTH ; k++)
-                       if (INT_ERROR (orig [k], test [k]))
+                       if (BIT_20_ERROR (orig [k], test [k]))
                        {       printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
-                               oct_save_short (orig, test, DATA_LENGTH) ;
+                               oct_save_int (orig, test, DATA_LENGTH) ;
                                exit (1) ;
                                } ;
 
@@ -1373,12 +2014,12 @@ mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int al
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -1398,30 +2039,30 @@ mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int al
                test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
 
                /* Read what we just wrote. */
-               test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
+               test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
 
                /* Check the data. */
                for (k = 0 ; k < DATA_LENGTH ; k++)
-                       if (INT_ERROR (orig [k], test [k]))
+                       if (BIT_20_ERROR (orig [k], test [k]))
                        {       printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
-                               oct_save_short (orig, test, DATA_LENGTH) ;
+                               oct_save_int (orig, test, DATA_LENGTH) ;
                                exit (1) ;
                                } ;
 
                } ; /* for (pass ...) */
 
        sf_close (file) ;
-} /* mono_rdwr_short_test */
+} /* mono_rdwr_int_test */
 
 static void
-new_rdwr_short_test (const char *filename, int format, int allow_fd)
+new_rdwr_20bit_test (const char *filename, int format, int allow_fd)
 {      SNDFILE *wfile, *rwfile ;
        SF_INFO sfinfo ;
-       short           *orig, *test ;
+       int             *orig, *test ;
        int             items, frames ;
 
-       orig = orig_data.s ;
-       test = test_data.s ;
+       orig = orig_data.i ;
+       test = test_data.i ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -1433,25 +2074,25 @@ new_rdwr_short_test (const char *filename, int format, int allow_fd)
 
        wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
        sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
-       test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ;
+       test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ;
        sf_write_sync (wfile) ;
-       test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ;
+       test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ;
        sf_write_sync (wfile) ;
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
-       test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ;
+       test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ;
 
-       test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ;
-       test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ;
+       test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ;
+       test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ;
 
        sf_close (wfile) ;
        sf_close (rwfile) ;
-} /* new_rdwr_short_test */
+} /* new_rdwr_20bit_test */
 
 
 /*======================================================================================
@@ -1499,7 +2140,12 @@ pcm_test_24bit (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_24bit_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -1514,9 +2160,14 @@ pcm_test_24bit (const char *filename, int format, int long_file_ok)
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_24bit_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -1531,7 +2182,7 @@ mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_f
        SF_INFO         sfinfo ;
        int             *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -1570,12 +2221,12 @@ mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_f
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -1594,6 +2245,23 @@ mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_f
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (TRIBYTE_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -1604,6 +2272,7 @@ mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_f
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -1658,7 +2327,7 @@ mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_f
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -1718,14 +2387,14 @@ stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -1811,6 +2480,18 @@ mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int al
        int             *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.i ;
        test = test_data.i ;
 
@@ -1889,12 +2570,12 @@ mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int al
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -1956,7 +2637,7 @@ new_rdwr_24bit_test (const char *filename, int format, int allow_fd)
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -2015,7 +2696,12 @@ pcm_test_int (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_int_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -2030,9 +2716,14 @@ pcm_test_int (const char *filename, int format, int long_file_ok)
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_int_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -2047,7 +2738,7 @@ mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
        SF_INFO         sfinfo ;
        int             *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -2086,12 +2777,12 @@ mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -2110,6 +2801,23 @@ mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (INT_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -2120,6 +2828,7 @@ mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -2174,7 +2883,7 @@ mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -2234,14 +2943,14 @@ stereo_int_test (const char *filename, int format, int long_file_ok, int allow_f
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -2327,6 +3036,18 @@ mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allo
        int             *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.i ;
        test = test_data.i ;
 
@@ -2405,12 +3126,12 @@ mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allo
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -2472,7 +3193,7 @@ new_rdwr_int_test (const char *filename, int format, int allow_fd)
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -2531,7 +3252,12 @@ pcm_test_float (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_float_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -2546,9 +3272,14 @@ pcm_test_float (const char *filename, int format, int long_file_ok)
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_float_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -2563,7 +3294,7 @@ mono_float_test (const char *filename, int format, int long_file_ok, int allow_f
        SF_INFO         sfinfo ;
        float           *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -2602,12 +3333,12 @@ mono_float_test (const char *filename, int format, int long_file_ok, int allow_f
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -2626,6 +3357,23 @@ mono_float_test (const char *filename, int format, int long_file_ok, int allow_f
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_float_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (FLOAT_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -2636,6 +3384,7 @@ mono_float_test (const char *filename, int format, int long_file_ok, int allow_f
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -2690,7 +3439,7 @@ mono_float_test (const char *filename, int format, int long_file_ok, int allow_f
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -2750,14 +3499,14 @@ stereo_float_test (const char *filename, int format, int long_file_ok, int allow
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -2843,6 +3592,18 @@ mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int al
        float           *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.f ;
        test = test_data.f ;
 
@@ -2921,12 +3682,12 @@ mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int al
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -2988,7 +3749,7 @@ new_rdwr_float_test (const char *filename, int format, int allow_fd)
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -3047,7 +3808,12 @@ pcm_test_double (const char *filename, int format, int long_file_ok)
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_double_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -3062,9 +3828,14 @@ pcm_test_double (const char *filename, int format, int long_file_ok)
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_double_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -3079,7 +3850,7 @@ mono_double_test (const char *filename, int format, int long_file_ok, int allow_
        SF_INFO         sfinfo ;
        double          *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -3118,12 +3889,12 @@ mono_double_test (const char *filename, int format, int long_file_ok, int allow_
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -3142,6 +3913,23 @@ mono_double_test (const char *filename, int format, int long_file_ok, int allow_
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_double_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if (FLOAT_ERROR (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -3152,6 +3940,7 @@ mono_double_test (const char *filename, int format, int long_file_ok, int allow_
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -3206,7 +3995,7 @@ mono_double_test (const char *filename, int format, int long_file_ok, int allow_
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -3266,14 +4055,14 @@ stereo_double_test (const char *filename, int format, int long_file_ok, int allo
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -3359,6 +4148,18 @@ mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int a
        double          *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.d ;
        test = test_data.d ;
 
@@ -3437,12 +4238,12 @@ mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int a
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -3504,7 +4305,7 @@ new_rdwr_double_test (const char *filename, int format, int allow_fd)
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -3554,8 +4355,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read and check the length. */
        file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                        exit (1) ;
                        } ;
 
@@ -3564,8 +4365,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read/write and check the length. */
        file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                exit (1) ;
                } ;
 
@@ -3574,8 +4375,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read and check the length. */
        file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                exit (1) ;
                } ;
 
@@ -3609,28 +4410,6 @@ create_short_file (const char *filename)
        fclose (file) ;
 } /* create_short_file */
 
-#if (defined (WIN32) || defined (__WIN32))
-
-/* Win32 does not have truncate (nor does it have the POSIX function ftruncate).
-** Hack somethng up here to over come this. This function can only truncate to a
-** length of zero.
-*/
-
-static int
-truncate (const char *filename, int ignored)
-{      int fd ;
-
-       ignored = 0 ;
-
-       if ((fd = open (filename, O_RDWR | O_TRUNC | O_BINARY)) < 0)
-               return 0 ;
-
-       close (fd) ;
-
-       return 0 ;
-} /* truncate */
-
-#endif
 
 static void
 multi_seek_test (const char * filename, int format)
@@ -3669,7 +4448,7 @@ write_seek_extend_test (const char * filename, int format)
        short   *orig, *test ;
        unsigned items, k ;
 
-       /* This test doesn't work on the following. */
+       /* This test doesn't work on the following container formats. */
        switch (format & SF_FORMAT_TYPEMASK)
        {       case SF_FORMAT_FLAC :
                case SF_FORMAT_HTK :
@@ -3682,6 +4461,18 @@ write_seek_extend_test (const char * filename, int format)
                        break ;
                } ;
 
+       /* This test doesn't work on the following codec formats. */
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       return ;
+
+               default :
+                       break ;
+               } ;
+
        memset (&info, 0, sizeof (info)) ;
 
        info.samplerate = 48000 ;
index cfc7ce5..3316aec 100644 (file)
@@ -1,6 +1,6 @@
 autogen definitions write_read_test.tpl;
 
-data_type = { 
+data_type = {
        type_name               = char ;
        data_type               = short ;
        data_field              = s ;
@@ -10,7 +10,7 @@ data_type = {
        max_error               = "255" ;
        } ;
 
-data_type = { 
+data_type = {
        type_name               = short ;
        data_type               = short ;
        data_field              = s ;
@@ -20,7 +20,17 @@ data_type = {
        max_error               = "0" ;
        } ;
 
-data_type = { 
+data_type = {
+       type_name               = "20bit" ;
+       data_type               = int ;
+       data_field              = i ;
+       error_func              = BIT_20_ERROR ;
+       format_char             = "0x%X" ;
+       max_val                 = "(1.0 * 0x7F00000)" ;
+       max_error               = "4096" ;
+       } ;
+
+data_type = {
        type_name               = "24bit" ;
        data_type               = int ;
        data_field              = i ;
@@ -30,7 +40,7 @@ data_type = {
        max_error               = "256" ;
        } ;
 
-data_type = { 
+data_type = {
        type_name               = int ;
        data_type               = int ;
        data_field              = i ;
@@ -42,7 +52,7 @@ data_type = {
 
 /* Lite remove start */
 
-data_type = { 
+data_type = {
        type_name               = float ;
        data_type               = float ;
        data_field              = f ;
@@ -52,7 +62,7 @@ data_type = {
        max_error               = "0" ;
        } ;
 
-data_type = { 
+data_type = {
        type_name               = double ;
        data_type               = double ;
        data_field              = d ;
index 4f288f5..fdad34c 100644 (file)
@@ -1,6 +1,6 @@
 [+ AutoGen5 template c +]
 /*
-** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
+#include <inttypes.h>
+
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-#include       <math.h>
-
-#if (defined (WIN32) || defined (_WIN32))
-#include       <fcntl.h>
-static int truncate (const char *filename, int ignored) ;
-#endif
+#include <sndfile.h>
 
-#include       <sndfile.h>
-
-#include       "utils.h"
-#include       "generate.h"
+#include "utils.h"
+#include "generate.h"
 
 #define        SAMPLE_RATE                     11025
-#define        DATA_LENGTH                     (1<<12)
+#define        DATA_LENGTH                     (1 << 12)
 
 #define        SILLY_WRITE_COUNT       (234)
 
 [+ FOR data_type
-+]static void  pcm_test_[+ (get "type_name") +] (const char *str, int format, int long_file_okz) ;
++]static void  pcm_test_[+ (get "type_name") +] (const char *str, int format, int long_file_ok) ;
 [+ ENDFOR data_type
 +]
 static void empty_file_test (const char *filename, int format) ;
@@ -191,6 +187,12 @@ main (int argc, char **argv)
                /* Lite remove start */
                pcm_test_float  ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
                pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
+
+               pcm_test_short  ("alac16.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ;
+               pcm_test_20bit  ("alac20.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ;
+               pcm_test_24bit  ("alac24.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ;
+               pcm_test_int    ("alac32.caf"   , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ;
+
                /* Lite remove end */
                test_count++ ;
                } ;
@@ -359,6 +361,7 @@ main (int argc, char **argv)
        {       pcm_test_char   ("char.sd2"             , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ;
                pcm_test_short  ("short.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ;
                pcm_test_24bit  ("24bit.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ;
+               pcm_test_int    ("32bit.sd2"    , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ;
                test_count++ ;
                } ;
 
@@ -409,12 +412,13 @@ main (int argc, char **argv)
 
 static void    create_short_file (const char *filename) ;
 
-#define        CHAR_ERROR(x,y)         (abs ((x) - (y)) > 255)
-#define        INT_ERROR(x,y)          (((x) - (y)) != 0)
-#define        TRIBYTE_ERROR(x,y)      (abs ((x) - (y)) > 255)
-#define        FLOAT_ERROR(x,y)        (fabs ((x) - (y)) > 1e-5)
+#define        CHAR_ERROR(x, y)                (abs ((x) - (y)) > 255)
+#define        INT_ERROR(x, y)                 (((x) - (y)) != 0)
+#define        BIT_20_ERROR(x, y)              (abs ((x) - (y)) > 4095)
+#define        TRIBYTE_ERROR(x, y)             (abs ((x) - (y)) > 255)
+#define        FLOAT_ERROR(x, y)               (fabs ((x) - (y)) > 1e-5)
 
-#define CONVERT_DATA(k,len,new,orig)                                   \
+#define CONVERT_DATA(k, len, new, orig)                                        \
                        {       for ((k) = 0 ; (k) < (len) ; (k) ++)    \
                                        (new) [k] = (orig) [k] ;                        \
                                }
@@ -466,7 +470,12 @@ pcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_fil
                return ;
                } ;
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+               && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+               )
                mono_rdwr_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ;
 
        /* If the format doesn't support stereo we're done. */
@@ -481,9 +490,14 @@ pcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_fil
 
        /* New read/write test. Not sure if this is needed yet. */
 
-       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC &&
-                       (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC)
+       if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
+                       && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
+                       && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
+                       )
                new_rdwr_[+ (get "type_name") +]_test (filename, format, allow_fd) ;
 
        delete_file (format, filename) ;
@@ -498,7 +512,7 @@ mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_fi
        SF_INFO         sfinfo ;
        [+ (get "data_type") +]         *orig, *test ;
        sf_count_t      count ;
-       int                     k, items ;
+       int                     k, items, total ;
 
        sfinfo.samplerate       = 44100 ;
        sfinfo.frames           = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
@@ -537,12 +551,12 @@ mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_fi
                } ;
 
        if (sfinfo.frames < 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > 2 * items)
-       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ;
+       {       printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
                exit (1) ;
                } ;
 
@@ -561,6 +575,23 @@ mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_fi
                        exit (1) ;
                        } ;
 
+       /* Test multiple short reads. */
+       test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
+
+       total = 0 ;
+       for (k = 1 ; k <= 32 ; k++)
+       {       int ik ;
+
+               test_read_[+ (get "data_type") +]_or_die (file, 0, test + total, k, __LINE__) ;
+               total += k ;
+
+               for (ik = 0 ; ik < total ; ik++)
+                       if ([+ (get "error_func") +] (orig [ik], test [ik]))
+                       {       printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, ik, orig [ik], test [ik]) ;
+                               exit (1) ;
+                               } ;
+               } ;
+
        /* Seek to start of file. */
        test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
 
@@ -571,6 +602,7 @@ mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_fi
                        exit (1) ;
                        } ;
 
+       /* For some codecs we can't go past here. */
        if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
                        (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
        {       sf_close (file) ;
@@ -625,7 +657,7 @@ mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_fi
 
        /* Check that we haven't read beyond EOF. */
        if (count > sfinfo.frames)
-       {       printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ;
+       {       printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
                exit (1) ;
                } ;
 
@@ -685,14 +717,14 @@ stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_
                } ;
 
        if (sfinfo.frames < frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
        if (! long_file_ok && sfinfo.frames > frames)
-       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%ld should be %d)\n",
-                               __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), frames) ;
+       {       printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
+                               __LINE__, sfinfo.frames, frames) ;
                exit (1) ;
                } ;
 
@@ -778,6 +810,18 @@ mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int lo
        [+ (get "data_type") +]         *orig, *test ;
        int                     k, pass ;
 
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       allow_fd = 0 ;
+                       break ;
+
+               default :
+                       break ;
+               } ;
+
        orig = orig_data.[+ (get "data_field") +] ;
        test = test_data.[+ (get "data_field") +] ;
 
@@ -856,12 +900,12 @@ mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int lo
                } ;
 
        if (sfinfo.frames < 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                }
 
        if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
-       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ;
+       {       printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
                exit (1) ;
                } ;
 
@@ -923,7 +967,7 @@ new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int all
 
        rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
        if (sfinfo.frames != 2 * frames)
-       {       printf ("\n\nLine %d : incorrect number of frames in file (%ld should be %d)\n\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * frames) ;
+       {       printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
                exit (1) ;
                } ;
 
@@ -973,8 +1017,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read and check the length. */
        file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                        exit (1) ;
                        } ;
 
@@ -983,8 +1027,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read/write and check the length. */
        file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                exit (1) ;
                } ;
 
@@ -993,8 +1037,8 @@ empty_file_test (const char *filename, int format)
        /* Open for read and check the length. */
        file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
 
-       if (SF_COUNT_TO_LONG (info.frames) != 0)
-       {       printf ("\n\nError : frame count (%ld) should be zero.\n", SF_COUNT_TO_LONG (info.frames)) ;
+       if (info.frames != 0)
+       {       printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
                exit (1) ;
                } ;
 
@@ -1028,28 +1072,6 @@ create_short_file (const char *filename)
        fclose (file) ;
 } /* create_short_file */
 
-#if (defined (WIN32) || defined (__WIN32))
-
-/* Win32 does not have truncate (nor does it have the POSIX function ftruncate).
-** Hack somethng up here to over come this. This function can only truncate to a
-** length of zero.
-*/
-
-static int
-truncate (const char *filename, int ignored)
-{      int fd ;
-
-       ignored = 0 ;
-
-       if ((fd = open (filename, O_RDWR | O_TRUNC | O_BINARY)) < 0)
-               return 0 ;
-
-       close (fd) ;
-
-       return 0 ;
-} /* truncate */
-
-#endif
 
 static void
 multi_seek_test (const char * filename, int format)
@@ -1088,7 +1110,7 @@ write_seek_extend_test (const char * filename, int format)
        short   *orig, *test ;
        unsigned items, k ;
 
-       /* This test doesn't work on the following. */
+       /* This test doesn't work on the following container formats. */
        switch (format & SF_FORMAT_TYPEMASK)
        {       case SF_FORMAT_FLAC :
                case SF_FORMAT_HTK :
@@ -1101,6 +1123,18 @@ write_seek_extend_test (const char * filename, int format)
                        break ;
                } ;
 
+       /* This test doesn't work on the following codec formats. */
+       switch (format & SF_FORMAT_SUBMASK)
+       {       case SF_FORMAT_ALAC_16 :
+               case SF_FORMAT_ALAC_20 :
+               case SF_FORMAT_ALAC_24 :
+               case SF_FORMAT_ALAC_32 :
+                       return ;
+
+               default :
+                       break ;
+               } ;
+
        memset (&info, 0, sizeof (info)) ;
 
        info.samplerate = 48000 ;