ref: 5cea228a755a35b79ebc20b211dc4ee236c19fd9
parent: 8c8ff056773d89ab17aa252d449d8ca6d8d6d66d
author: menno <menno>
date: Wed Feb 13 07:42:02 EST 2002
Use latest version of libsndfile
--- a/common/libsndfile/AUTHORS
+++ b/common/libsndfile/AUTHORS
@@ -1,12 +1,16 @@
-The main author of libsndfile is Erik de Castro Lopo <erikd@zip.com.au>.
+The main author of libsndfile is Erik de Castro Lopo <erikd AT zip DOT com DOT au>.
The code in the src/GSM610 directory was 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:
+<jutta AT cs DOT tu-berlin DOT de> and Carsten Bormann
+<cabo AT cs DOT tu-berlin DOT 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
-
+
+Code in the src/G72x directory was 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.
--- a/common/libsndfile/ChangeLog
+++ b/common/libsndfile/ChangeLog
@@ -1,96 +1,622 @@
-2000-10-16 Erik de Castro Lopo <erikd@zip.com.au>
+2001-11-11 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
- * src/sndfile.c src/au.c
- Fixed bug which prevented writing of G723 24kbps AU files.
+ * 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-11 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * src/*.[ch]
+ 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).
+
+2001-11-10 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * 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-08 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * src/au.c src/sndfile.au
+ Added support for 32 bit float data in big and little endian AU files.
- * tests/lossy_comp_test.c
- Corrrection to options for G723 tests.
+ * tests/write_read_test.c
+ Added tests for 32 bit float data in AU files.
- * configure.in
+2001-11-06 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * tests/lossy_comp_test.c
+ Finalised testing of stereo files where possible.
+
+2001-11-05 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * src/wav_ms_adpcm.c
+ Modified function srate2blocksize () to handle 44k1Hz stereo files.
+
+2001-10-24 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * tests/lossy_comp_test.c
+ Modified this test program so that for stereo capable files, test stereo mode
+ instead of mono.
+
+2001-10-06 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * src/common.h
+ Win32 has _snprintf and _vsnprintf but not snprintf and vsnprintf. Added a
+ conditional #define to fix this.
+
+2001-10-04 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * src/sndfile.c
+ Implemented sf_command ("norm float").
+
+ * src/*.c
+ Implemented handling of sf_command ("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 zip DOT com DOT au>
+
+ * 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/floatcast.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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * src/*.c src/sfendian.h
+ Moved definition of MAKE_MARKER macro to sfendian.h
+
+2001-07-23 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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-13 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * src/aiff.c
+ Added support for little endian encoded AIFC files. 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * 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 zip DOT com DOT au>
+
+ * src/aiff.c
+ Added handing of COMT chunk.
+
+2000-11-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * examples/sfconvert.c
+ Fixed bug in normalisatio code. Pointed out by Johnny Wu.
+
+2000-11-08 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * Win32/config.h
+ Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue.
+
+2000-10-27 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * tests/Makefile.am
+ Added -lm for write_read_test_LDADD.
+
+2000-10-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * 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.
+ doesn't allow gcc -pipe option.
-2000-09-03 Erik de Castro Lopo <erikd@zip.com.au>
+2000-09-03 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
- * 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.
+ * 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@zip.com.au>
+2000-08-31 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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.
+ New file to test scaled and unscaled sf_read_double() and sf_write_double()
+ functions.
-2000-08-28 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-28 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* COPYING
Changed to the LGPL COPYING file (spotted by H. S. Teoh).
-2000-08-21 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-21 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-08-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/newpcm.h
New file to contain a complete rewrite of the PCM data handling.
-2000-08-15 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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-15 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.c
Fixed a leak of FILE* pointers in sf_open_read(). Thanks to Sigbj�rn Skj�ret
for spotting this one.
-2000-08-13 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-13 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-08-06 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au or copyright under a GPL/LGPL compatible
+ either copyright erikd AT zip DOT com DOT au or copyright under a GPL/LGPL compatible
license.
-2000-08-06 Erik de Castro Lopo <erikd@zip.com.au>
+2000-08-06 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-08-05 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-07-12 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/G72x/*
New files for reading/writing G721 and G723 ADPCM audio. These files
@@ -98,42 +624,42 @@
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@zip.com.au>
+2000-07-08 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+2000-06-28 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-06-04 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* src/paf.c
Add checking for files shorter than minimal PAF file header length.
-2000-06-02 Erik de Castro Lopo <erikd@zip.com.au>
+2000-06-02 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/write_read_test.c
Added extra sf_perror() calls when sf_write_XXXX fails.
-2000-05-29 Erik de Castro Lopo <erikd@zip.com.au>
+2000-05-29 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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.
@@ -140,51 +666,51 @@
* tests/read_seek_test.c
Added extra debugging for when tests fail.
-2000-05-18 Erik de Castro Lopo <erikd@zip.com.au>
+2000-05-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-04-25 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+2000-04-06 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.h.in
Fixed comments about sf_perror () and sf_error_str ().
-2000-03-14 Erik de Castro Lopo <erikd@zip.com.au>
+2000-03-14 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* configure.in
Fixed --enable-justsrc option.
-2000-03-07 Erik de Castro Lopo <erikd@zip.com.au>
+2000-03-07 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* wav.c
Fixed checking of bytespersec field of header. Still some weirdness
with some files.
-2000-03-05 Erik de Castro Lopo <erikd@zip.com.au>
+2000-03-05 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-02-29 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+2000-02-28 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* configure.in Makefile.am src/Makefile.am
Finally got around to figuring out how to build a single library from
@@ -191,44 +717,44 @@
multiple source directories.
Reading GSM 6.10 files now seems to work.
-2000-01-03 Erik de Castro Lopo <erikd@zip.com.au>
+2000-01-03 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c
Added more error reporting in read_fmt_chunk().
-1999-12-21 Erik de Castro Lopo <erikd@zip.com.au>
+1999-12-21 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* examples/sfinfo.c
Modified program to accept multiple filenames from the command line.
-1999-11-27 Erik de Castro Lopo <erikd@zip.com.au>
+1999-11-27 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-11-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-11-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-10-01 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-09-28 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/aiff.c
Fixed a bug with incorrect SSND chunk length being written. This also lead
@@ -235,7 +761,7 @@
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@zip.com.au>
+1999-09-24 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/paf.c
Fixed a bug with reading and writing 24 bit stereo PAF files. This problem
@@ -242,23 +768,23 @@
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@zip.com.au>
+1999-09-23 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-09-22 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* src/svx.c
Finished off implementation of write using __psf_hprintf().
-1999-09-21 Erik de Castro Lopo <erikd@zip.com.au>
+1999-09-21 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/common.h
Added a buffer to SF_PRIVATE for writing the header. This is required
@@ -269,14 +795,14 @@
* 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@zip.com.au>
+1999-09-05 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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 ().
@@ -285,11 +811,11 @@
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@zip.com.au>
+1999-08-04 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/svx.c
New file for reading/writing 8SVX and 16SVX files.
@@ -296,28 +822,28 @@
* 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@zip.com.au>
+1999-08-01 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+1999-07-31 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.h MacOS/config.h
Fixed minor MacOS configuration issues.
-1999-07-30 Erik de Castro Lopo <erikd@zip.com.au>
+1999-07-30 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* MacOS/
Added a new directory for the MacOS config.h file and the
@@ -327,12 +853,12 @@
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@zip.com.au>
+1999-07-29 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.c src/sndfile.h src/raw.c
Further fixing of #includes for MacOS.
-1999-07-25 Erik de Castro Lopo <erikd@zip.com.au>
+1999-07-25 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c src/aiff.c
Added call to ferror () in main header parsing loop of __XXX_open_read
@@ -339,10 +865,10 @@
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.
@@ -353,74 +879,74 @@
* 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@zip.com.au>
+1999-07-24 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+1999-07-22 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* examples/sfinfo.c
Removed options so the sfinfo program always prints out all the information.
-
-1999-07-19 Erik de Castro Lopo <erikd@zip.com.au>
+1999-07-19 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+1999-07-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+1999-07-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/ulaw_test.c
New test program to test the u-law encode/decode lookup tables.
-1999-07-16 Erik de Castro Lopo <erikd@zip.com.au>
+1999-07-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-07-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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.
@@ -429,26 +955,26 @@
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@zip.com.au>
+1999-07-14 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/adpcm_test.c
Initialised amp variable in gen_signal() to remove compiler warning.
-
-1999-07-12 Erik de Castro Lopo <erikd@zip.com.au>
+1999-07-12 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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@zip.com.au>
+1999-07-01 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav_ms_adpcm.c
Implemented MS ADPCM encoding. Code cleanup of decoder.
-
+
* tests/adpcm_test.c
Added tests for MS ADPCM WAV files.
@@ -455,13 +981,13 @@
* src/wav_ima_adpcm.c
Fixed incorrect parameter in call to srate2blocksize () from
__ima_writer_init ().
-
-1999-06-23 Erik de Castro Lopo <erikd@zip.com.au>
+1999-06-23 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* tests/read_seek_test.c
Added test for 8 bit AIFF files.
-1999-06-18 Erik de Castro Lopo <erikd@zip.com.au>
+1999-06-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/write_read_test.c
Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c
@@ -468,11 +994,11 @@
* 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@zip.com.au>
+1999-06-17 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c
Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM
@@ -482,27 +1008,27 @@
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@zip.com.au>
+1999-06-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-06-14 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-06-12 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* Win32/*
Added a contribution from Albert Faber to allow libsndfile to compile
@@ -509,40 +1035,40 @@
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@zip.com.au>
+1999-06-11 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-03-27 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-03-23 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c src/aiff.c
Added handling for unknown chunk markers in the file.
-1999-03-22 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-22 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.c
Filled in missing error strings in SndfileErrors array. Missing entries
@@ -549,7 +1075,7 @@
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@zip.com.au>
+1999-03-21 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav_ima_adpcm.c
Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading
@@ -556,16 +1082,16 @@
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@zip.com.au>
+1999-03-18 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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.
@@ -572,7 +1098,7 @@
This uncovered __ima_seek () bug due to pima->blockcount being set
before calling __ima_init_block ().
-1999-03-17 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-17 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c
Started implementing MS ADPCM decoder.
@@ -580,7 +1106,7 @@
encoder seems to add an extra byte. Why not just give an even data
length?
-1999-03-16 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/wav.c
Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c.
@@ -587,7 +1113,7 @@
This will make it easier to add and debug other kinds of WAV files
in future.
-1999-03-14 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-14 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/
Added adpcm_test.c which implements test functions for
@@ -595,18 +1121,18 @@
* src/wav.c
Fixed many bugs in IMA ADPCM encoder and decoder.
-
-1999-03-11 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-11 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* src/wav.c
Finished implementing IMA ADPCM encoder and decoder (what a bitch!).
-
-1999-03-03 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-03 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* src/wav.c
Started implementing IMA ADPCM decoder.
-1999-03-02 Erik de Castro Lopo <erikd@zip.com.au>
+1999-03-02 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/sndfile.c
Fixed bug where the sf_read_XXX functions were returning a
@@ -619,7 +1145,7 @@
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@zip.com.au>
+1999-02-21 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* tests/write_read_test.c
Added tests for little DEC endian AU files.
@@ -626,12 +1152,12 @@
* src/au.c
Add handling for DEC format little endian AU files.
-
-1999-02-20 Erik de Castro Lopo <erikd@zip.com.au>
+1999-02-20 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* 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).
@@ -640,12 +1166,12 @@
* 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@zip.com.au>
+1999-02-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* src/pcm.c:
Fixed bug in let2s_array (cptr was not being initialised).
@@ -653,22 +1179,22 @@
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@zip.com.au>
+1999-02-15 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-02-14 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* 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@zip.com.au>
+1999-02-13 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* src/aiff.c:
Changed reading of 'COMM' chunk to avoid reading an int
--- a/common/libsndfile/MacOS/MacOS-readme.txt
+++ b/common/libsndfile/MacOS/MacOS-readme.txt
@@ -1,5 +1,5 @@
-BUILDING LIBSNDFILE FOR MACINTOSH
----------------------------------
+BUILDING LIBSNDFILE FOR MACINTOSH (Pre Mac OSX)
+-----------------------------------------------
These instructions are current as of libsndfile 0.0.16, and assume the
following development environment:
@@ -15,8 +15,8 @@
1. using CodeWarrior, create a new "Empty Project"
2. obtain the libsndfile source distribution (see homepage URL below);
- add all ".c" files found in the top level of the "src" folder to the
- project
+ add all ".c" files found in the top level of the "src", "src/GSM610" and
+ "src/G72x" folders to the project
3. starting from the factory defaults, adjust the following project
settings:
@@ -27,7 +27,7 @@
file name = "libsndfile"
4. grab the "config.h" file from the MacOS directory and replace the default
- config.h file
+ config.h file in the "src" directory
5. Make the project
--- a/common/libsndfile/MacOS/Makefile.in
+++ b/common/libsndfile/MacOS/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -66,11 +66,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -87,7 +85,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -110,7 +108,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
--- a/common/libsndfile/MacOS/config.h
+++ b/common/libsndfile/MacOS/config.h
@@ -15,7 +15,7 @@
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
-
+
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
@@ -23,29 +23,16 @@
#ifdef __MWERKS__
#ifdef _WIN32
#define GUESS_BIG_ENDIAN 0
-#else
-#define GUESS_BIG_ENDIAN 1
-#endif
-#endif
-
-/* Set to 1 if the processor is little endian, otherwise set to 0. */
-#ifdef __MWERKS__
-#ifdef _WIN32
#define GUESS_LITTLE_ENDIAN 1
#else
+#define GUESS_BIG_ENDIAN 1
#define GUESS_LITTLE_ENDIAN 0
#endif
#endif
-/* Set to 1 if the processor can read and write Intel x86 32 bit floats. */
+/* Set to 1 to force the use of code for processors with broken floats */
/* Otherwise set it to 0. */
-#ifdef __MWERKS__
-#ifdef _WIN32
-#define CAN_READ_WRITE_x86_IEEE 1
-#else
-#define CAN_READ_WRITE_x86_IEEE 0
-#endif
-#endif
+#define FORCE_BROKEN_FLOAT 0
/* The number of bytes in a double. */
#define SIZEOF_DOUBLE 8
@@ -89,6 +76,12 @@
/* Define if you have the malloc function. */
#define HAVE_MALLOC 1
+/* Define if you have the snprintf function. */
+#define HAVE_SNPRINTF 1
+
+/* Define if you have the vsnprintf function. */
+#define HAVE_VSNPRINTF 1
+
/* Define if you have the <endian.h> header file. */
#define HAVE_ENDIAN_H 1
@@ -96,5 +89,5 @@
#define PACKAGE "libsndfile"
/* Version number of package */
-#define VERSION "0.0.21"
+#define VERSION "0.0.26"
--- a/common/libsndfile/Makefile.am
+++ b/common/libsndfile/Makefile.am
@@ -1,3 +1,5 @@
-DIST_SUBDIRS = src examples doc tests Win32 MacOS m4
+DIST_SUBDIRS = src examples doc tests Win32 MacOS
SUBDIRS = @subdirs@
-EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec
+EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec \
+ check_libsndfile.py
+
--- a/common/libsndfile/Makefile.in
+++ b/common/libsndfile/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -66,11 +66,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -78,9 +76,10 @@
VERSION = @VERSION@
subdirs = @subdirs@
-DIST_SUBDIRS = src examples doc tests Win32 MacOS m4
+DIST_SUBDIRS = src examples doc tests Win32 MacOS
SUBDIRS = @subdirs@
-EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec
+EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec check_libsndfile.py
+
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ./src/config.h
@@ -93,7 +92,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -107,7 +106,7 @@
$(ACLOCAL_M4): configure.in
cd $(srcdir) && $(ACLOCAL)
-config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
@@ -272,7 +271,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
--- a/common/libsndfile/NEWS
+++ b/common/libsndfile/NEWS
@@ -1,3 +1,39 @@
+Version 0.0.26 (2001-09-30)
+ * Offical release.
+ * Changed how A-law and u-law WAV file headers are written to allow files generated
+ by libsndfile to be read by M$ windoze.
+ * Added IRCAM file support.
+ * Minor bug fixes.
+ * This will be the last release in the 0.0.X development stream apart from bug fixes.
+ A new deveopement stream with minor interface changes in already in development.
+
+Version 0.0.25 (2001-09-24)
+ * Offical release.
+ * Added sf_command () interface which allows switching normalisation on and off for
+ sf_read/write_float () methods.
+ * Minor bug fixes.
+ * This will be the last release in the 0.0.X development stream apart from bug fixes.
+ A new deveopement stream with minor interface changes in already in development.
+
+Version 0.0.24 (2001-08-19)
+ * Offical release.
+ * Massive refactoring of header reading code for all file formats.
+ * Added sf_read_float () and sf_write_float () interfaces.
+ * Minor bug fixes.
+
+Version 0.0.23 (2001-07-06)
+ * Offical release.
+ * Massive refactoring of header writing code for all file formats.
+ * Added support for Sphere NIST.
+ * Added support for 32 bit float AIFF and little endian AIFF files (Mac OSX).
+ * Added read and write support for the PEAK chunk in 32 bit float AIFF and WAV files.
+ * Added support for REX files (Propellorheads Reason).
+ * Minor bug fixes.
+
+Version 0.0.22 (2000-10-17)
+ * Offical release.
+ * Bug fix in G723 AU file handling.
+
Version 0.0.21 (2000-08-16)
* Offical release.
* AU files without the normal AU file header are now recognised as headerless
@@ -5,6 +41,7 @@
* Added handling for G721 4bit APDCM encoded AU files.
* Added handling for G723 3bit APDCM encoded AU files.
* Improved Win32 compiling and use instructions from Mike Ricos.
+ * License change from GPL to LGPL.
Version 0.0.20 (2000-05-30)
* Offical release.
--- a/common/libsndfile/README
+++ b/common/libsndfile/README
@@ -1,4 +1,4 @@
-This is libsndfile, 0.0.16
+This is libsndfile, 0.0.26
libsndfile is a library of C routines for reading and writing
files containing sampled audio data.
@@ -29,6 +29,8 @@
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 Sum Microsystems
+under a suitably free license.
OTHER PLATFORMS
---------------
@@ -44,15 +46,16 @@
create an approriate config.h file in the src/ directory with correct
values for the following #defines (this would work for AmigaOS) :
-#define __BIG_ENDIAN__ 1
-#define __LITTLE_ENDIAN__ 0
-#define CAN_READ_WRITE_x86_IEEE 0
+#define HAVE_ENDIAN_H 0
+#define GUESS_BIG_ENDIAN 1
+#define GUESS_LITTLE_ENDIAN 0
+#define FORCE_BROKEN_FLOAT 0
CONTACTS
--------
-libsndfile was written by Erik de Castro Lopo (erikd@zip.com.au).
+libsndfile was written by Erik de Castro Lopo (erikd AT zip DOT com DOT au).
The libsndfile home page is at :
http://www.zip.com.au/~erikd/libsndfile/
--- a/common/libsndfile/TODO
+++ b/common/libsndfile/TODO
@@ -1,12 +1,10 @@
-Here's a list of what I (erikd@zip.com.au) think needs to be done. The
-list is by no means comprehensive and people are encouraged to email
-me with suggestions.
+Here's a list of what I (erikd AT zip DOT com DOT au) think needs to be
+done. The list is by no means exhaustive and people are encouraged to
+email me with suggestions.
o Add pipe in/out capabilities. libsndfile should be able to read
its input from a pipe and write its output to a pipe.
- o Add autoconf type tests for IEEE read/write compatibility.
-
o Add checks of the error state after fseek???? Use ferror ().
o Modify tests/lossy_comp_test.c to add tests for stereo files.
@@ -15,9 +13,9 @@
o Improve testing routines. Must test all combinations of inputs
and outputs.
-
+
o Test sf_seek function on write???
-
+
o Get hold of a couple of Sun/Next AU files containing 32 and 64 bit
floating point data write code to read and write them (well at least
the 32 bit ones).
@@ -28,16 +26,16 @@
o Add support for accessing sound formats with multiple audio
data sections (ie samples within tracker files, Soundfont II and
multi-sample sampler formats).
-
+
o Add an interface to allow reading and writing of sample loop points
and other info within AIFF and other file formats. This must be a
general solution.
o Improve documentation. Is HTML documentation good enough?
-
+
o Look into the possibility of optional sample rate convert on file
read.
-
+
As I am the person who knows libsndfile best, I can probably implement
any new features faster than anybody else (and you can spend your time
writing applications with libsndfile). All I need is some
@@ -45,4 +43,4 @@
me documentation and sample files. I would much rather pull them off
the web than have them clogging up my email inbox.
-
+
--- a/common/libsndfile/Win32/Makefile.in
+++ b/common/libsndfile/Win32/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -66,11 +66,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -88,7 +86,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -111,7 +109,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
--- a/common/libsndfile/Win32/config.h
+++ b/common/libsndfile/Win32/config.h
@@ -15,7 +15,7 @@
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
-
+
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
@@ -25,9 +25,9 @@
/* Set to 1 if the processor is little endian, otherwise set to 0. */
#define GUESS_LITTLE_ENDIAN 1
-/* Set to 1 if the processor can read and write Intel x86 32 bit floats. */
+/* Set to 1 to force the use of code for processors with broken floats */
/* Otherwise set it to 0. */
-#define CAN_READ_WRITE_x86_IEEE 1
+#define FORCE_BROKEN_FLOAT 0
/* The number of bytes in a double. */
#define SIZEOF_DOUBLE 8
@@ -71,6 +71,12 @@
/* Define if you have the malloc function. */
#define HAVE_MALLOC 1
+/* Define if you have the snprintf function. */
+#define HAVE_SNPRINTF 0
+
+/* Define if you have the vsnprintf function. */
+#define HAVE_VSNPRINTF 0
+
/* Define if you have the <endian.h> header file. */
#define HAVE_ENDIAN_H 0
@@ -78,5 +84,5 @@
#define PACKAGE "libsndfile"
/* Version number of package */
-#define VERSION "0.0.21"
+#define VERSION "0.0.26"
--- a/common/libsndfile/Win32/libsndfile.dsp
+++ b/common/libsndfile/Win32/libsndfile.dsp
@@ -25,7 +25,7 @@
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
-CPP=cl.exe
+CPP=xicl6.exe
RSC=rc.exe
!IF "$(CFG)" == "libsndfile - Win32 Release"
@@ -40,14 +40,14 @@
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\win32" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x413 /d "NDEBUG"
# ADD RSC /l 0x413 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
-LIB32=link.exe -lib
+LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
@@ -63,14 +63,14 @@
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\win32" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x413 /d "_DEBUG"
# ADD RSC /l 0x413 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
-LIB32=link.exe -lib
+LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
@@ -85,90 +85,30 @@
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
-SOURCE=..\src\GSM610\add.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\aiff.c
# End Source File
# Begin Source File
-SOURCE=..\src\alaw.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\au.c
# End Source File
# Begin Source File
-SOURCE=..\src\au_g72x.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\code.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\common.c
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\decode.c
+SOURCE=..\src\float32.c
# End Source File
# Begin Source File
-SOURCE=..\src\G72x\g721.c
+SOURCE=..\src\ircam.c
# End Source File
# Begin Source File
-SOURCE=..\src\G72x\g723_16.c
+SOURCE=..\src\nist.c
# End Source File
# Begin Source File
-SOURCE=..\src\G72x\g723_24.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\G72x\g723_40.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\G72x\g72x.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\gsm_create.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\gsm_decode.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\gsm_destroy.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\gsm_encode.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\gsm_option.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\long_term.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\GSM610\lpc.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\newpcm.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\paf.c
# End Source File
# Begin Source File
@@ -177,22 +117,14 @@
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\preprocess.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\raw.c
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\rpe.c
+SOURCE=..\src\samplitude.c
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\short_term.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\sndfile.c
# End Source File
# Begin Source File
@@ -201,32 +133,12 @@
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\table.c
+SOURCE=..\src\voc.c
# End Source File
# Begin Source File
-SOURCE=..\src\ulaw.c
-# End Source File
-# Begin Source File
-
SOURCE=..\src\wav.c
# End Source File
-# Begin Source File
-
-SOURCE=..\src\wav_float.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\wav_gsm610.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\wav_ima_adpcm.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\wav_ms_adpcm.c
-# End Source File
# End Group
# Begin Group "Header Files"
@@ -233,10 +145,6 @@
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
-SOURCE=..\src\alaw.h
-# End Source File
-# Begin Source File
-
SOURCE=..\src\au.h
# End Source File
# Begin Source File
@@ -253,15 +161,15 @@
# End Source File
# Begin Source File
-SOURCE=..\src\G72x\g72x.h
+SOURCE=..\src\floatcast.h
# End Source File
# Begin Source File
-SOURCE=..\src\GSM610\gsm.h
+SOURCE=..\src\G72x\g72x.h
# End Source File
# Begin Source File
-SOURCE=..\src\pcm.h
+SOURCE=..\src\GSM610\gsm.h
# End Source File
# Begin Source File
@@ -282,10 +190,6 @@
# Begin Source File
SOURCE=..\src\sndfile.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\ulaw.h
# End Source File
# Begin Source File
--- a/common/libsndfile/Win32/libsndfile.dsw
+++ b/common/libsndfile/Win32/libsndfile.dsw
@@ -3,7 +3,7 @@
###############################################################################
-Project: "libsndfile"=".\libsndfile.dsp" - Package Owner=<4>
+Project: "libsndfile"=.\libsndfile.dsp - Package Owner=<4>
Package=<5>
{{{
--- a/common/libsndfile/acconfig.h
+++ b/common/libsndfile/acconfig.h
@@ -282,7 +282,7 @@
/* Set to 1 if the processor is little endian, otherwise set to 0. */
#undef GUESS_LITTLE_ENDIAN
-/* Set to 1 if the processor can read and write Intel x86 32 bit floats. */
+/* Set to 1 to force the use of code for processors with broken floats */
/* Otherwise set it to 0. */
-#undef CAN_READ_WRITE_x86_IEEE
+#undef FORCE_BROKEN_FLOAT
--- a/common/libsndfile/aclocal.m4
+++ b/common/libsndfile/aclocal.m4
@@ -1,4 +1,4 @@
-dnl aclocal.m4 generated automatically by aclocal 1.4
+dnl aclocal.m4 generated automatically by aclocal 1.4-p4
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
@@ -139,7 +139,7 @@
LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
-$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
|| AC_MSG_ERROR([libtool configure failed])
# Reload cache, that may have been modified by ltconfig
@@ -171,6 +171,11 @@
AC_REQUIRE([AC_PROG_LN_S])dnl
dnl
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
+
# Check for any special flags to pass to ltconfig.
libtool_flags="--cache-file=$cache_file"
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
@@ -189,7 +194,7 @@
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
-case "$host" in
+case "$lt_target" in
*-*-irix6*)
# Find out which ABI we are using.
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
@@ -405,7 +410,6 @@
AC_MSG_RESULT(no)
fi
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_SUBST(LD)
AC_PROG_LD_GNU
])
@@ -451,7 +455,6 @@
fi])
NM="$ac_cv_path_NM"
AC_MSG_RESULT([$NM])
-AC_SUBST(NM)
])
# AC_CHECK_LIBM - check for math library
@@ -458,7 +461,7 @@
AC_DEFUN(AC_CHECK_LIBM,
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM=
-case "$host" in
+case "$lt_target" in
*-*-beos* | *-*-cygwin*)
# These system don't have libm
;;
@@ -473,13 +476,15 @@
])
# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl convenience library, adds --enable-ltdl-convenience to
-# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
-# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
-# to be `${top_builddir}/libltdl'. Make sure you start DIR with
-# '${top_builddir}/' (note the single quotes!) if your package is not
-# flat, and, if you're not using automake, define top_builddir as
-# appropriate in the Makefiles.
+# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-convenience to the
+# configure arguments. Note that LIBLTDL and INCLTDL are not
+# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not
+# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed
+# with '${top_builddir}/' and INCLTDL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
case "$enable_ltdl_convenience" in
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
@@ -486,18 +491,20 @@
"") enable_ltdl_convenience=yes
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
esac
- LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
- INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
])
# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl installable library, and adds --enable-ltdl-install to
-# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
-# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
-# to be `${top_builddir}/libltdl'. Make sure you start DIR with
-# '${top_builddir}/' (note the single quotes!) if your package is not
-# flat, and, if you're not using automake, define top_builddir as
-# appropriate in the Makefiles.
+# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-install to the configure
+# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed
+# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will
+# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# with '${top_srcdir}/' (note the single quotes!). If your package is
+# not flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_CHECK_LIB(ltdl, main,
@@ -510,8 +517,8 @@
])
if test x"$enable_ltdl_install" = x"yes"; then
ac_configure_args="$ac_configure_args --enable-ltdl-install"
- LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
- INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
else
ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
LIBLTDL="-lltdl"
--- /dev/null
+++ b/common/libsndfile/check_libsndfile.py
@@ -1,0 +1,67 @@
+#!/usr/bin/env python
+
+import commands, os, string, sys
+
+# This program tests libsndfile against a user provided list of audio files.
+# The list is provided as a text file.
+#
+
+_EXE_NAME = 'examples/sndfile_info'
+
+
+def dump_status_output_exit (status, output, msg = None):
+ if msg:
+ print msg
+ print "Status :", status
+ print output
+ sys.exit (0)
+
+def sfinfo_check_ok (filename):
+ cmd = '%s %s' % (_EXE_NAME, filename)
+ (status, output) = commands.getstatusoutput (cmd)
+ if status:
+ dump_status_output_exit (status, output, "Bad status. Dumping")
+ if string.find (output, "should") > 0:
+ dump_status_output_exit (status, output, "Found `should'. Dumping")
+ if string.find (output, "*") > 0:
+ dump_status_output_exit (status, output, "Found `*'. Dumping")
+ return
+
+def sfinfo_check_not_crash (filename):
+ print filename
+
+_USAGE = """
+This is the usage message.
+
+"""
+
+if len (sys.argv) != 2:
+ print _USAGE
+ sys.exit (0)
+
+
+if not os.path.isfile (_EXE_NAME):
+ print "Could not find required program :", _EXE_NAME
+ sys.exit (0)
+
+list_file = open (sys.argv [1])
+
+while 1:
+ line = list_file.readline ()
+ if not line:
+ break
+ line = string.strip (line)
+ if len (line) < 1:
+ continue
+ if line [0] == '#':
+ continue
+ print line
+ if os.path.isfile (line):
+ sfinfo_check_ok (line)
+ else:
+ print "Bad file name : ", line
+ sys.exit (0)
+
+list_file.close ()
+
+print "Finished. No errors found."
--- a/common/libsndfile/config.guess
+++ b/common/libsndfile/config.guess
@@ -1,6 +1,6 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify it
@@ -23,8 +23,7 @@
# the same distribution terms that you use for the rest of that program.
# Written by Per Bothner <bothner@cygnus.com>.
-# The master version of this file is at the FSF in /home/gd/gnu/lib.
-# Please send patches to the Autoconf mailing list <autoconf@gnu.org>.
+# Please send patches to <config-patches@gnu.org>.
#
# This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and
@@ -68,6 +67,43 @@
# 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*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ # Determine the machine/vendor (is the vendor relevant).
+ case "${UNAME_MACHINE}" in
+ amiga) machine=m68k-cbm ;;
+ arm32) machine=arm-unknown ;;
+ atari*) machine=m68k-atari ;;
+ sun3*) machine=m68k-sun ;;
+ mac68k) machine=m68k-apple ;;
+ macppc) machine=powerpc-apple ;;
+ hp3[0-9][05]) machine=m68k-hp ;;
+ ibmrt|romp-ibm) machine=romp-ibm ;;
+ *) machine=${UNAME_MACHINE}-unknown ;;
+ esac
+ # The Operating System including object format.
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ # The OS release
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit 0 ;;
alpha:OSF1:*:*)
if test $UNAME_RELEASE = "V4.0"; then
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -77,41 +113,51 @@
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
cat <<EOF >$dummy.s
+ .data
+\$Lformat:
+ .byte 37,100,45,37,120,10,0 # "%d-%x\n"
+
+ .text
.globl main
+ .align 4
.ent main
main:
- .frame \$30,0,\$26,0
- .prologue 0
- .long 0x47e03d80 # implver $0
- lda \$2,259
- .long 0x47e20c21 # amask $2,$1
- srl \$1,8,\$2
- sll \$2,2,\$2
- sll \$0,3,\$0
- addl \$1,\$0,\$0
- addl \$2,\$0,\$0
- ret \$31,(\$26),1
+ .frame \$30,16,\$26,0
+ ldgp \$29,0(\$27)
+ .prologue 1
+ .long 0x47e03d80 # implver \$0
+ lda \$2,-1
+ .long 0x47e20c21 # amask \$2,\$1
+ lda \$16,\$Lformat
+ mov \$0,\$17
+ not \$1,\$18
+ jsr \$26,printf
+ ldgp \$29,0(\$26)
+ mov 0,\$16
+ jsr \$26,exit
.end main
EOF
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then
- ./$dummy
- case "$?" in
- 7)
+ case `./$dummy` in
+ 0-0)
UNAME_MACHINE="alpha"
;;
- 15)
+ 1-0)
UNAME_MACHINE="alphaev5"
;;
- 14)
+ 1-1)
UNAME_MACHINE="alphaev56"
;;
- 10)
+ 1-101)
UNAME_MACHINE="alphapca56"
;;
- 16)
+ 2-303)
UNAME_MACHINE="alphaev6"
;;
+ 2-307)
+ UNAME_MACHINE="alphaev67"
+ ;;
esac
fi
rm -f $dummy.s $dummy
@@ -129,9 +175,6 @@
Amiga*:UNIX_System_V:4.0:*)
echo m68k-cbm-sysv4
exit 0;;
- amiga:NetBSD:*:*)
- echo m68k-cbm-netbsd${UNAME_RELEASE}
- exit 0 ;;
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
@@ -156,12 +199,12 @@
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;;
- arm32:NetBSD:*:*)
- echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- exit 0 ;;
SR2?01:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp
exit 0;;
@@ -218,15 +261,12 @@
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
exit 0 ;;
- atari*:NetBSD:*:*)
- echo m68k-atari-netbsd${UNAME_RELEASE}
- exit 0 ;;
atari*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
+ # "atarist" or "atariste" at least should have a processor
# > m68000). The system name ranges from "MiNT" over "FreeMiNT"
# to the lowercase version "mint" (or "freemint"). Finally
# the system name "TOS" denotes a system which is actually not
@@ -250,15 +290,9 @@
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;;
- sun3*:NetBSD:*:*)
- echo m68k-sun-netbsd${UNAME_RELEASE}
- exit 0 ;;
sun3*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
- mac68k:NetBSD:*:*)
- echo m68k-apple-netbsd${UNAME_RELEASE}
- exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
@@ -271,9 +305,6 @@
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;;
- macppc:NetBSD:*:*)
- echo powerpc-apple-netbsd${UNAME_RELEASE}
- exit 0 ;;
RISC*:Mach:*:*)
echo mips-dec-mach_bsd4.3
exit 0 ;;
@@ -289,6 +320,7 @@
mips:*:*:UMIPS | mips:*:*:RISCos)
sed 's/^ //' << EOF >$dummy.c
#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
@@ -328,15 +360,18 @@
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
- -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
echo m88k-dg-dgux${UNAME_RELEASE}
- else
+ else
echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
fi
- else echo i586-dg-dgux${UNAME_RELEASE}
- fi
exit 0 ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
@@ -402,7 +437,7 @@
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
echo romp-ibm-bsd4.4
exit 0 ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
exit 0 ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
@@ -423,6 +458,8 @@
9000/[34]?? ) HP_ARCH=m68k ;;
9000/[678][0-9][0-9])
sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
#include <stdlib.h>
#include <unistd.h>
@@ -453,7 +490,7 @@
exit (0);
}
EOF
- ($CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+ (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
rm -f $dummy.c $dummy
esac
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
@@ -547,11 +584,14 @@
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
exit 0 ;;
CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE}
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*T3E:*:*:*)
- echo t3e-cray-unicosmk${UNAME_RELEASE}
+ echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
CRAY-2:*:*:*)
echo cray2-cray-unicos
exit 0 ;;
@@ -563,13 +603,10 @@
F301:UNIX_System_V:*:*)
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
exit 0 ;;
- hp3[0-9][05]:NetBSD:*:*)
- echo m68k-hp-netbsd${UNAME_RELEASE}
- exit 0 ;;
hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
- i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
+ i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
sparc*:BSD/OS:*:*)
@@ -579,17 +616,8 @@
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit 0 ;;
*:FreeBSD:*:*)
- if test -x /usr/bin/objformat; then
- if test "elf" = "`/usr/bin/objformat`"; then
- echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
- exit 0
- fi
- fi
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;;
- *:NetBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- exit 0 ;;
*:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
@@ -618,12 +646,6 @@
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;;
*:Linux:*:*)
- # uname on the ARM produces all sorts of strangeness, and we need to
- # filter it out.
- case "$UNAME_MACHINE" in
- armv*) UNAME_MACHINE=$UNAME_MACHINE ;;
- arm* | sa110*) UNAME_MACHINE="arm" ;;
- esac
# 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
@@ -636,12 +658,43 @@
s/ .*//
p'`
case "$ld_supported_emulations" in
- i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
- i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
- sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
- armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
- m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
- elf32ppc)
+ *ia64)
+ echo "${UNAME_MACHINE}-unknown-linux"
+ exit 0
+ ;;
+ i?86linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0
+ ;;
+ elf_i?86)
+ echo "${UNAME_MACHINE}-pc-linux"
+ exit 0
+ ;;
+ i?86coff)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0
+ ;;
+ sparclinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ armlinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32arm*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
+ exit 0
+ ;;
+ armelf_linux*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnu"
+ exit 0
+ ;;
+ m68klinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32ppc | elf32ppclinux)
# Determine Lib Version
cat >$dummy.c <<EOF
#include <features.h>
@@ -668,49 +721,61 @@
if test "$?" = 0 ; then
LIBC="libc1"
fi
- fi
+ fi
rm -f $dummy.c $dummy
- echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;;
+ echo powerpc-unknown-linux-gnu${LIBC}
+ exit 0
+ ;;
esac
if test "${UNAME_MACHINE}" = "alpha" ; then
- sed 's/^ //' <<EOF >$dummy.s
- .globl main
- .ent main
- main:
- .frame \$30,0,\$26,0
- .prologue 0
- .long 0x47e03d80 # implver $0
- lda \$2,259
- .long 0x47e20c21 # amask $2,$1
- srl \$1,8,\$2
- sll \$2,2,\$2
- sll \$0,3,\$0
- addl \$1,\$0,\$0
- addl \$2,\$0,\$0
- ret \$31,(\$26),1
- .end main
+ cat <<EOF >$dummy.s
+ .data
+ \$Lformat:
+ .byte 37,100,45,37,120,10,0 # "%d-%x\n"
+
+ .text
+ .globl main
+ .align 4
+ .ent main
+ main:
+ .frame \$30,16,\$26,0
+ ldgp \$29,0(\$27)
+ .prologue 1
+ .long 0x47e03d80 # implver \$0
+ lda \$2,-1
+ .long 0x47e20c21 # amask \$2,\$1
+ lda \$16,\$Lformat
+ mov \$0,\$17
+ not \$1,\$18
+ jsr \$26,printf
+ ldgp \$29,0(\$26)
+ mov 0,\$16
+ jsr \$26,exit
+ .end main
EOF
LIBC=""
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then
- ./$dummy
- case "$?" in
- 7)
+ case `./$dummy` in
+ 0-0)
UNAME_MACHINE="alpha"
;;
- 15)
+ 1-0)
UNAME_MACHINE="alphaev5"
;;
- 14)
+ 1-1)
UNAME_MACHINE="alphaev56"
;;
- 10)
+ 1-101)
UNAME_MACHINE="alphapca56"
;;
- 16)
+ 2-303)
UNAME_MACHINE="alphaev6"
;;
+ 2-307)
+ UNAME_MACHINE="alphaev67"
+ ;;
esac
objdump --private-headers $dummy | \
@@ -724,6 +789,7 @@
elif test "${UNAME_MACHINE}" = "mips" ; then
cat >$dummy.c <<EOF
#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
@@ -739,6 +805,8 @@
EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
+ elif test "${UNAME_MACHINE}" = "s390"; then
+ echo s390-ibm-linux && exit 0
else
# Either a pre-BFD a.out linker (linux-gnuoldld)
# or one that does not give us useful --help.
@@ -760,6 +828,7 @@
cat >$dummy.c <<EOF
#include <features.h>
#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
@@ -797,19 +866,21 @@
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit 0 ;;
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
fi
exit 0 ;;
i?86:*:5:7*)
- UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
- (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) && UNAME_MACHINE=i586
- (/bin/uname -X|egrep '^Machine.*Pent.*II' >/dev/null) && UNAME_MACHINE=i686
- (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) && UNAME_MACHINE=i585
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}${UNAME_VERSION}-sysv${UNAME_RELEASE}
+ # Fixed at (any) Pentium or better
+ UNAME_MACHINE=i586
+ if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+ echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
exit 0 ;;
i?86:*:3.2:*)
if test -f /usr/options/cb.name; then
@@ -829,7 +900,11 @@
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit 0 ;;
+ i?86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
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 i386.
echo i386-pc-msdosdjgpp
@@ -942,6 +1017,27 @@
exit 0 ;;
*:Rhapsody:*:*)
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Darwin:*:*)
+ echo `uname -p`-apple-darwin${UNAME_RELEASE}
+ exit 0 ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ if test "${UNAME_MACHINE}" = "x86pc"; then
+ UNAME_MACHINE=pc
+ fi
+ echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit 0 ;;
+ NSR-W:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit 0 ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit 0 ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
exit 0 ;;
esac
--- a/common/libsndfile/config.sub
+++ b/common/libsndfile/config.sub
@@ -1,6 +1,8 @@
#! /bin/sh
# Configuration validation subroutine script, version 1.1.
-# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+# Free Software Foundation, Inc.
+#
# 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.
@@ -25,6 +27,9 @@
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
+# Written by Per Bothner <bothner@cygnus.com>.
+# 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.
@@ -68,7 +73,7 @@
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
- linux-gnu*)
+ nto-qnx* | linux-gnu*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
@@ -105,7 +110,7 @@
-scout)
;;
-wrs)
- os=vxworks
+ os=-vxworks
basic_machine=$1
;;
-hiux*)
@@ -156,6 +161,10 @@
-psos*)
os=-psos
;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
@@ -162,21 +171,24 @@
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
- tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
| 580 | i960 | h8300 \
+ | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \
| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
- | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+ | hppa64 \
+ | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
+ | alphaev6[78] \
| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
| mips64orion | mips64orionel | mipstx39 | mipstx39el \
| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
- | mips64vr5000 | miprs64vr5000el \
+ | mips64vr5000 | miprs64vr5000el | mcore \
| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
- | thumb | d10v)
+ | thumb | d10v | fr30 | avr)
basic_machine=$basic_machine-unknown
;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65)
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
;;
# We use `pc' rather than `unknown'
@@ -191,13 +203,17 @@
exit 1
;;
# Recognize the basic CPU types with company name.
- vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+ # FIXME: clean up the formatting here.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
| power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
| xmp-* | ymp-* \
- | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
- | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
+ | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
+ | hppa2.0n-* | hppa64-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
+ | alphaev6[78]-* \
| we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
| clipper-* | orion-* \
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
@@ -204,10 +220,11 @@
| sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
- | mipstx39-* | mipstx39el-* \
- | f301-* | armv*-* | t3e-* \
+ | mipstx39-* | mipstx39el-* | mcore-* \
+ | f301-* | armv*-* | s390-* | sv1-* | t3e-* \
| m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
- | thumb-* | v850-* | d30v-* | tic30-* | c30-* )
+ | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \
+ | bs2000-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
@@ -425,7 +442,6 @@
;;
i370-ibm* | ibm*)
basic_machine=i370-ibm
- os=-mvs
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[34567]86v32)
@@ -488,7 +504,7 @@
miniframe)
basic_machine=m68000-convergent
;;
- *mint | *MiNT)
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
basic_machine=m68k-atari
os=-mint
;;
@@ -506,6 +522,10 @@
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
+ mmix*)
+ basic_machine=mmix-knuth
+ os=-mmixware
+ ;;
monitor)
basic_machine=m68k-rom68k
os=-coff
@@ -514,6 +534,10 @@
basic_machine=i386-unknown
os=-msdos
;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
@@ -523,7 +547,7 @@
os=-netbsd
;;
netwinder)
- basic_machine=armv4l-corel
+ basic_machine=armv4l-rebel
os=-linux
;;
news | news700 | news800 | news900)
@@ -574,6 +598,9 @@
np1)
basic_machine=np1-gould
;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
op50n-* | op60c-*)
basic_machine=hppa1.1-oki
os=-proelf
@@ -718,6 +745,10 @@
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
symmetry)
basic_machine=i386-sequent
os=-dynix
@@ -907,12 +938,25 @@
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -rhapsody* | -openstep* | -oskit*)
+ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i[34567]86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto*)
+ os=-nto-qnx
+ ;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
- | -macos* | -mpw* | -magic* | -mon960* | -lnews*)
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
@@ -926,6 +970,12 @@
-sunos6*)
os=`echo $os | sed -e 's|sunos6|solaris3|'`
;;
+ -opened*)
+ os=-openedition
+ ;;
+ -wince*)
+ os=-wince
+ ;;
-osfrose*)
os=-osfrose
;;
@@ -950,6 +1000,9 @@
-ns2 )
os=-nextstep2
;;
+ -nsk)
+ os=-nsk
+ ;;
# Preserve the version number of sinix5.
-sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
@@ -1012,7 +1065,7 @@
*-acorn)
os=-riscix1.2
;;
- arm*-corel)
+ arm*-rebel)
os=-linux
;;
arm*-semi)
@@ -1186,7 +1239,7 @@
-genix*)
vendor=ns
;;
- -mvs*)
+ -mvs* | -opened*)
vendor=ibm
;;
-ptx*)
--- a/common/libsndfile/configure
+++ b/common/libsndfile/configure
@@ -22,9 +22,13 @@
ac_help="$ac_help
--disable-libtool-lock avoid locking (might break parallel builds)"
ac_help="$ac_help
- --enable-justsrc only compile library sources "
+ --enable-justsrc only compile library sources "
ac_help="$ac_help
- --disable-gcc-pipe disable gcc -pipe option "
+ --disable-gcc-pipe disable gcc -pipe option "
+ac_help="$ac_help
+ --disable-gcc-opt disable gcc optimisations "
+ac_help="$ac_help
+ --enable-force-broken-float force use of broken float code "
# Initialize some variables set by options.
# The variables have the same names as the options, with
@@ -582,7 +586,7 @@
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:586: checking host system type" >&5
+echo "configure:590: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -603,7 +607,7 @@
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:607: checking target system type" >&5
+echo "configure:611: checking target system type" >&5
target_alias=$target
case "$target_alias" in
@@ -621,7 +625,7 @@
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:625: checking build system type" >&5
+echo "configure:629: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -656,7 +660,7 @@
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:660: checking for a BSD compatible install" >&5
+echo "configure:664: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -709,7 +713,7 @@
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:713: checking whether build environment is sane" >&5
+echo "configure:717: checking whether build environment is sane" >&5
# Just in case
sleep 1
echo timestamp > conftestfile
@@ -766,7 +770,7 @@
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:770: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:774: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -795,7 +799,7 @@
PACKAGE=libsndfile
-VERSION=0.0.22
+VERSION=0.0.27
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
{ echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
@@ -812,7 +816,7 @@
missing_dir=`cd $ac_aux_dir && pwd`
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:816: checking for working aclocal" >&5
+echo "configure:820: checking for working aclocal" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -825,7 +829,7 @@
fi
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:829: checking for working autoconf" >&5
+echo "configure:833: checking for working autoconf" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -838,7 +842,7 @@
fi
echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:842: checking for working automake" >&5
+echo "configure:846: checking for working automake" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -851,7 +855,7 @@
fi
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:855: checking for working autoheader" >&5
+echo "configure:859: checking for working autoheader" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -864,7 +868,7 @@
fi
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:868: checking for working makeinfo" >&5
+echo "configure:872: checking for working makeinfo" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -879,7 +883,7 @@
-SHARED_VERSION_INFO="0:8:0"
+SHARED_VERSION_INFO="0:27:0"
@@ -889,7 +893,7 @@
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:893: checking for $ac_word" >&5
+echo "configure:897: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -919,7 +923,7 @@
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:923: checking for $ac_word" >&5
+echo "configure:927: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -970,7 +974,7 @@
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:974: checking for $ac_word" >&5
+echo "configure:978: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1002,7 +1006,7 @@
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1006: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1010: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1013,12 +1017,12 @@
cat > conftest.$ac_ext << EOF
-#line 1017 "configure"
+#line 1021 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:1022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@@ -1044,12 +1048,12 @@
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1048: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1052: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1053: checking whether we are using GNU C" >&5
+echo "configure:1057: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1058,7 +1062,7 @@
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1066: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -1077,7 +1081,7 @@
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1081: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1085: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1120,7 +1124,7 @@
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1124: checking for a BSD compatible install" >&5
+echo "configure:1128: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1174,7 +1178,7 @@
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1178: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1182: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1201,7 +1205,7 @@
fi
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1205: checking whether ln -s works" >&5
+echo "configure:1209: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1293,7 +1297,7 @@
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1297: checking for $ac_word" >&5
+echo "configure:1301: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1332,7 +1336,7 @@
if test "$ac_cv_prog_gcc" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1336: checking for ld used by GCC" >&5
+echo "configure:1340: checking for ld used by GCC" >&5
ac_prog=`($CC -print-prog-name=ld) 2>&5`
case "$ac_prog" in
# Accept absolute paths.
@@ -1356,10 +1360,10 @@
esac
elif test "$with_gnu_ld" = yes; then
echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1360: checking for GNU ld" >&5
+echo "configure:1364: checking for GNU ld" >&5
else
echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1363: checking for non-GNU ld" >&5
+echo "configure:1367: checking for non-GNU ld" >&5
fi
if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1393,9 +1397,8 @@
echo "$ac_t""no" 1>&6
fi
test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
-
echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1399: checking if the linker ($LD) is GNU ld" >&5
+echo "configure:1402: checking if the linker ($LD) is GNU ld" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1411,7 +1414,7 @@
echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1415: checking for BSD-compatible nm" >&5
+echo "configure:1418: checking for BSD-compatible nm" >&5
if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1447,6 +1450,10 @@
echo "$ac_t""$NM" 1>&6
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
# Check for any special flags to pass to ltconfig.
libtool_flags="--cache-file=$cache_file"
@@ -1468,11 +1475,11 @@
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
-case "$host" in
+case "$lt_target" in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 1475 "configure"' > conftest.$ac_ext
- if { (eval echo configure:1476: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ echo '#line 1482 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:1483: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
case "`/usr/bin/file conftest.o`" in
*32-bit*)
LD="${LD-ld} -32"
@@ -1493,12 +1500,12 @@
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -belf"
echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:1497: checking whether the C compiler needs -belf" >&5
+echo "configure:1504: checking whether the C compiler needs -belf" >&5
if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1502 "configure"
+#line 1509 "configure"
#include "confdefs.h"
int main() {
@@ -1505,7 +1512,7 @@
; return 0; }
EOF
-if { (eval echo configure:1509: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
lt_cv_cc_needs_belf=yes
else
@@ -1583,7 +1590,7 @@
LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
-$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
# Reload cache, that may have been modified by ltconfig
@@ -1608,7 +1615,7 @@
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1612: checking how to run the C preprocessor" >&5
+echo "configure:1619: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1623,13 +1630,13 @@
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1627 "configure"
+#line 1634 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1633: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1640: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1640,13 +1647,13 @@
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1644 "configure"
+#line 1651 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1650: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1657,13 +1664,13 @@
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1661 "configure"
+#line 1668 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1688,12 +1695,12 @@
echo "$ac_t""$CPP" 1>&6
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1692: checking for ANSI C header files" >&5
+echo "configure:1699: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1697 "configure"
+#line 1704 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -1701,7 +1708,7 @@
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1705: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1712: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -1718,7 +1725,7 @@
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1722 "configure"
+#line 1729 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -1736,7 +1743,7 @@
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1740 "configure"
+#line 1747 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -1757,7 +1764,7 @@
:
else
cat > conftest.$ac_ext <<EOF
-#line 1761 "configure"
+#line 1768 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1768,7 +1775,7 @@
exit (0); }
EOF
-if { (eval echo configure:1772: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -1796,17 +1803,17 @@
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1800: checking for $ac_hdr" >&5
+echo "configure:1807: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1805 "configure"
+#line 1812 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1810: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -1833,14 +1840,69 @@
done
+for ac_func in fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1847: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1852 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1839: checking for size_t" >&5
+echo "configure:1901: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1844 "configure"
+#line 1906 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -1868,12 +1930,12 @@
fi
echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:1872: checking for off_t" >&5
+echo "configure:1934: checking for off_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1877 "configure"
+#line 1939 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -1902,7 +1964,7 @@
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:1906: checking size of short" >&5
+echo "configure:1968: checking size of short" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1910,9 +1972,10 @@
ac_cv_sizeof_short=2
else
cat > conftest.$ac_ext <<EOF
-#line 1914 "configure"
+#line 1976 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -1921,7 +1984,7 @@
exit(0);
}
EOF
-if { (eval echo configure:1925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_short=`cat conftestval`
else
@@ -1941,7 +2004,7 @@
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:1945: checking size of int" >&5
+echo "configure:2008: checking size of int" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1949,9 +2012,10 @@
ac_cv_sizeof_int=4
else
cat > conftest.$ac_ext <<EOF
-#line 1953 "configure"
+#line 2016 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -1960,7 +2024,7 @@
exit(0);
}
EOF
-if { (eval echo configure:1964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_int=`cat conftestval`
else
@@ -1980,7 +2044,7 @@
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:1984: checking size of long" >&5
+echo "configure:2048: checking size of long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1988,9 +2052,10 @@
ac_cv_sizeof_long=8
else
cat > conftest.$ac_ext <<EOF
-#line 1992 "configure"
+#line 2056 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -1999,7 +2064,7 @@
exit(0);
}
EOF
-if { (eval echo configure:2003: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_long=`cat conftestval`
else
@@ -2019,7 +2084,7 @@
echo $ac_n "checking size of float""... $ac_c" 1>&6
-echo "configure:2023: checking size of float" >&5
+echo "configure:2088: checking size of float" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2027,9 +2092,10 @@
ac_cv_sizeof_float=4
else
cat > conftest.$ac_ext <<EOF
-#line 2031 "configure"
+#line 2096 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -2038,7 +2104,7 @@
exit(0);
}
EOF
-if { (eval echo configure:2042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_float=`cat conftestval`
else
@@ -2058,7 +2124,7 @@
echo $ac_n "checking size of double""... $ac_c" 1>&6
-echo "configure:2062: checking size of double" >&5
+echo "configure:2128: checking size of double" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2066,9 +2132,10 @@
ac_cv_sizeof_double=4
else
cat > conftest.$ac_ext <<EOF
-#line 2070 "configure"
+#line 2136 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -2077,7 +2144,7 @@
exit(0);
}
EOF
-if { (eval echo configure:2081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_double=`cat conftestval`
else
@@ -2097,7 +2164,7 @@
echo $ac_n "checking size of void*""... $ac_c" 1>&6
-echo "configure:2101: checking size of void*" >&5
+echo "configure:2168: checking size of void*" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_voidp'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2105,9 +2172,10 @@
ac_cv_sizeof_voidp=8
else
cat > conftest.$ac_ext <<EOF
-#line 2109 "configure"
+#line 2176 "configure"
#include "confdefs.h"
#include <stdio.h>
+#include <sys/types.h>
main()
{
FILE *f=fopen("conftestval", "w");
@@ -2116,7 +2184,7 @@
exit(0);
}
EOF
-if { (eval echo configure:2120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_voidp=`cat conftestval`
else
@@ -2139,7 +2207,7 @@
# Check whether --enable-justsrc or --disable-justsrc was given.
if test "${enable_justsrc+set}" = set; then
enableval="$enable_justsrc"
- ac_arg_justsrc="$enableval"
+ ac_arg_justsrc="Y"
else
ac_arg_justsrc="N"
fi
@@ -2154,9 +2222,37 @@
fi
+# Check whether --enable-gcc-opt or --disable-gcc-opt was given.
+if test "${enable_gcc_opt+set}" = set; then
+ enableval="$enable_gcc_opt"
+ ac_arg_gcc_opt="N"
+else
+ ac_arg_gcc_opt="Y"
+fi
+
+
+# Check whether --enable-force-broken-float or --disable-force-broken-float was given.
+if test "${enable_force_broken_float+set}" = set; then
+ enableval="$enable_force_broken_float"
+ ac_arg_broken_float="Y"
+else
+ ac_arg_broken_float="N"
+fi
+
+
if test $ac_cv_prog_gcc = yes ; then
- CFLAGS="-g -O2 -Wall -pedantic -Wstrict-prototypes"
-
+ CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
+ if test "$ac_arg_gcc_opt" = "N" ; then
+ CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
+ echo "configure: warning: *** Compiler optimisations switched off. ***" 1>&2
+ fi
+ case "$target_os" in
+ darwin* | rhapsody*)
+ ;;
+ *)
+ CFLAGS="$CFLAGS -Wall -pedantic"
+ ;;
+ esac
if test $ac_arg_gcc_pipe != "N" ; then
CFLAGS="$CFLAGS -pipe"
fi
@@ -2167,8 +2263,6 @@
echo "configure: warning: *** We are cross-compiling, so have to assume sizeof (short) == 2 " 1>&2
echo "configure: warning: *** and sizeof (int) == 4. If this is not the case there is no " 1>&2
echo "configure: warning: *** chance of this working. Please contact the mantainer. " 1>&2
- echo "configure: warning: *** If the sizeof issues are not a problem you may need to " 1>&2
- echo "configure: warning: *** undefine CAN_READ_WRITE_x86_IEEE in src/config.h. " 1>&2
echo "configure: warning: ******************************************************************" 1>&2
fi
@@ -2195,7 +2289,7 @@
echo "configure: warning: *** sizeof (double) != 8. " 1>&2
echo "configure: warning: ******************************************************************" 1>&2
fi
-
+
case "$target_cpu" in
alpha* | i?86 )
cat >> confdefs.h <<\EOF
@@ -2227,41 +2321,27 @@
;;
esac
-case "$target_cpu" in
- i?86 )
- cat >> confdefs.h <<\EOF
-#define CAN_READ_WRITE_x86_IEEE 1
+subdirs="src/GSM610 src/G72x src"
+if test $ac_arg_justsrc = "N" ; then
+ subdirs="$subdirs examples doc tests"
+ fi
+
+if test $ac_arg_broken_float = "Y" ; then
+ cat >> confdefs.h <<\EOF
+#define FORCE_BROKEN_FLOAT 1
EOF
- ;;
-
- alpha* | hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
- cat >> confdefs.h <<\EOF
-#define CAN_READ_WRITE_x86_IEEE 0
+ echo "configure: warning: *** Testing code for processors that can't read/write IEEE floats." 1>&2
+else
+ cat >> confdefs.h <<\EOF
+#define FORCE_BROKEN_FLOAT 0
EOF
- ;;
+ fi
+
- *)
- echo "configure: warning: *****************************************************************" 1>&2
- echo "configure: warning: *** Not able to determine endian-ness of processor. " 1>&2
- echo "configure: warning: *** You will need to edit src/config.h before compiling. " 1>&2
- echo "configure: warning: *****************************************************************" 1>&2
- ;;
-esac
-case $ac_arg_justsrc in
- 1*|n*|N*)
- subdirs="src/GSM610 src/G72x src examples doc tests"
- ;;
- *)
- subdirs="src/GSM610 src/G72x src"
- ;;
-esac
-
-
-
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
@@ -2365,7 +2445,7 @@
trap 'rm -fr `echo "Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
- MacOS/Makefile m4/Makefile libsndfile.spec src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+ MacOS/Makefile libsndfile.spec src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
@@ -2426,8 +2506,6 @@
s%@CC@%$CC%g
s%@LN_S@%$LN_S%g
s%@RANLIB@%$RANLIB%g
-s%@LD@%$LD%g
-s%@NM@%$NM%g
s%@LIBTOOL@%$LIBTOOL%g
s%@CPP@%$CPP%g
s%@subdirs@%$subdirs%g
@@ -2475,7 +2553,7 @@
CONFIG_FILES=\${CONFIG_FILES-"Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
- MacOS/Makefile m4/Makefile libsndfile.spec"}
+ MacOS/Makefile libsndfile.spec"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
@@ -2654,5 +2732,4 @@
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
--- a/common/libsndfile/configure.in
+++ b/common/libsndfile/configure.in
@@ -1,5 +1,5 @@
# Configure `libsndfile'.
-# Copyright (C) 1999-2000 Erik de Castro Lopo (erikd@zip.com.au).
+# Copyright (C) 1999-2001 Erik de Castro Lopo (erikd@zip.com.au).
dnl Require autoconf version >= 2.12
@@ -7,12 +7,12 @@
AC_INIT(src/sndfile.c)
AC_CANONICAL_SYSTEM
-AM_INIT_AUTOMAKE(libsndfile,0.0.22)
+AM_INIT_AUTOMAKE(libsndfile,0.0.27)
dnl This is the version info according to the libtool versioning system.
dnl It does *not* correspond to the release number.
-SHARED_VERSION_INFO="0:8:0"
+SHARED_VERSION_INFO="0:27:0"
dnl Process this file with autoconf to produce a configure script.
@@ -29,7 +29,7 @@
AC_CHECK_HEADERS(endian.h)
-dnl AC_CHECK_FUNCS(fopen fread fwrite fclose fseek ftell malloc free)
+AC_CHECK_FUNCS(fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf)
AC_TYPE_SIZE_T
AC_TYPE_OFF_T
@@ -41,17 +41,34 @@
AC_CHECK_SIZEOF(double,4)
AC_CHECK_SIZEOF(void*,8)
-AC_ARG_ENABLE(justsrc, [ --enable-justsrc only compile library sources ],
- ac_arg_justsrc="$enableval", ac_arg_justsrc="N")
+AC_ARG_ENABLE(justsrc, [ --enable-justsrc only compile library sources ],
+ ac_arg_justsrc="Y", ac_arg_justsrc="N")
-AC_ARG_ENABLE(gcc-pipe, [ --disable-gcc-pipe disable gcc -pipe option ],
+AC_ARG_ENABLE(gcc-pipe, [ --disable-gcc-pipe disable gcc -pipe option ],
ac_arg_gcc_pipe="N", ac_arg_gcc_pipe="Y")
+AC_ARG_ENABLE(gcc-opt, [ --disable-gcc-opt disable gcc optimisations ],
+ ac_arg_gcc_opt="N", ac_arg_gcc_opt="Y")
+
+AC_ARG_ENABLE(force-broken-float,
+ [ --enable-force-broken-float force use of broken float code ],
+ ac_arg_broken_float="Y", ac_arg_broken_float="N")
+
if test $ac_cv_prog_gcc = yes ; then
- CFLAGS="-g -O2 -Wall -pedantic -Wstrict-prototypes"
- dnl CFLAGS="-g -O0 -Wall -Werror -Wstrict-prototypes"
- dnl AC_MSG_WARN([**** Optimisation has been switched off. ****])
-
+ CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
+ if test "$ac_arg_gcc_opt" = "N" ; then
+ CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
+ AC_MSG_WARN([[*** Compiler optimisations switched off. ***]])
+ fi
+ dnl Disable -Wall and -pedantic for Apple Darwin/Rhapsody.
+ dnl System headers on these systems are broken.
+ case "$target_os" in
+ darwin* | rhapsody*)
+ ;;
+ *)
+ CFLAGS="$CFLAGS -Wall -pedantic"
+ ;;
+ esac
if test $ac_arg_gcc_pipe != "N" ; then
CFLAGS="$CFLAGS -pipe"
fi
@@ -58,39 +75,37 @@
fi
if test $cross_compiling = yes ; 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([*** If the sizeof issues are not a problem you may need to ])
- AC_MSG_WARN([*** undefine CAN_READ_WRITE_x86_IEEE in src/config.h. ])
- AC_MSG_WARN([******************************************************************])
+ 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_int != 4 ; then
- AC_MSG_WARN([******************************************************************])
- AC_MSG_WARN([*** sizeof (int) != 4 ])
- AC_MSG_WARN([******************************************************************])
+ AC_MSG_WARN([[******************************************************************]])
+ AC_MSG_WARN([[*** sizeof (int) != 4 ]])
+ AC_MSG_WARN([[******************************************************************]])
fi
if test $ac_cv_sizeof_short != 2 ; then
- AC_MSG_WARN([******************************************************************])
- AC_MSG_WARN([*** sizeof (short) != 2. ])
- AC_MSG_WARN([******************************************************************])
+ AC_MSG_WARN([[******************************************************************]])
+ AC_MSG_WARN([[*** sizeof (short) != 2. ]])
+ AC_MSG_WARN([[******************************************************************]])
fi
if test $ac_cv_sizeof_float != 4 ; then
- AC_MSG_WARN([******************************************************************])
- AC_MSG_WARN([*** sizeof (float) != 4. ])
- AC_MSG_WARN([******************************************************************])
+ AC_MSG_WARN([[******************************************************************]])
+ AC_MSG_WARN([[*** sizeof (float) != 4. ]])
+ AC_MSG_WARN([[******************************************************************]])
fi
if test $ac_cv_sizeof_double != 8 ; then
- AC_MSG_WARN([******************************************************************])
- AC_MSG_WARN([*** sizeof (double) != 8. ])
- AC_MSG_WARN([******************************************************************])
+ AC_MSG_WARN([[******************************************************************]])
+ AC_MSG_WARN([[*** sizeof (double) != 8. ]])
+ AC_MSG_WARN([[******************************************************************]])
fi
-
+
case "$target_cpu" in
alpha* | i?86 )
AC_DEFINE(GUESS_LITTLE_ENDIAN,1)
@@ -103,43 +118,28 @@
;;
*)
- AC_MSG_WARN([*****************************************************************])
- AC_MSG_WARN([*** Not able to determine endian-ness of processor. ])
- AC_MSG_WARN([*** You will need to edit src/config.h before compiling. ])
- AC_MSG_WARN([*****************************************************************])
+ AC_MSG_WARN([[*****************************************************************]])
+ AC_MSG_WARN([[*** Not able to determine endian-ness of processor. ]])
+ AC_MSG_WARN([[*** You will need to edit src/config.h before compiling. ]])
+ AC_MSG_WARN([[*****************************************************************]])
;;
esac
-case "$target_cpu" in
- i?86 )
- AC_DEFINE(CAN_READ_WRITE_x86_IEEE,1)
- ;;
-
- alpha* | hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
- AC_DEFINE(CAN_READ_WRITE_x86_IEEE,0)
- ;;
+subdirs="src/GSM610 src/G72x src"
+if test $ac_arg_justsrc = "N" ; then
+ subdirs="$subdirs examples doc tests"
+ fi
- *)
- AC_MSG_WARN([*****************************************************************])
- AC_MSG_WARN([*** Not able to determine endian-ness of processor. ])
- AC_MSG_WARN([*** You will need to edit src/config.h before compiling. ])
- AC_MSG_WARN([*****************************************************************])
- ;;
-esac
-
-case $ac_arg_justsrc in
- 1*|n*|N*)
- subdirs="src/GSM610 src/G72x src examples doc tests"
- ;;
- *)
- subdirs="src/GSM610 src/G72x src"
- ;;
-esac
-
+if test $ac_arg_broken_float = "Y" ; then
+ AC_DEFINE(FORCE_BROKEN_FLOAT,1)
+ AC_MSG_WARN([[*** Testing code for processors that can't read/write IEEE floats.]])
+else
+ AC_DEFINE(FORCE_BROKEN_FLOAT,0)
+ fi
+
AC_SUBST(subdirs)
AC_SUBST(SHARED_VERSION_INFO)
AC_OUTPUT(Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
- MacOS/Makefile m4/Makefile libsndfile.spec)
-
+ MacOS/Makefile libsndfile.spec)
--- a/common/libsndfile/doc/ChangeLog
+++ /dev/null
@@ -1,644 +1,0 @@
-2000-08-15 Erik de Castro Lopo <erikd@zip.com.au>
-
- * src/sndfile.c
- Fixed a leak of FILE* pointers in sf_opren_read(). Thanks to Sigbj�rn Skj�ret
- for spotting this one.
-
-2000-08-13 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au or copyright under a GPL/LGPL compatible
- license.
-
-2000-08-06 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/paf.c
- Add checking for files shorter than minimal PAF file header length.
-
-2000-06-02 Erik de Castro Lopo <erikd@zip.com.au>
-
- * tests/write_read_test.c
- Added extra sf_perror() calls when sf_write_XXXX fails.
-
-2000-05-29 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/sndfile.h.in
- Fixed comments about sf_perror () and sf_error_str ().
-
-2000-03-14 Erik de Castro Lopo <erikd@zip.com.au>
-
- * configure.in
- Fixed --enable-justsrc option.
-
-2000-03-07 Erik de Castro Lopo <erikd@zip.com.au>
-
- * wav.c
- Fixed checking of bytespersec field of header. Still some weirdness
- with some files.
-
-2000-03-05 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/wav.c
- Added more error reporting in read_fmt_chunk().
-
-1999-12-21 Erik de Castro Lopo <erikd@zip.com.au>
-
- * examples/sfinfo.c
- Modified program to accept multiple filenames from the command line.
-
-1999-11-27 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/svx.c
- Finished off implementation of write using __psf_hprintf().
-
-1999-09-21 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/sndfile.h MacOS/config.h
- Fixed minor MacOS configuration issues.
-
-1999-07-30 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/sndfile.c src/sndfile.h src/raw.c
- Further fixing of #includes for MacOS.
-
-1999-07-25 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * examples/sfinfo.c
- Removed options so the sfinfo program always prints out all the information.
-
-1999-07-19 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * tests/ulaw_test.c
- New test program to test the u-law encode/decode lookup tables.
-
-1999-07-16 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * tests/adpcm_test.c
- Initialised amp variable in gen_signal() to remove compiler warning.
-
-1999-07-12 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * tests/read_seek_test.c
- Added test for 8 bit AIFF files.
-
-1999-06-18 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/wav.c src/aiff.c
- Added handling for unknown chunk markers in the file.
-
-1999-03-22 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/wav.c
- Finished implementing IMA ADPCM encoder and decoder (what a bitch!).
-
-1999-03-03 Erik de Castro Lopo <erikd@zip.com.au>
-
- * src/wav.c
- Started implementing IMA ADPCM decoder.
-
-1999-03-02 Erik de Castro Lopo <erikd@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * 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@zip.com.au>
-
- * src/aiff.c:
- Changed reading of 'COMM' chunk to avoid reading an int
- which overlaps an int (4 byte) boundary.
-
--- a/common/libsndfile/doc/Makefile.am
+++ /dev/null
@@ -1,1 +1,0 @@
-EXTRA_DIST = index.html libsndfile.jpg api.html bugs.html sfinfo.html
--- a/common/libsndfile/doc/Makefile.in
+++ /dev/null
@@ -1,184 +1,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 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.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_alias = @build_alias@
-build_triplet = @build@
-host_alias = @host_alias@
-host_triplet = @host@
-target_alias = @target_alias@
-target_triplet = @target@
-AS = @AS@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LD = @LD@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-NM = @NM@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
-VERSION = @VERSION@
-subdirs = @subdirs@
-
-EXTRA_DIST = index.html libsndfile.jpg api.html bugs.html sfinfo.html
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../src/config.h
-CONFIG_CLEAN_FILES =
-DIST_COMMON = ChangeLog Makefile.am Makefile.in NEWS
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-all: all-redirect
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-tags: TAGS
-TAGS:
-
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = doc
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-generic clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-generic distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: tags distdir info-am info dvi-am dvi check check-am \
-installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
-
-
-# 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.
-.NOEXPORT:
--- a/common/libsndfile/doc/NEWS
+++ /dev/null
@@ -1,58 +1,0 @@
-Version 0.0.21 (2000-08-16)
- * Offical release.
- * AU files without the normal AU file header are now recognised as headerless
- 8kHz 8 bit ulaw encoded files.
- * Added handling for G721 4bit APDCM encoded AU files.
- * Added handling for G723 3bit APDCM encoded AU files.
- * Improved Win32 compiling and use instructions from Mike Ricos.
-
-Version 0.0.20 (2000-05-30)
- * Offical release.
- * Minor bug fix for LinuxPPC (endian issues).
-
-Version 0.0.19 (2000-05-20)
- * Offical release.
- * Minor bug fix for handling GSM 6.10 encoded WAV files on big endian machines.
-
-Version 0.0.18 (2000-04-25)
- * Offical release.
- * Added handling for GSM 6.10 encoded WAV files.
- * Minor bug fixes.
-
-Version 0.0.17 (1999-11-16)
- * Offical release.
- * New file formats (SVX and PAF).
- * Minor bug fixes.
-
-Version 0.0.16 (1999-07-31)
- * Offical release.
- * Fixed minor MacOS configuration issues.
-
-Version 0.0.15 (1999-07-30)
- * Offical release.
- * Added MS ADPCM WAV file write.
- * Added WAV and AU file A-law and u-law encoding.
- * Added RAW header-less PCM file handling.
- * Added MacOS support (thanks to Ben "Jacobs").
-
-Version 0.0.12 (1999-06-19)
- * Offical release.
- * Code cleanup to remove compiler warning messages.
-
-Version 0.0.10 (1999-06-12)
- * Unoffical release.
- * Changes to low level code which improve error detection and handling.
- * Added read-only handling of Microsoft ADPCM WAV files.
- * Added Win32 support (almost exclusively due to Albert Faber, thanks).
- * Fixed bug in IMA ADPCM file writing.
-
-Version 0.0.9 (1999-03-14)
- * Add handling of IMA ADPCM WAV files.
- * Add new function sf_get_header_info and add example program sfinfo.
- * Implemented 8 bit PCM data formats for AIFF, AU and WAV.
-
-Version 0.0.8 (1999-02-16)
- * First offical release.
-
-Version 0.0.7 (1999-02-13)
- * First unoffical release.
--- a/common/libsndfile/doc/api.html
+++ /dev/null
@@ -1,329 +1,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN//3.0">
-<HTML>
-
-<HEAD>
- <TITLE>
- The libsndfile API.
- </TITLE>
- <META NAME="Author" CONTENT="Erik de Castro Lopo">
- <META NAME="Version" CONTENT="Version 0.0.18">
- <META NAME="Description" CONTENT="The libsndfile API.">
- <META NAME="Keywords" CONTENT="WAV AIFF AU libsndfile sound audio dsp Linux">
-
-</HEAD>
-
-<BODY TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#5050FF" VLINK="#5050FF" ALINK="#FF00FF">
-
-<FONT SIZE=3>
-
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>libsndfile</B></FONT>
-<BR><BR>
- Libsndfile is a library designed to allow the reading and writing of many
- different sampled sound file formats (such as MS Windows WAV and the Apple/SGI
- AIFF format) through one standard library interface.
-<BR><BR>
-
-<FONT SIZE=+5 COLOR="#5050FF"><BR><B>SYNOPSIS</B></FONT>
-<BR><BR>
-
-The functions of linbsndfile are defined as follows:
-
-<PRE>
- #include <stdio.h>
- #include <sndfile.h>
-
- SNDFILE* <A HREF="#open">sf_open_read</A> (const char *path, SF_INFO *sfinfo) ;
- SNDFILE* <A HREF="#open">sf_open_write</A> (const char *path, const SF_INFO *sfinfo) ;
-
- off_t <A HREF="#seek">sf_seek</A> (SNDFILE *sndfile, off_t frames, int whence) ;
-
- size_t <A HREF="#raw">sf_read_raw</A> (SNDFILE *sndfile, void *ptr, size_t bytes) ;
- size_t <A HREF="#raw">sf_write_raw</A> (SNDFILE *sndfile, void *ptr, size_t bytes) ;
-
- size_t <A HREF="#read">sf_read_short</A> (SNDFILE *sndfile, short *ptr, size_t items) ;
- size_t <A HREF="#read">sf_read_int</A> (SNDFILE *sndfile, int *ptr, size_t items) ;
- size_t <A HREF="#read">sf_read_double</A> (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
-
- size_t <A HREF="#readf">sf_readf_short</A> (SNDFILE *sndfile, short *ptr, size_t frames) ;
- size_t <A HREF="#readf">sf_readf_int</A> (SNDFILE *sndfile, int *ptr, size_t frames) ;
- size_t <A HREF="#readf">sf_readf_double</A> (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-
- size_t <A HREF="#write">sf_write_short</A> (SNDFILE *sndfile, short *ptr, size_t items) ;
- size_t <A HREF="#write">sf_write_int</A> (SNDFILE *sndfile, int *ptr, size_t items) ;
- size_t <A HREF="#write">sf_write_double</A> (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
-
- size_t <A HREF="#writef">sf_writef_short</A> (SNDFILE *sndfile, short *ptr, size_t frames) ;
- size_t <A HREF="#writef">sf_writef_int</A> (SNDFILE *sndfile, int *ptr, size_t frames) ;
- size_t <A HREF="#writef">sf_writef_double</A> (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-
- int <A HREF="#close">sf_close</A> (SNDFILE *sndfile) ;
-</PRE>
-
-<BR>
-SNDFILE* is an anonymous pointer to data which is private to the library.
-<BR><BR>
-
-<A NAME="open">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Open Functions</B></FONT>
-
-<PRE>
- SNDFILE* sf_open_read (const char *path, SF_INFO *wfinfo) ;
- SNDFILE* sf_open_write (const char *path, const SF_INFO *wfinfo) ;
-</PRE>
-
-The SF_INFO structure is for passing data between the calling function and the library
-when opening a file for read or writing. It is defined in sndfile.h as follows:
-
-<PRE>
- typedef struct
- { int samplerate ;
- int samples ;
- int channels ;
- int pcmbitwidth ;
- int format ;
- int sections ;
- int seekable ;
- } SF_INFO ;
-</PRE>
-
-<BR>
-When opening a file for read (with the exception of RAW files where the caller has
-to fill in the channels, pcmbitwidth and format fields), all the structure members
-are filled in by the library.
-
-<BR><BR>
-When opening a file for write, the caller must fill in structure members samplerate,
-channels, pcmbitwidth and format. For encoded formats (ie u-law, A-law and ADPCM),
-pcmbitwidth is the bit width before encoding or after decoding.
-
-<BR><BR>
-The format field in the above structure is made up of the bit-wise OR of a major
-format type with a value of 0x10000 or greater and a minor format type with a value
-less than 0x10000. The currently understood formats are listed in sndfile.h as
-follows and also includes two bitmasks for separating major and minor file types.
-Not all combinations of major and minor file types are valid.
-
-<PRE>
- enum
- { SF_FORMAT_WAV = 0x10000, /* Microsoft WAV format (big endian). */
- SF_FORMAT_AIFF = 0x20000, /* Apple/SGI AIFF format (little endian). */
- SF_FORMAT_AU = 0x30000, /* Sun/NeXT AU format (big endian). */
- SF_FORMAT_AULE = 0x40000, /* DEC AU format (little endian). */
- SF_FORMAT_RAW = 0x50000, /* RAW PCM data. */
- SF_FORMAT_PAF = 0x60000, /* Ensoniq PARIS file format. */
- SF_FORMAT_SVX = 0x70000, /* Amiga IFF / SVX8 / SV16 format. */
-
- SF_FORMAT_PCM = 0x0001, /* PCM data in 8, 16, 24 or 32 bits. */
- SF_FORMAT_FLOAT = 0x0002, /* 32 bit floats. */
- SF_FORMAT_ULAW = 0x0003, /* U-Law encoded. */
- SF_FORMAT_ALAW = 0x0004, /* A-Law encoded. */
- SF_FORMAT_IMA_ADPCM = 0x0005, /* IMA ADPCM. */
- SF_FORMAT_MS_ADPCM = 0x0006, /* Microsoft ADPCM. */
-
- SF_FORMAT_PCM_BE = 0x0007, /* Big endian PCM data. */
- SF_FORMAT_PCM_LE = 0x0008, /* Little endian PCM data. */
- SF_FORMAT_PCM_S8 = 0x0009, /* Signed 8 bit PCM. */
- SF_FORMAT_PCM_U8 = 0x000A, /* Unsigned 8 bit PCM. */
-
- SF_FORMAT_PCM_BE = 0x0007, /* RAW PCM (big endian). */
- SF_FORMAT_PCM_LE = 0x0008, /* RAW PCM (little endian). */
- SF_FORMAT_RAW_S8 = 0x0009, /* Signed 8 bit RAW PCM. */
- SF_FORMAT_RAW_U8 = 0x000A, /* Unsigned 8 bit RAW PCM. */
-
- SF_FORMAT_SUBMASK = 0xFFFF,
- SF_FORMAT_TYPEMASK = 0x7FFF0000
- } ;
-</PRE>
-
-<BR>
-On success, the sf_open functions return a non NULL pointer which should be passed as
-the first parameter to all subsequent libsndfile calls dealing with that audio file.
-On fail, the sf_open functions return a NULL pointer.
-<BR><BR>
-
-
-<A NAME="seek">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Seek Functions</B></FONT>
-
-<PRE>
- off_t sf_seek (SNDFILE *sndfile, off_t frames, int whence) ;
-</PRE>
-
-The file seek functions work much like lseek in stdio.h with the exception that
-the non-audio data is ignored and the seek only moves within the audio data section of
-the file. In addition, seeks are defined in number of (multichannel) samples or frames.
-Therefor, for a seek in a stereo file from the current position forward with an offset
-of 1 would skip forward by one sample of both channels.
-<BR><BR>
-Valid values for the whence parameter are defined to be the same as the lseek function
-and behave as follows:
-
-<PRE>
- SEEK_SET - The offset is set to the start of the audio data plus offset (multichannel) samples.
- SEEK_CUR - The offset is set to its current location plus offset (multichannel) samples.
- SEEK_END - The offset is set to the end of the data plus offset (multichannel) samples.
-</PRE>
-
-Note that frames offset can be negative and in fact should be when SEEK_END is used for the
-whence parameter.
-
-<BR><BR>
-sf_seek will return the offset in (multichannel) samples from the start of the audio data
-or -1 if an error occurs (ie an attempt is made to seek beyond the start or end of the file).
-
-<BR>
-<A NAME="read">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Read Functions (Items)</B></FONT>
-
-<PRE>
- size_t sf_read_short (SNDFILE *sndfile, short *ptr, size_t items) ;
- size_t sf_read_int (SNDFILE *sndfile, int *ptr, size_t items) ;
- size_t sf_read_double (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
-</PRE>
-
-The file read items functions fill the array pointed to by ptr with the requested
-number of items. The items parameter must be an integer product of the number
-of channels or an error will occur.
-
-<BR><BR>
-The sf_read_double function has an extra parameter. If normalize is 1, the
-read operation will return data that is normalized so that the maximum possible
-full scale sample value of the file on disk will result in a sample value of 1.0
-in the array, with all other sample values scaled accordingly.
-
-<BR><BR>
-The sf_read_XXXX functions return the number of items read. Unless the end of the
-file was reached during the read, the return value should equal the of items
-requested. Attempts to read beyond the end of the file will not result in an error
-but will cause the sf_read_XXXX functions to return less than the number of items
-requested or 0 if already at the end of the file. On error, a value of -1 is
-returned.
-
-<BR><BR>
-
-<A NAME="readf">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Read Functions (Frames)</B></FONT>
-
-<PRE>
- size_t sf_readf_short (SNDFILE *sndfile, short *ptr, size_t frames) ;
- size_t sf_readf_int (SNDFILE *sndfile, int *ptr, size_t frames) ;
- size_t sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-</PRE>
-
-The file read frames functions fill the array pointed to by ptr with the requested
-number of frames of data. The array must be large enough to hold the product of
-frames and the number of channels.
-
-<BR><BR>
-The sf_readf_double function has an extra parameter. If normalize is 1, the
-read operation will return data that is normalized so that the maximum possible
-full scale sample value of the file on disk will result in a sample value of 1.0
-in the array, with all other sample values scaled accordingly.
-
-<BR><BR>
-The sf_readf_XXXX functions return the number of frames read. Unless the end of the
-file was reached during the read, the return value should equal the of frames
-requested. Attempts to read beyond the end of the file will not result in an error
-but will cause the sf_readf_XXXX functions to return less than the number of frames
-requested or 0 if already at the end of the file. On error, a value of -1 is
-returned.
-
-<BR><BR>
-
-<A NAME="write">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Write Functions (Items)</B></FONT>
-
-<PRE>
- size_t sf_write_short (SNDFILE *sndfile, short *ptr, size_t items) ;
- size_t sf_write_int (SNDFILE *sndfile, int *ptr, size_t items) ;
- size_t sf_write_double (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
-</PRE>
-
-
-The file write items functions write the data in the array pointed to by ptr to the file.
-The items parameter must be an integer product of the number of channels or an error
-will occur.
-
-<BR><BR>
-The sf_write_double function has an extra parameter. If normalize is 1, the write
-operation will assume that data in the array is normalize so that all values are
-between -1 and 1 and will scale the samples to fill the bitwidth of the disk file
-format. If normalize is zero, no scaling will take place and the samples will be
-truncated and written to disk as integers of 8, 16, 24 or 32 bits.
-
-<BR><BR>
-The sf_write_XXXX functions return the number of items written (which should be the
-same as the items parameter) or -1 if an error has occurred.
-<BR><BR>
-
-<A NAME="writef">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Write Functions (Frames)</B></FONT>
-
-<PRE>
- size_t sf_writef_short (SNDFILE *sndfile, short *ptr, size_t frames) ;
- size_t sf_writef_int (SNDFILE *sndfile, int *ptr, size_t frames) ;
- size_t sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-</PRE>
-
-
-The file write frames functions write the data in the array pointed to by ptr to the file.
-The array must be large enough to hold the product of frames and the number of channels.
-
-<BR><BR>
-The sf_writef_double function has an extra parameter. If normalize is 1, the write
-operation will assume that data in the array is normalize so that all values are
-between -1 and 1 and will scale the samples to fill the bitwidth of the disk file
-format. If normalize is zero, no scaling will take place and the samples will be
-truncated and written to disk as integers of 8, 16, 24 or 32 bits.
-
-<BR><BR>
-The sf_writef_XXXX functions return the number of frames written (which should be the
-same as the frames parameter) or -1 if an error has occurred.
-<BR><BR>
-
-<A NAME="raw">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>Raw File Read and Write Functions</B></FONT>
-
-
-<PRE>
- size_t sf_read_raw (SNDFILE *sndfile, void *ptr, size_t bytes) ;
- size_t sf_write_raw (SNDFILE *sndfile, void *ptr, size_t bytes) ;
-</PRE>
-
-The raw write and write functions read raw audio data from the audio file (not to be
-confused with reading RAW header-less PCM files). The number of bytes read or written
-must always be an integer multiple of the number of channels multiplied by the number
-of bytes required to represent one sample from one channel.
-
-<BR><BR>
-The raw read and write functions return the number of bytes read or written (which
-should be the same as the bytes parameter) or -1 if an error has occurred.
-<BR><BR>
-
-<A NAME="close">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>File Close Function</B></FONT>
-
-
-<PRE>
- int sf_close (SNDFILE *sndfile) ;
-</PRE>
-
-The close function closes the file, deallocates it's internal buffers and returns
-0 on success or an error value.
-
-<BR><BR>
-<BR>
-
-<HR>
-
-<BR><BR>
- The libsndfile home page is
- <A HREF="http://www.zip.com.au/~erikd/libsndfile/">here</A>.
-<P>
-Version : 0.0.18
-</P>
-
-
-</FONT>
-</BODY>
-</HTML>
--- a/common/libsndfile/doc/bugs.html
+++ /dev/null
@@ -1,61 +1,0 @@
-<HTML>
-
-<HEAD>
- <TITLE>
- Bug Reporting
- </TITLE>
- <META NAME="Author" CONTENT="Erik de Castro Lopo (erikd@zip.com.au)">
-</HEAD>
-
-<BODY TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#9090FF" VLINK="#5050FF" ALINK="#FF00FF">
-
-<FONT SIZE=3>
-
-<FONT SIZE=+20 COLOR="#5050FF">
- <BR>
- <CENTER>
- <B>Reporting Bugs in libsndfile</B>
- </CENTER>
-</FONT>
-
-<BR><BR>
- I am interested in finding and fixing all genuine bugs in libsndfile. Bugs I want to
- fix include any of the following problems (and probably others) :
- <UL>
- <LI> compilation problems on new platforms
- <LI> errors being detected during the `make check' process
- <LI> segmentation faults occuring inside libsndfile
- <LI> libsndfile hanging when opening a file
- <LI> supported sound file types being incorrectly read or written
- <LI> errors or spelling mistakes in the documentation
- </UL>
-
-<BR>
- When submitting a bug report you must include :
- <UL>
- <LI> the operating system you are using
- <LI> the compiler you are using
- <LI> a description of the problem
- <LI> information generated by the sfinfo program (see next paragraph)
- </UL>
-
-<BR>
- If libsndfile compiles and installs correctly but has difficulty reading a particular
- file or type of file you should run the <B>sfinfo</B> program (from the examples
- directory of the libsndfile distribution) on the file. See
- <A HREF="sfinfo.html">here</A>
- for an example of the use of the <B>sfinfo</B> program.
-
-<BR><BR>
- Please do not send me a sound file which fails to open under libsndfile unless I
- specifically ask you to. The above information should usually suffice for most
- problems.
-
-<BR><BR>
- Once you have the above information you may mail it to me at
- <A HREF="mailto:erikd@zip.com.au">erikd@zip.com.au</a>.
-
-<BR><BR>
-</FONT>
-</BODY>
-</HTML>
--- a/common/libsndfile/doc/index.html
+++ /dev/null
@@ -1,229 +1,0 @@
-<HTML>
-
-<HEAD>
- <TITLE>
- libsndfile
- </TITLE>
- <META NAME="Author" CONTENT="Erik de Castro Lopo (erikd@zip.com.au)">
- <META NAME="Version" CONTENT="libsndfile-0.0.21">
- <META NAME="Description" CONTENT="The `libsndfile' Home Page">
- <META NAME="Keywords" CONTENT="WAV AIFF AU libsndfile sound audio dsp Linux">
- <META NAME="ROBOTS" CONTENT="NOFOLLOW">
-
-</HEAD>
-
-<BODY TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#9090FF" VLINK="#5050FF" ALINK="#FF00FF">
-
-<CENTER>
- <IMG SRC="libsndfile.jpg" HEIGHT=98 WIDTH=367 ALT="libsndfile.jpg">
-</CENTER>
-
-<CENTER>
- <A HREF="#History">History</A> -+-
- <A HREF="#Capabilities">Capabilities</A> -+-
- <A HREF="#Similar">Similar or Related Projects</A>
- <BR>
- <A HREF="api.html">Programming Interface</A> -+-
- <A HREF="bugs.html">Bug Reporting</A> -+-
- <A HREF="#Download">Download</A>
- <BR>
- <A HREF="NEWS">News</A> -+-
- <A HREF="ChangeLog">Change Log</A> -+-
- <A HREF="#Licensing">Licensing Information</A>
-</CENTER>
-
-<FONT SIZE=3>
-
-<BR><BR>
- Libsndfile is a C library for reading and writing files containing sampled sound
- (such as MS Windows WAV and the Apple/SGI AIFF format) through one standard
- library interface. It is released in source code format under the
- <A HREF="http://www.gnu.org/copyleft/lesser.html">Gnu Lesser General Public License</A>.
-<BR><BR>
- The library was written to compile and run on a Linux system but should compile
- and run on just about any Unix. It can also be compiled and run on Win32 systems
- using the Microsoft compiler and MacOS using the Metrowerks compiler (thanks to
- Ben "Jacobs"). There are directions for compiling libsndfile on these platforms
- in the Win32 and MacOS directories of the source code distribution.
-<BR><BR>
- It was designed to handle both little-endian (such as WAV) and big-endian
- (such as AIFF) data, and to compile and run correctly on little-endian (such as Intel
- and DEC/Compaq Alpha) processor systems as well as big-endian processor systems such
- as Motorola 68k, Power PC, MIPS and Sparc. Hopefully the design of the library will
- also make it easy to extend for reading and writing new sound file formats.
-<BR><BR>
- It has so far been compiled and tested on the following systems:
- <UL>
- <LI>i586-pc-linux-gnu (Redhat 5.2 glibc)
- <LI>powerpc-unknown-linux-gnu (Linux PPC)
- <LI>mips-sgi-irix5.3 (Native IRIX toolset)
- <LI>sparc-sun-solaris2.7 (gcc)
- <LI>sparc-sun-solaris2.5.1 (gcc)
- <LI>mips-sgi-irix5.3 (gcc)
- <LI>mips-sgi-irix6.3 (cc - native compiler)
- <BR>
- <LI>Win32 (Microsoft Visual C++)
- <LI>MacOS 8.6 (Metrowerks Codewarrior Pro4)
- </UL>
-<BR>
-
-<A NAME="Capabilities">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>Capabilities</B></FONT>
-
-<BR><BR>
- libsndfile is currently capable of reading and writing the following sound file
- formats :
- <UL>
- <LI> Microsoft WAV 8, 16, 24 and 32 bit integer PCM.
- <LI> Microsoft 32 bit floating point PCM.
- <LI> Microsoft IMA/DVI ADPCM WAV format (16 bits per sample compressed to 4 bits per sample).
- <LI> Microsoft ADPCM WAV format (16 bits per sample compressed to 4 bits per sample).
- <LI> Microsoft 8 bit A-law an u-law formats (16 bits per sample compressed to 8 bits per sample).
- <LI> Microsoft WAV files using GSM 6.10 encoding.
- <LI> Apple/SGI AIFF and AIFC uncompressed 8, 16, 24 and 32 bit integer PCM.
- <LI> Sun/NeXT AU/SND format (big endian 8, 16, 24 and 32 bit PCM, 8 bit u-law and 8 bit A-law).
- <LI> Dec AU format (little endian 8, 16, 24 and 32 bit PCM, 8 bit u-law and 8 bit A-law).
- <LI> Headerless 8kHz 8bit u-law encoded AU/SND files.
- <LI> G721 and G723 ADPCM encoded AU/SND files.
- <LI> RAW header-less PCM files of 8 (signed and unsigned), 16, 24 and 32 bits. The 16, 24 and 32
- bit files may be big or little endian byte ordering. The 8 bit samples may be signed
- or unsigned values.
- <LI> Amiga uncompressed IFF / 8SVX / 16SV PCM files (8 and 16 bit).
- <LI> Ensoniq PARIS big and little endian, 16 and 24 bit PCM files (.PAF).
- </UL>
-<BR>
- Some of the file formats I am also interested in adding are:
- <UL>
- <LI> Soundfont II.
- <LI> Gravis Ultrasound patch files.
- <LI> Kurzweil K2000 sampler files.
- <LI> MPEG Layer 3.
- </UL>
-<BR>
- Other file formats may also be added on request.
-<BR><BR>
-
-<A NAME="History">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>History</B></FONT>
-
-<BR><BR>
- My first attempt at reading and writing WAV files was in 1990 or so under Windows
- 3.1. I started using Linux in early 1995 and contributed some code to the
- <A HREF="http://www.vaxxine.com/ve3wwg/gnuwave.html">wavplay</A>
- program which would eventually mutate into this library. As one of my interests
- is Digital Signal Processing (DSP) I decided that as well as reading data from an
- audio file in the native format (typically 16 bit short integers) it would also
- be useful to be able to have the library do the conversion to floating point numbers
- for DSP applications. It then dawned on me that whatever file format (anything from
- 8 bit unsigned chars, to 32 bit floating point numbers) the library should be able
- to convert the data to whatever format the library user wishes to use it in. For
- example, in a sound playback program, the library caller typically wants the sound
- data in 16 bit short integers to dump into a sound card even though the data in the
- file may be 32 bit floating point numbers (ie Microsoft's WAVE_FORMAT_IEEE_FLOAT
- format). Another example would be someone doing speech recognition research who has
- recorded some speech as a 16 bit WAV file but wants to process it as double precision
- floating point numbers.
-<BR><BR>
- Here is the release history for libsndfile :
- <UL>
- <LI>Version 0.0.8 (Feb 15 1999) First official release.
- <LI>Version 0.0.9 (Mar 14 1999) Added support for IMA ADPCM WAV files and
- 8 bit PCM AIFF, AU and WAV files.
- <LI>Version 0.0.12 (Jun 19 1999) Added <B>read only</B> support for MS ADPCM WAV files plus
- a number of bug fixes and code cleanups. It now also compiles and runs on Win32 systems
- using the Microsoft compiler (thanks to the efforts of Albert Faber).
- <LI>Version 0.0.15 (Jul 30 1999) Added ability to write MS ADPCM WAV files. Added WAV and AU
- file A-law and u-law encoding/decoding. Added RAW headerless PCM file handling. It now
- also compiles and runs on MacOS using the Metrowerks compiler (thanks to Ben "Jacobs").
- <LI>Version 0.0.16 (Jul 31 1999) Fixed minor MacOS problems.
- <LI>Version 0.0.17 (Nov 16 1999) Added Ensoniq PARIS audio file format, Amiga IFF / 8SVX / 16SV
- file format and minor bug fixes.
- <LI>Version 0.0.18 (Apr 25 2000) Added read/write capabilities for GSM 6.10 encoded WAV files.
- <LI>Version 0.0.19 (May 20 2000) Minor bug fix for GSM 6.10 encoded WAV files on big endian
- <LI>Version 0.0.20 (May 30 2000) Minor bug fix for LinuxPPC. Fixes endian-ness related compile
- <LI>Version 0.0.21 (Aug 16 2000) Added handling of headerless AU/SND files. Added handling
- of G721 and G723 ADPCM AU/SND files. New improved Win32 compiling and use instructions.
- License change from GPL to LGPL.
- <LI>Version 0.0.22 (Oct 17 2000) Bug fix for G723 encoded AU files. References to GPL replaced
- with LGPL.
- </UL>
-<BR>
-
-<A NAME="Similar">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>Similar or Related Projects</B></FONT>
-
-<BR><BR>
- <UL>
- <LI><A HREF="http://home.sprynet.com/~cbagwell/sox.html">SoX</A> is a program for
- converting between sound file formats.
- <LI><A HREF="http://members.home.com/ve3wwg/gnuwave.html">Wavplay</A> started out
- as a minimal WAV file player under Linux and has mutated into Gnuwave a client/server
- application for more general multimedia and games sound playback.
- <LI><A HREF="http://www.68k.org/~michael/audiofile/">Audiofile</A> (libaudiofile) is
- a library similar to libsndfile but with a different programming interface. The
- author Michael Pruett has set out to clone (and fix some bugs) the libaudiofile
- library which ships with SGI's IRIX OS. If I had known of this project earlier I
- may not have started on libsndfile.
- <LI><A HREF="ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz">sndlib.tar.gz</A> is
- another library written by Bill Schottstaedt of CCRMA.
- </UL>
-<BR>
-
-<A NAME="Licensing">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>Licensing</B></FONT>
-
-<BR><BR>
- libsndfile is released under the terms of the GNU Lesser General Public License. You may
- read the license
- <A HREF="http://www.gnu.org/copyleft/lesser.html">here</A>
- or read a simple explanation of the ideas behind the GPL and the LGPL
- <A HREF="http://www.gnu.org/copyleft/copyleft.html">here</A>.
-<BR><BR>
-
-<A NAME="Download">
-<FONT SIZE=+20 COLOR="#5050FF"><BR><B>Download</B></FONT>
-
-<BR><BR>
- Here is the latest version. It is available in the following formats.
- <UL>
- <LI>Source code as a .tar.gz :
- <A HREF="libsndfile-0.0.21.tar.gz">libsndfile-0.0.21.tar.gz</A>
- <LI>Source code as a Zip file :
- <A HREF="libsndfile-0_0_21.zip">libsndfile-0_0_21.zip</A>
- <LI>Linux source RPM :
- <A HREF="libsndfile-0.0.21-1.src.rpm">libsndfile-0.0.21-1.src.rpm</A>
- <LI>Linux i386 binary RPM :
- <A HREF="libsndfile-0.0.21-1.i386.rpm">libsndfile-0.0.21-1.i386.rpm</A>
- <LI>Linux i386 development RPM :
- <A HREF="libsndfile-devel-0.0.21-1.i386.rpm">libsndfile-devel-0.0.21-1.i386.rpm</A>
-
- </UL>
-<BR><BR>
-
-<HR>
-
-<BR>
- The latest version of this document can be found
- <A HREF="http://www.zip.com.au/~erikd/libsndfile/">here</A>.
-
-<P>
-Author :
- <A HREF="mailto:erikd@zip.com.au">Erik de Castro Lopo</a>
-<BR>
-
-</P>
-
-This page has been accessed
- <IMG SRC="/cgi-bin/counter?ft=6|frgb=55;55;55|tr=0|trgb=0;0;0|
- wxh=15;20|md=6|dd=B|st=1|sh=1|df=libsndfile.dat" HEIGHT=30 WIDTH=100>
-times.
-<! Oct 13, 2000 - 20000 hits>
-
-<BR><BR>
-<BR>
-
-</FONT>
-
-
-</BODY>
-</HTML>
binary files a/common/libsndfile/doc/libsndfile.jpg /dev/null differ
--- a/common/libsndfile/doc/sfinfo.html
+++ /dev/null
@@ -1,51 +1,0 @@
-<HTML>
-
-<HEAD>
- <TITLE>
- sfinfo
- </TITLE>
- <META NAME="Author" CONTENT="Erik de Castro Lopo (erikd@zip.com.au)">
-</HEAD>
-
-<BODY TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#9090FF" VLINK="#5050FF" ALINK="#FF00FF">
-
-<FONT SIZE=3>
-
-<BR>
- Here is an example of the output from the <B>sfinfo</B> program distributed with libsndfile.
-
-<BR><BR>
- This file was opened and parsed correctly but had been truncated so that the values
- in the <B>FORM</B> and <B>SSND</B> chunks were incorrect.
- <PRE>
- <B>erikd@hendrix ></B> examples/sfinfo truncated.aiff
- truncated.aiff
- size : 200000
- FORM : 307474 (should be 199992)
- AIFF
- COMM : 18
- Sample Rate : 16000
- Samples : 76857
- Channels : 2
- Sample Size : 16
- SSND : 307436 (should be 199946)
- Offset : 0
- Block Size : 0
-
- --------------------------------
- Sample Rate : 16000
- Samples : 76857
- Channels : 2
- Bit Width : 16
- Format : 0x00020001
- Sections : 1
- Seekable : TRUE
- Signal Max : 32766
-
- </PRE>
-
-</FONT>
-
-
-</BODY>
-</HTML>
--- a/common/libsndfile/examples/Makefile.am
+++ /dev/null
@@ -1,22 +1,0 @@
-noinst_PROGRAMS = sfconvert sndfile2oct wav32_aiff24 make_sine sfinfo sfhexdump
-
-SNDFILEDIR =../src
-INCLUDES = -I$(srcdir)/$(SNDFILEDIR)
-
-sfconvert_SOURCES = sfconvert.c
-sfconvert_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-sndfile2oct_SOURCES = sndfile2oct.c
-sndfile2oct_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-wav32_aiff24_SOURCES = wav32_aiff24.c
-wav32_aiff24_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-make_sine_SOURCES = make_sine.c
-make_sine_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-sfinfo_SOURCES = sfinfo.c
-sfinfo_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-sfhexdump_SOURCES = sfhexdump.c
-sfhexdump_LDADD = $(SNDFILEDIR)/libsndfile.la
--- a/common/libsndfile/examples/Makefile.in
+++ /dev/null
@@ -1,356 +1,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 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.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_alias = @build_alias@
-build_triplet = @build@
-host_alias = @host_alias@
-host_triplet = @host@
-target_alias = @target_alias@
-target_triplet = @target@
-AS = @AS@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LD = @LD@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-NM = @NM@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
-VERSION = @VERSION@
-subdirs = @subdirs@
-
-noinst_PROGRAMS = sfconvert sndfile2oct wav32_aiff24 make_sine sfinfo sfhexdump
-
-SNDFILEDIR = ../src
-INCLUDES = -I$(srcdir)/$(SNDFILEDIR)
-
-sfconvert_SOURCES = sfconvert.c
-sfconvert_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-sndfile2oct_SOURCES = sndfile2oct.c
-sndfile2oct_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-wav32_aiff24_SOURCES = wav32_aiff24.c
-wav32_aiff24_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-make_sine_SOURCES = make_sine.c
-make_sine_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-sfinfo_SOURCES = sfinfo.c
-sfinfo_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-sfhexdump_SOURCES = sfhexdump.c
-sfhexdump_LDADD = $(SNDFILEDIR)/libsndfile.la
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../src/config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../src
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-sfconvert_OBJECTS = sfconvert.o
-sfconvert_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sfconvert_LDFLAGS =
-sndfile2oct_OBJECTS = sndfile2oct.o
-sndfile2oct_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sndfile2oct_LDFLAGS =
-wav32_aiff24_OBJECTS = wav32_aiff24.o
-wav32_aiff24_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-wav32_aiff24_LDFLAGS =
-make_sine_OBJECTS = make_sine.o
-make_sine_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-make_sine_LDFLAGS =
-sfinfo_OBJECTS = sfinfo.o
-sfinfo_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sfinfo_LDFLAGS =
-sfhexdump_OBJECTS = sfhexdump.o
-sfhexdump_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sfhexdump_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-SOURCES = $(sfconvert_SOURCES) $(sndfile2oct_SOURCES) $(wav32_aiff24_SOURCES) $(make_sine_SOURCES) $(sfinfo_SOURCES) $(sfhexdump_SOURCES)
-OBJECTS = $(sfconvert_OBJECTS) $(sndfile2oct_OBJECTS) $(wav32_aiff24_OBJECTS) $(make_sine_OBJECTS) $(sfinfo_OBJECTS) $(sfhexdump_OBJECTS)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps examples/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-noinstPROGRAMS:
-
-clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.c.o:
- $(COMPILE) -c $<
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-sfconvert: $(sfconvert_OBJECTS) $(sfconvert_DEPENDENCIES)
- @rm -f sfconvert
- $(LINK) $(sfconvert_LDFLAGS) $(sfconvert_OBJECTS) $(sfconvert_LDADD) $(LIBS)
-
-sndfile2oct: $(sndfile2oct_OBJECTS) $(sndfile2oct_DEPENDENCIES)
- @rm -f sndfile2oct
- $(LINK) $(sndfile2oct_LDFLAGS) $(sndfile2oct_OBJECTS) $(sndfile2oct_LDADD) $(LIBS)
-
-wav32_aiff24: $(wav32_aiff24_OBJECTS) $(wav32_aiff24_DEPENDENCIES)
- @rm -f wav32_aiff24
- $(LINK) $(wav32_aiff24_LDFLAGS) $(wav32_aiff24_OBJECTS) $(wav32_aiff24_LDADD) $(LIBS)
-
-make_sine: $(make_sine_OBJECTS) $(make_sine_DEPENDENCIES)
- @rm -f make_sine
- $(LINK) $(make_sine_LDFLAGS) $(make_sine_OBJECTS) $(make_sine_LDADD) $(LIBS)
-
-sfinfo: $(sfinfo_OBJECTS) $(sfinfo_DEPENDENCIES)
- @rm -f sfinfo
- $(LINK) $(sfinfo_LDFLAGS) $(sfinfo_OBJECTS) $(sfinfo_LDADD) $(LIBS)
-
-sfhexdump: $(sfhexdump_OBJECTS) $(sfhexdump_DEPENDENCIES)
- @rm -f sfhexdump
- $(LINK) $(sfhexdump_LDFLAGS) $(sfhexdump_OBJECTS) $(sfhexdump_LDADD) $(LIBS)
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = examples
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-make_sine.o: make_sine.c ../src/sndfile.h
-sfconvert.o: sfconvert.c ../src/sndfile.h
-sfhexdump.o: sfhexdump.c ../src/sndfile.h
-sfinfo.o: sfinfo.c ../src/sndfile.h
-sndfile2oct.o: sndfile2oct.c ../src/sndfile.h
-wav32_aiff24.o: wav32_aiff24.c ../src/sndfile.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-# 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.
-.NOEXPORT:
--- a/common/libsndfile/examples/make_sine.c
+++ /dev/null
@@ -1,58 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <math.h>
-
-#include <sndfile.h>
-
-#define SINE_LENGTH (4096)
-
-#ifndef M_PI
- #define M_PI 3.14159
-#endif
-
-int main (void)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k ;
- double val ;
-
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- sfinfo.samplerate = 8000 ;
- sfinfo.samples = SINE_LENGTH ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.channels = 1 ;
- sfinfo.format = (SF_FORMAT_SVX | SF_FORMAT_PCM) ;
-
- if (! (file = sf_open_write ("sine.svx", &sfinfo)))
- { printf ("Error : Not able to open output file.\n") ;
- return 1 ;
- } ;
-
- for (k = 0 ; k < SINE_LENGTH ; k++)
- { val = 32000 * sin (2.0 * M_PI * ((double) k) / ((double) SINE_LENGTH)) ;
- if (sf_write_double (file, &val, 1, 0) != 1)
- sf_perror (file) ;
- } ;
-
- sf_close (file) ;
- return 0 ;
-} /* main */
--- a/common/libsndfile/examples/sfconvert.c
+++ /dev/null
@@ -1,196 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <sndfile.h>
-
-#define BUFFER_LEN 1024
-
-
-typedef struct
-{ char *infilename, *outfilename ;
- SF_INFO infileinfo, outfileinfo ;
-} OptionData ;
-
-static
-void copy_data (SNDFILE *outfile, SNDFILE *infile, unsigned int len, double normfactor)
-{ static double data [BUFFER_LEN] ;
- unsigned int readcount, k ;
-
- readcount = len ;
- while (readcount == len)
- { readcount = sf_read_double (infile, data, len, 0) ;
- for (k = 0 ; k < readcount ; k++)
- data [k] *= normfactor ;
- sf_write_double (outfile, data, readcount, 0) ;
- } ;
-
- return ;
-} /* copy_data */
-
-static
-int guess_output_file_type (char *str, unsigned int format)
-{ char buffer [16], *cptr ;
- int k ;
-
- format &= SF_FORMAT_SUBMASK ;
-
- if (! (cptr = strrchr (str, '.')))
- return 0 ;
-
- strncpy (buffer, cptr + 1, 15) ;
- buffer [15] = 0 ;
-
- for (k = 0 ; buffer [k] ; k++)
- buffer [k] = tolower ((buffer [k])) ;
-
- if (! strncmp (buffer, "aif", 3))
- return (SF_FORMAT_AIFF | format) ;
- if (! strcmp (buffer, "wav"))
- return (SF_FORMAT_WAV | format) ;
- if (! strcmp (buffer, "au") || ! strcmp (buffer, "snd"))
- return (SF_FORMAT_AU | format) ;
- return 0 ;
-} /* guess_output_file_type */
-
-
-static
-void print_usage (char *progname)
-{ printf ("\nUsage : %s [options] <input file> <output file>\n", progname) ;
- printf ("\n where [options] may be one of the following:\n") ;
- printf (" -pcm16 : force the output to 16 bit pcm\n") ;
- printf (" -pcm24 : force the output to 24 bit pcm\n") ;
- printf (" -pcm32 : force the output to 32 bit pcm\n") ;
- printf ("\n with one of the following extra specifiers:\n") ;
- printf (" -fullscale : force the output signal to the full bit width\n") ;
- printf ("\n") ;
-} /* print_usage */
-
-int main (int argc, char *argv[])
-{ char *progname, *infilename, *outfilename ;
- SNDFILE *infile, *outfile ;
- SF_INFO sfinfo ;
- int k, outfilemajor ;
- int outfileminor = 0, outfilebits = 0, fullscale = 0 ;
- double normfactor ;
-
- progname = strrchr (argv [0], '/') ;
- progname = progname ? progname + 1 : argv [0] ;
-
- if (argc < 3 || argc > 5)
- { print_usage (progname) ;
- return 1 ;
- } ;
-
- infilename = argv [argc-2] ;
- outfilename = argv [argc-1] ;
-
- if (! strcmp (infilename, outfilename))
- { printf ("Error : Input and output filenames are the same.\n\n") ;
- print_usage (progname) ;
- return 1 ;
- } ;
-
- if (infilename [0] == '-')
- { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ;
- print_usage (progname) ;
- return 1 ;
- } ;
-
- if (outfilename [0] == '-')
- { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ;
- print_usage (progname) ;
- return 1 ;
- } ;
-
- for (k = 1 ; k < argc - 2 ; k++)
- { printf ("%s\n", argv [k]) ;
- if (! strcmp (argv [k], "-pcm16"))
- { outfileminor = SF_FORMAT_PCM ;
- outfilebits = 16 ;
- continue ;
- } ;
- if (! strcmp (argv [k], "-pcm24"))
- { outfileminor = SF_FORMAT_PCM ;
- outfilebits = 24 ;
- continue ;
- } ;
- if (! strcmp (argv [k], "-pcm32"))
- { outfileminor = SF_FORMAT_PCM ;
- outfilebits = 32 ;
- continue ;
- } ;
- if (! strcmp (argv [k], "-fullscale"))
- fullscale = 1 ;
- } ;
-
-
- if (! (infile = sf_open_read (infilename, &sfinfo)))
- { printf ("Not able to open input file %s.\n", infilename) ;
- sf_perror (NULL) ;
- return 1 ;
- } ;
-
- if (! (sfinfo.format = guess_output_file_type (outfilename, sfinfo.format)))
- { printf ("Error : Not able to determine output file type for %s.\n", outfilename) ;
- return 1 ;
- } ;
-
- outfilemajor = sfinfo.format & SF_FORMAT_TYPEMASK ;
-
- if (outfileminor)
- { sfinfo.format = outfilemajor | outfileminor ;
- printf ("asdasdasdad\n") ;
- }
- else
- sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ;
-
- if (outfilebits)
- sfinfo.pcmbitwidth = outfilebits ;
-
- if (! sf_format_check (&sfinfo))
- { printf ("Error : output file format is invalid (0x%08X).\n", sfinfo.format) ;
- return 1 ;
- } ;
-
- normfactor = sf_signal_max (infile) ;
- if (normfactor < 1.0 && normfactor > 0.0)
- normfactor = fullscale ? 2.0 / normfactor * ((double) (1 << (sfinfo.pcmbitwidth - 2))) :
- 2.0 * ((double) (1 << (sfinfo.pcmbitwidth - 2))) ;
- else
- normfactor = 1.0 ;
-
- printf ("normfactor : %g\n", normfactor) ;
-
- if (! (outfile = sf_open_write (outfilename, &sfinfo)))
- { printf ("Not able to open output file %s.\n", outfilename) ;
- return 1 ;
- } ;
-
- copy_data (outfile, infile, BUFFER_LEN / sfinfo.channels, normfactor) ;
-
- sf_close (infile) ;
- sf_close (outfile) ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/examples/sfhexdump.c
+++ /dev/null
@@ -1,78 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <sndfile.h>
-
-#define BUFFER_LEN 4096
-
-static
-void print_usage (char *progname)
-{ printf ("\nUsage : %s <file>\n", progname) ;
- printf ("\n") ;
-} /* print_usage */
-
-int main (int argc, char *argv[])
-{ static char strbuffer [BUFFER_LEN] ;
- unsigned int linecount ;
- char *progname, *infilename ;
- SNDFILE *infile ;
- SF_INFO sfinfo ;
- int k, start, readcount ;
-
- progname = strrchr (argv [0], '/') ;
- progname = progname ? progname + 1 : argv [0] ;
-
- if (argc != 2)
- { print_usage (progname) ;
- return 1 ;
- } ;
-
- infilename = argv [1] ;
-
- if (! (infile = sf_open_read (infilename, &sfinfo)))
- { printf ("Error : Not able to open input file %s.\n", infilename) ;
- sf_perror (NULL) ;
- sf_get_header_info (NULL, strbuffer, BUFFER_LEN, 0) ;
- printf (strbuffer) ;
- return 1 ;
- } ;
-
- start = 0 ;
-
- linecount = 24 ;
-
- while ((readcount = sf_read_raw (infile, strbuffer, linecount)))
- { printf ("%08X: ", start) ;
- for (k = 0 ; k < readcount ; k++)
- printf ("%02X ", strbuffer [k] & 0xFF) ;
- for (k = readcount ; k < 16 ; k++)
- printf (" ") ;
- printf ("\n") ;
- start += readcount ;
- } ;
-
- sf_close (infile) ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/examples/sfinfo.c
+++ /dev/null
@@ -1,84 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <sndfile.h>
-
-#define BUFFER_LEN 4096
-
-static
-void print_usage (char *progname)
-{ char buffer [256] ;
-
- sf_get_lib_version (buffer, 256) ;
- printf ("libsndfile version : %s\n\n", buffer) ;
- printf ("\nUsage : %s <file>\n", progname) ;
- printf ("\n Prints out information about a sound file.\n") ;
- printf ("\n") ;
-} /* print_usage */
-
-int main (int argc, char *argv[])
-{ static char strbuffer [BUFFER_LEN] ;
- char *progname, *infilename ;
- SNDFILE *infile ;
- SF_INFO sfinfo ;
- int k ;
-
- progname = strrchr (argv [0], '/') ;
- progname = progname ? progname + 1 : argv [0] ;
-
- if (argc < 2)
- { print_usage (progname) ;
- return 1 ;
- } ;
-
- for (k = 1 ; k < argc ; k++)
- { infilename = argv [k] ;
-
- infile = sf_open_read (infilename, &sfinfo) ;
-
- sf_get_header_info (infile, strbuffer, BUFFER_LEN, 0) ;
- puts (strbuffer) ;
-
- printf ("--------------------------------\n") ;
-
- if (infile)
- { printf ("Sample Rate : %d\n", sfinfo.samplerate) ;
- printf ("Samples : %d\n", sfinfo.samples) ;
- printf ("Channels : %d\n", sfinfo.channels) ;
- printf ("Bit Width : %d\n", sfinfo.pcmbitwidth) ;
- printf ("Format : 0x%08X\n", sfinfo.format) ;
- printf ("Sections : %d\n", sfinfo.sections) ;
- printf ("Seekable : %s\n", (sfinfo.seekable ? "TRUE" : "FALSE")) ;
- printf ("Signal Max : %g\n", sf_signal_max (infile)) ;
- }
- else
- { printf ("Error : Not able to open input file %s.\n", infilename) ;
- sf_perror (NULL) ;
- } ;
-
- sf_close (infile) ;
- } ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/examples/sndfile2oct.c
+++ /dev/null
@@ -1,95 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <sndfile.h>
-
-#define BUFFER_LEN 400
-
-
-int main (int argc, char *argv[])
-{ static double data [BUFFER_LEN] ;
- char *progname, *infilename, *outfilename, *cptr ;
- SNDFILE *infile ;
- SF_INFO sfinfo ;
- FILE *outfile ;
- unsigned int k, readcount, len, total ;
-
- progname = strrchr (argv [0], '/') ;
- progname = progname ? progname + 1 : argv [0] ;
-
- if (argc != 3)
- { printf ("\n Usage : %s <input file> <output file>\n\n", progname) ;
- return 1 ;
- } ;
-
- infilename = argv [1] ;
- outfilename = argv [2] ;
-
- if (! strcmp (infilename, outfilename))
- { printf ("Error : Input and output filename are the same.\n") ;
- return 1 ;
- } ;
-
- if (! (infile = sf_open_read (infilename, &sfinfo)))
- { printf ("Not able to open input file %s.\n", infilename) ;
- sf_perror (NULL) ;
- return 1 ;
- } ;
-
- if (! (outfile = fopen (outfilename, "w")))
- { printf ("Not able to open output file %s.\n", outfilename) ;
- sf_perror (NULL) ;
- return 1 ;
- } ;
-
- outfilename = strrchr (argv [2], '/') ;
- outfilename = outfilename ? outfilename + 1 : argv [2] ;
- if ((cptr = strchr (outfilename, '.')))
- *cptr = 0 ;
-
- fprintf (outfile, "# name: %s\n", outfilename) ;
- fprintf (outfile, "# type: matrix\n") ;
- fprintf (outfile, "# rows: %d\n", sfinfo.samples) ;
- fprintf (outfile, "# columns: %d", sfinfo.channels) ;
-
- len = BUFFER_LEN - (BUFFER_LEN % sfinfo.channels) ;
- total = 0 ;
- while ((readcount = sf_read_double (infile, data, len, 0)))
- {
- for (k = 0 ; k < readcount ; k++)
- { if (! (k % sfinfo.channels))
- fprintf (outfile, "\n") ;
- fprintf (outfile, "%g ", data [k]) ;
- } ;
- memset (data, 0, len * sizeof (double)) ;
- total += readcount ;
- } ;
- if (total != sfinfo.samples * sfinfo.channels)
- printf ("Error : Values read (%d) != samples * channels (%d)\n", total, sfinfo.samples * sfinfo.channels) ;
-
- fclose (outfile) ;
- sf_close (infile) ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/examples/wav32_aiff24.c
+++ /dev/null
@@ -1,109 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <sndfile.h>
-
-#define BUFFER_LEN 1024
-
-static double data [BUFFER_LEN] ;
-
-static
-void copy_data (SNDFILE *outfile, SNDFILE *infile, unsigned int len, double normfactor)
-{ unsigned int readcount, k ;
-
- readcount = len ;
- while (readcount == len)
- { readcount = sf_read_double (infile, data, len, 0) ;
- for (k = 0 ; k < readcount ; k++)
- data [k] *= normfactor ;
- sf_write_double (outfile, data, readcount, 0) ;
- } ;
-
- return ;
-} /* copy_data */
-
-static
-void print_usage (char *progname)
-{
- printf ("\nConverts a 32 bit floating point WAV file into a 24 bit PCM AIFF file.\n") ;
- printf (" Usage : %s <input file> <output file>\n\n", progname) ;
-} /* print_usage */
-
-int main (int argc, char *argv[])
-{ char *progname, *infilename, *outfilename ;
- SNDFILE *infile, *outfile ;
- SF_INFO sfinfo ;
- double normfactor ;
-
- progname = strrchr (argv [0], '/') ;
- progname = progname ? progname + 1 : argv [0] ;
-
- if (argc != 3)
- { print_usage (progname) ;
- return 1 ;
- } ;
-
- infilename = argv [1] ;
- outfilename = argv [2] ;
-
- if (! strcmp (infilename, outfilename))
- { printf ("Error : Input and output filenames are the same.\n\n") ;
- print_usage (progname) ;
- return 1 ;
- } ;
-
- if (! (infile = sf_open_read (infilename, &sfinfo)))
- { printf ("Not able to open input file %s.\n", infilename) ;
- sf_perror (NULL) ;
- return 1 ;
- } ;
-
- if (sfinfo.format != (SF_FORMAT_WAV | SF_FORMAT_FLOAT))
- { printf ("Error : Input file %s is not a 32 bit floating point WAV file.\n", infilename) ;
- return 1 ;
- } ;
-
- sfinfo.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM) ;
- sfinfo.pcmbitwidth = 24 ;
-
- normfactor = sf_signal_max (infile) ;
- if (normfactor < 1.0 && normfactor > 0.0)
- normfactor = ((double) 0x400000) ;
- else
- normfactor = 1.0 ;
-
- printf ("normfactor : %g\n", normfactor) ;
-
- if (! (outfile = sf_open_write (outfilename, &sfinfo)))
- { printf ("Not able to open output file %s.\n", outfilename) ;
- return 1 ;
- } ;
-
- copy_data (outfile, infile, BUFFER_LEN / sfinfo.channels, normfactor) ;
-
- sf_close (infile) ;
- sf_close (outfile) ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/libsndfile.spec
+++ b/common/libsndfile/libsndfile.spec
@@ -1,6 +1,6 @@
%define name libsndfile
-%define version 0.0.22
+%define version 0.0.27
%define release 1
%define prefix /usr
--- a/common/libsndfile/ltconfig
+++ b/common/libsndfile/ltconfig
@@ -53,7 +53,7 @@
# Find the correct PATH separator. Usually this is `:', but
# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != "Xset"; then
+if test "X${PATH_SEPARATOR+set}" != Xset; then
UNAME=${UNAME-`uname 2>/dev/null`}
case X$UNAME in
*-DOS) PATH_SEPARATOR=';' ;;
@@ -63,9 +63,9 @@
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
-if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-if test "X${echo_test_string+set}" != "Xset"; then
+if test "X${echo_test_string+set}" != Xset; then
# find a string as large as possible, as long as the shell can cope with it
for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
# expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
@@ -169,10 +169,10 @@
# Constants:
PROGRAM=ltconfig
PACKAGE=libtool
-VERSION=1.3.3
-TIMESTAMP=" (1.385.2.181 1999/07/02 15:49:11)"
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5'
+VERSION=1.3.5
+TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
rm="rm -f"
help="Try \`$progname --help' for more information."
@@ -369,8 +369,8 @@
# Only set LANG and LC_ALL to C if already set.
# These must not be set unconditionally because not all systems understand
# e.g. LANG=C (notably SCO).
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi
+if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi
if test -n "$cache_file" && test -r "$cache_file"; then
echo "loading cache $cache_file within ltconfig"
@@ -462,7 +462,7 @@
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
- if test "${COLLECT_NAMES+set}" != set; then
+ if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -663,7 +663,7 @@
link_static_flag='-static'
case "$host_os" in
- beos* | irix5* | irix6* | osf3* | osf4*)
+ beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
aix*)
@@ -718,7 +718,7 @@
# We can build DLLs from non-PIC.
;;
- osf3* | osf4*)
+ osf3* | osf4* | osf5*)
# All OSF/1 code is PIC.
wl='-Wl,'
link_static_flag='-non_shared'
@@ -1164,15 +1164,21 @@
# Extract the symbol export list from an `--export-all' def file,
# then regenerate the def file from the symbol export list, so that
# the compiled dll only exports the symbol export list.
+ # Be careful not to strip the DATA tag left by newer dlltools.
export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
$DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~
- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols'
+ sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols'
+ # If DATA tags from a recent dlltool are present, honour them!
archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
_lt_hint=1;
- for symbol in `cat $export_symbols`; do
- echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def;
+ cat $export_symbols | while read symbol; do
+ set dummy \$symbol;
+ case \$# in
+ 2) echo " \$2 @ \$_lt_hint ; " >> $objdir/$soname-def;;
+ *) echo " \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;;
+ esac;
_lt_hint=`expr 1 + \$_lt_hint`;
done~
test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
@@ -1187,7 +1193,7 @@
;;
netbsd*)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
@@ -1196,7 +1202,7 @@
fi
;;
- solaris*)
+ solaris* | sysv5*)
if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
ld_shlibs=no
cat <<EOF 1>&2
@@ -1244,7 +1250,12 @@
whole_archive_flag_spec=
;;
*)
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
;;
esac
fi
@@ -1405,7 +1416,7 @@
old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
;;
- osf3* | osf4*)
+ osf3*)
if test "$with_gcc" = yes; then
allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
@@ -1417,6 +1428,24 @@
hardcode_libdir_separator=:
;;
+ osf4* | osf5*) # As osf3* with the addition of the -msym flag
+ if test "$with_gcc" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ rhapsody*)
+ archive_cmds='$CC -bundle -undefined suppress -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flags_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
sco3.2v5*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
hardcode_shlibpath_var=no
@@ -1449,7 +1478,13 @@
;;
sysv4)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $linkopts'
+ else
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ fi
runpath_var='LD_RUN_PATH'
hardcode_shlibpath_var=no
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
@@ -1461,6 +1496,18 @@
export_dynamic_flag_spec='-Bexport'
;;
+ sysv5*)
+ no_undefined_flag=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+ hardcode_libdir_flag_spec=
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
uts4*)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
hardcode_libdir_flag_spec='-L$libdir'
@@ -1474,16 +1521,30 @@
;;
sysv4*MP*)
- if test -d /usr/nec ;then
- # archive_cmds='$LD -G -z text -h $soname -o $lib$libobjs$deplibs'
- archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs'
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'
+ hardcode_direct=yes
+ hardcode_minus_L=no
hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
+ runpath_var=LD_RUN_PATH
;;
+ unixware7*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
*)
ld_shlibs=no
;;
@@ -1589,11 +1650,11 @@
main(){nm_test_var='a';nm_test_func();return(0);}
EOF
- echo "$progname:1592: checking if global_symbol_pipe works" >&5
- if { (eval echo $progname:1593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
+ echo "$progname:1653: checking if global_symbol_pipe works" >&5
+ if { (eval echo $progname:1654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
# Now try to grab the symbols.
nlist=conftest.nm
- if { echo "$progname:1596: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+ if { echo "$progname:1657: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
@@ -1645,7 +1706,7 @@
save_CFLAGS="$CFLAGS"
LIBS="conftstm.$objext"
CFLAGS="$CFLAGS$no_builtin_flag"
- if { (eval echo $progname:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ if { (eval echo $progname:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
pipe_works=yes
else
echo "$progname: failed program was:" >&5
@@ -1787,8 +1848,9 @@
bsdi4*)
version_type=linux
- library_names_spec='${libname}.so$major ${libname}.so'
- soname_spec='${libname}.so'
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
@@ -1796,6 +1858,7 @@
file_magic_test_file=/shlib/libc.so
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ export_dynamic_flag_spec=-rdynamic
# the default ld.so.conf also contains /usr/contrib/lib and
# /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
# libtool to hard-code these into programs
@@ -1841,10 +1904,9 @@
need_version=yes
;;
esac
- finish_cmds='PATH="\$PATH:/sbin" OBJFORMAT="'"$objformat"'" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH
case "$host_os" in
- freebsd2* | freebsd3.[01]*)
+ freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)
shlibpath_overrides_runpath=yes
;;
*) # from 3.2 on
@@ -1875,6 +1937,14 @@
soname_spec='${libname}${release}.sl$major'
# HP-UX runs *really* slowly unless shared libraries are mode 555.
postinstall_cmds='chmod 555 $lib'
+ case "$host_os" in
+ hpux10.20*)
+ # TODO: Does this work for hpux-11 too?
+ deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
;;
irix5* | irix6*)
@@ -1896,8 +1966,6 @@
*-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
*) libsuff= shlibsuff= libmagic=never-match;;
esac
- # this will be overridden with pass_all, but let us keep it just in case
- deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
;;
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
@@ -1924,9 +1992,7 @@
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ deplibs_check_method=pass_all
if test -f /lib/ld.so.1; then
dynamic_linker='GNU ld.so'
@@ -1972,7 +2038,7 @@
shlibpath_var=LIBPATH
;;
-osf3* | osf4*)
+osf3* | osf4* | osf5*)
version_type=osf
need_version=no
soname_spec='${libname}${release}.so'
@@ -1987,6 +2053,14 @@
sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
;;
+rhapsody*)
+ version_type=sunos
+ library_names_spec='${libname}.so'
+ soname_spec='${libname}.so'
+ shlibpath_var=DYLD_LIBRARY_PATH
+ deplibs_check_method=pass_all
+ ;;
+
sco3.2v5*)
version_type=osf
soname_spec='${libname}${release}.so$major'
@@ -2027,6 +2101,10 @@
soname_spec='${libname}${release}.so$major'
shlibpath_var=LD_LIBRARY_PATH
case "$host_vendor" in
+ sequent)
+ file_magic_cmd='/bin/file'
+ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
ncr)
deplibs_check_method='pass_all'
;;
@@ -2167,7 +2245,7 @@
if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
lt_cv_dlopen=no lt_cv_dlopen_libs=
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "$progname:2170: checking for dlopen in -ldl" >&5
+echo "$progname:2248: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2175,10 +2253,13 @@
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2178 "ltconfig"
+#line 2256 "ltconfig"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
char dlopen();
int main() {
@@ -2185,7 +2266,7 @@
dlopen()
; return 0; }
EOF
-if { (eval echo $progname:2188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo $progname:2269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2204,12 +2285,12 @@
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for dlopen""... $ac_c" 1>&6
-echo "$progname:2207: checking for dlopen" >&5
+echo "$progname:2288: checking for dlopen" >&5
if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2212 "ltconfig"
+#line 2293 "ltconfig"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char dlopen(); below. */
#include <assert.h>
@@ -2216,6 +2297,9 @@
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
char dlopen();
int main() {
@@ -2231,7 +2315,7 @@
; return 0; }
EOF
-if { (eval echo $progname:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo $progname:2318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_dlopen=yes"
else
@@ -2248,7 +2332,7 @@
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
-echo "$progname:2251: checking for dld_link in -ldld" >&5
+echo "$progname:2335: checking for dld_link in -ldld" >&5
ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2256,10 +2340,13 @@
ac_save_LIBS="$LIBS"
LIBS="-ldld $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2259 "ltconfig"
+#line 2343 "ltconfig"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
char dld_link();
int main() {
@@ -2266,7 +2353,7 @@
dld_link()
; return 0; }
EOF
-if { (eval echo $progname:2269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo $progname:2356: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2285,12 +2372,12 @@
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for shl_load""... $ac_c" 1>&6
-echo "$progname:2288: checking for shl_load" >&5
+echo "$progname:2375: checking for shl_load" >&5
if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2293 "ltconfig"
+#line 2380 "ltconfig"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shl_load(); below. */
#include <assert.h>
@@ -2297,6 +2384,9 @@
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
char shl_load();
int main() {
@@ -2312,7 +2402,7 @@
; return 0; }
EOF
-if { (eval echo $progname:2315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo $progname:2405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shl_load=yes"
else
@@ -2330,7 +2420,7 @@
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "$progname:2333: checking for shl_load in -ldld" >&5
+echo "$progname:2423: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2338,11 +2428,14 @@
ac_save_LIBS="$LIBS"
LIBS="-ldld $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2341 "ltconfig"
+#line 2431 "ltconfig"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
char shl_load();
int main() {
@@ -2349,7 +2442,7 @@
shl_load()
; return 0; }
EOF
-if { (eval echo $progname:2352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo $progname:2445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2392,17 +2485,17 @@
for ac_hdr in dlfcn.h; do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "$progname:2395: checking for $ac_hdr" >&5
+echo "$progname:2488: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2400 "ltconfig"
+#line 2493 "ltconfig"
#include <$ac_hdr>
int fnord = 0;
EOF
-ac_try="$ac_compile conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo $progname:2405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_try="$ac_compile >/dev/null 2>conftest.out"
+{ (eval echo $progname:2498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2430,7 +2523,7 @@
LIBS="$lt_cv_dlopen_libs $LIBS"
echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2433: checking whether a program can dlopen itself" >&5
+echo "$progname:2526: checking whether a program can dlopen itself" >&5
if test "${lt_cv_dlopen_self+set}" = set; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2438,7 +2531,7 @@
lt_cv_dlopen_self=cross
else
cat > conftest.c <<EOF
-#line 2441 "ltconfig"
+#line 2534 "ltconfig"
#if HAVE_DLFCN_H
#include <dlfcn.h>
@@ -2484,7 +2577,7 @@
if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
EOF
-if { (eval echo $progname:2487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo $progname:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then
lt_cv_dlopen_self=yes
else
@@ -2503,7 +2596,7 @@
if test "$lt_cv_dlopen_self" = yes; then
LDFLAGS="$LDFLAGS $link_static_flag"
echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2506: checking whether a statically linked program can dlopen itself" >&5
+echo "$progname:2599: checking whether a statically linked program can dlopen itself" >&5
if test "${lt_cv_dlopen_self_static+set}" = set; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2511,7 +2604,7 @@
lt_cv_dlopen_self_static=cross
else
cat > conftest.c <<EOF
-#line 2514 "ltconfig"
+#line 2607 "ltconfig"
#if HAVE_DLFCN_H
#include <dlfcn.h>
@@ -2557,7 +2650,7 @@
if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
EOF
-if { (eval echo $progname:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo $progname:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then
lt_cv_dlopen_self_static=yes
else
@@ -2649,7 +2742,7 @@
# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
#
# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 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
@@ -2675,7 +2768,7 @@
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
-if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
### BEGIN LIBTOOL CONFIG
EOF
@@ -2938,7 +3031,7 @@
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
-if test "${COLLECT_NAMES+set}" != set; then
+if test "X${COLLECT_NAMES+set}" != Xset; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -2948,6 +3041,10 @@
# Append the ltmain.sh script.
sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
chmod +x "$ofile"
;;
--- a/common/libsndfile/ltmain.sh
+++ b/common/libsndfile/ltmain.sh
@@ -54,8 +54,8 @@
# Constants.
PROGRAM=ltmain.sh
PACKAGE=libtool
-VERSION=1.3.3
-TIMESTAMP=" (1.385.2.181 1999/07/02 15:49:11)"
+VERSION=1.3.5
+TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
default_mode=
help="Try \`$progname --help' for more information."
@@ -435,7 +435,7 @@
fbsd_hideous_sh_bug=$base_compile
# All platforms use -DPIC, to notify preprocessed assembler code.
- command="$base_compile $pic_flag -DPIC $srcfile"
+ command="$base_compile $srcfile $pic_flag -DPIC"
if test "$build_old_libs" = yes; then
lo_libobj="$libobj"
dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
@@ -521,9 +521,17 @@
exit $error
fi
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+ libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
# Now arrange that obj and lo_libobj become the same file
- $show "$LN_S $obj $lo_libobj"
- if $run $LN_S $obj $lo_libobj; then
+ $show "(cd $xdir && $LN_S $baseobj $libobj)"
+ if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
exit 0
else
error=$?
@@ -613,8 +621,6 @@
# libtool link mode
link)
modename="$modename: link"
- C_compiler="$CC" # save it, to compile generated C sources
- CC="$nonopt"
case "$host" in
*-*-cygwin* | *-*-mingw* | *-*-os2*)
# It is impossible to link a dll without this setting, and
@@ -802,8 +808,8 @@
allow_undefined=yes
;;
esac
- compile_command="$CC"
- finalize_command="$CC"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
compile_rpath=
finalize_rpath=
@@ -1789,6 +1795,10 @@
*-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
# these systems don't actually have a c library (as such)!
;;
+ *-*-rhapsody*)
+ # rhapsody is a little odd...
+ deplibs="$deplibs -framework System"
+ ;;
*)
# Add libc to deplibs on all other systems.
deplibs="$deplibs -lc"
@@ -1851,7 +1861,7 @@
int main() { return 0; }
EOF
$rm conftest
- $C_compiler -o conftest conftest.c $deplibs
+ $CC -o conftest conftest.c $deplibs
if test $? -eq 0 ; then
ldd_output=`ldd conftest`
for i in $deplibs; do
@@ -1884,7 +1894,7 @@
# If $name is empty we are operating on a -L argument.
if test "$name" != "" ; then
$rm conftest
- $C_compiler -o conftest conftest.c $i
+ $CC -o conftest conftest.c $i
# Did it work?
if test $? -eq 0 ; then
ldd_output=`ldd conftest`
@@ -2047,13 +2057,20 @@
done
# Ensure that we have .o objects for linkers which dislike .lo
- # (e.g. aix) incase we are running --disable-static
+ # (e.g. aix) in case we are running --disable-static
for obj in $libobjs; do
- oldobj=`$echo "X$obj" | $Xsed -e "$lo2o"`
- if test ! -f $oldobj; then
- $show "${LN_S} $obj $oldobj"
- $run ${LN_S} $obj $oldobj || exit $?
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir="."
+ else
+ xdir="$xdir"
fi
+ baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+ if test ! -f $xdir/$oldobj; then
+ $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+ $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+ fi
done
# Use standard objects if they are pic
@@ -2311,8 +2328,16 @@
# Just create a symlink.
$show $rm $libobj
$run $rm $libobj
- $show "$LN_S $obj $libobj"
- $run $LN_S $obj $libobj || exit $?
+ xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$libobj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+ oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+ $show "(cd $xdir && $LN_S $oldobj $baseobj)"
+ $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
fi
if test -n "$gentop"; then
@@ -2598,16 +2623,21 @@
# 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*)
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
case "$compile_command " in
*" -static "*) ;;
*) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DPIC";;
esac
esac
# Now compile the dynamic symbol file.
- $show "(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
- $run eval '(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+ $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
# Clean up the generated files.
$show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
@@ -2776,7 +2806,7 @@
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
-if test \"\${CDPATH+set}\" = set; then CDPATH=; export CDPATH; fi
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
relink_command=\"$relink_command\"
@@ -2865,7 +2895,7 @@
fi"
else
echo >> $output "\
- program='$outputname$exeext'
+ program='$outputname'
progdir=\"\$thisdir/$objdir\"
"
fi
@@ -2901,13 +2931,21 @@
# Run the actual program with our arguments.
"
case $host in
- *-*-cygwin* | *-*-mingw | *-*-os2*)
# win32 systems need to use the prog path for dll
# lookup to work
+ *-*-cygwin*)
$echo >> $output "\
+ exec \$progdir/\$program \${1+\"\$@\"}
+"
+ ;;
+
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
exec \$progdir\\\\\$program \${1+\"\$@\"}
"
;;
+
*)
$echo >> $output "\
# Export the path to the program.
@@ -2995,14 +3033,21 @@
if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
eval cmds=\"$old_archive_from_new_cmds\"
else
- # Ensure that we have .o objects in place incase we decided
+ # Ensure that we have .o objects in place in case we decided
# not to build a shared library, and have fallen back to building
# static libs even though --disable-static was passed!
for oldobj in $oldobjs; do
if test ! -f $oldobj; then
- obj=`$echo "X$oldobj" | $Xsed -e "$o2lo"`
- $show "${LN_S} $obj $oldobj"
- $run ${LN_S} $obj $oldobj || exit $?
+ xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$oldobj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+ obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+ $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+ $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
fi
done
@@ -3672,8 +3717,10 @@
done
if test -z "$run"; then
- # Export the shlibpath_var.
- eval "export $shlibpath_var"
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
# Restore saved enviroment variables
if test "${save_LC_ALL+set}" = set; then
@@ -3690,8 +3737,10 @@
exit 1
else
# Display what would be done.
- eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
- $echo "export $shlibpath_var"
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
$echo "$cmd$args"
exit 0
fi
--- a/common/libsndfile/m4/Makefile.am
+++ /dev/null
@@ -1,1 +1,0 @@
-
--- a/common/libsndfile/m4/Makefile.in
+++ /dev/null
@@ -1,182 +1,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 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.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_alias = @build_alias@
-build_triplet = @build@
-host_alias = @host_alias@
-host_triplet = @host@
-target_alias = @target_alias@
-target_triplet = @target@
-AS = @AS@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LD = @LD@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-NM = @NM@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
-VERSION = @VERSION@
-subdirs = @subdirs@
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../src/config.h
-CONFIG_CLEAN_FILES =
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-all: all-redirect
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps m4/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-tags: TAGS
-TAGS:
-
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = m4
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-generic clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-generic distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: tags distdir info-am info dvi-am dvi check check-am \
-installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
-
-
-# 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.
-.NOEXPORT:
--- a/common/libsndfile/mkinstalldirs
+++ b/common/libsndfile/mkinstalldirs
@@ -4,7 +4,7 @@
# Created: 1993-05-16
# Public domain
-# $Id: mkinstalldirs,v 1.1 2001/05/09 19:44:12 menno Exp $
+# $Id: mkinstalldirs,v 1.2 2002/02/13 12:42:00 menno Exp $
errstatus=0
--- a/common/libsndfile/src/G72x/ChangeLog
+++ b/common/libsndfile/src/G72x/ChangeLog
@@ -1,3 +1,8 @@
+2001-06-05 Erik de Castro Lopo <erikd@zip.com.au>
+
+ * g72x.c
+ Added {} in function update () to prevent 'ambiguous else' warning messages.
+
2000-07-14 Erik de Castro Lopo <erikd@zip.com.au>
* g72x.c
--- a/common/libsndfile/src/G72x/Makefile.in
+++ b/common/libsndfile/src/G72x/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -68,11 +68,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -116,7 +114,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
SOURCES = $(libg72x_la_SOURCES)
OBJECTS = $(libg72x_la_OBJECTS)
@@ -219,7 +217,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
--- a/common/libsndfile/src/G72x/g72x.c
+++ b/common/libsndfile/src/G72x/g72x.c
@@ -31,6 +31,8 @@
*/
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "g72x.h"
#include "private.h"
@@ -509,7 +511,7 @@
a2p += fa1 >> 5;
if (pk0 ^ state_ptr->pk[1])
- /* LIMC */
+ { /* LIMC */
if (a2p <= -12160)
a2p = -12288;
else if (a2p >= 12416)
@@ -516,6 +518,7 @@
a2p = 12288;
else
a2p -= 0x80;
+ }
else if (a2p <= -12416)
a2p = -12288;
else if (a2p >= 12160)
--- a/common/libsndfile/src/G72x/g72x.h
+++ b/common/libsndfile/src/G72x/g72x.h
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
--- a/common/libsndfile/src/GSM610/ChangeLog
+++ b/common/libsndfile/src/GSM610/ChangeLog
@@ -1,9 +1,20 @@
-2000-02-29 Erik de Castro Lopo <erikd@zip.com.au>
+2001-09-16 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+ * code.c
+ Added #includes fro string.h and stdlib.h.
+
+2000-10-27 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
+ * config.h
+ Removed some commented out #defines (ie //*efine) which were causing problems on
+ the Sun cc compiler.
+
+2000-02-29 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
+
* private.h
Added #defines to emulate normal compile time options.
-2000-02-28 Erik de Castro Lopo <erikd@zip.com.au>
+2000-02-28 Erik de Castro Lopo <erikd AT zip DOT com DOT au>
* everthing
Created this directory and copied files from libgsm.
--- a/common/libsndfile/src/GSM610/Makefile.in
+++ b/common/libsndfile/src/GSM610/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -68,11 +68,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -119,7 +117,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
SOURCES = $(libgsm_la_SOURCES)
OBJECTS = $(libgsm_la_OBJECTS)
@@ -222,7 +220,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
--- a/common/libsndfile/src/GSM610/add.c
+++ b/common/libsndfile/src/GSM610/add.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/add.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/add.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
/*
* See private.h for the more commonly used macro versions.
--- a/common/libsndfile/src/GSM610/code.c
+++ b/common/libsndfile/src/GSM610/code.c
@@ -4,17 +4,15 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/code.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/code.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
-#include "config.h"
-#ifdef HAS_STDLIB_H
+
#include <stdlib.h>
-#else
-# include "proto.h"
- extern char * memcpy P((char *, char *, int));
-#endif
+#include <string.h>
+
+#include "config.h"
#include "private.h"
#include "gsm.h"
--- a/common/libsndfile/src/GSM610/config.h
+++ b/common/libsndfile/src/GSM610/config.h
@@ -4,18 +4,13 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/config.h,v 1.1 2001/05/09 19:44:12 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/config.h,v 1.2 2002/02/13 12:42:02 menno Exp $*/
#ifndef CONFIG_H
#define CONFIG_H
-//*efine SIGHANDLER_T int /* signal handlers are void */
-//*efine HAS_SYSV_SIGNAL 1 /* sigs not blocked/reset? */
-
#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */
-//*efine HAS_LIMITS_H 1 /* /usr/include/limits.h */
#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */
-//*efine HAS_ERRNO_DECL 1 /* errno.h declares errno */
#define HAS_FSTAT 1 /* fstat syscall */
#define HAS_FCHMOD 1 /* fchmod syscall */
@@ -22,16 +17,11 @@
#define HAS_CHMOD 1 /* chmod syscall */
#define HAS_FCHOWN 1 /* fchown syscall */
#define HAS_CHOWN 1 /* chown syscall */
-//*efine HAS__FSETMODE 1 /* _fsetmode -- set file mode */
#define HAS_STRING_H 1 /* /usr/include/string.h */
-//*efine HAS_STRINGS_H 1 /* /usr/include/strings.h */
#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */
#define HAS_UTIME 1 /* POSIX utime(path, times) */
-//*efine HAS_UTIMES 1 /* use utimes() syscall instead */
#define HAS_UTIME_H 1 /* UTIME header file */
-//*efine HAS_UTIMBUF 1 /* struct utimbuf */
-//*efine HAS_UTIMEUSEC 1 /* microseconds in utimbuf? */
#endif /* CONFIG_H */
--- a/common/libsndfile/src/GSM610/decode.c
+++ b/common/libsndfile/src/GSM610/decode.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/decode.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/decode.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
--- a/common/libsndfile/src/GSM610/gsm.h
+++ b/common/libsndfile/src/GSM610/gsm.h
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm.h,v 1.1 2001/05/09 19:44:12 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm.h,v 1.2 2002/02/13 12:42:02 menno Exp $*/
#ifndef GSM_H
#define GSM_H
--- a/common/libsndfile/src/GSM610/gsm_create.c
+++ b/common/libsndfile/src/GSM610/gsm_create.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-static char const ident[] = "$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_create.c,v 1.1 2001/05/09 19:44:12 menno Exp $";
+static char const ident[] = "$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_create.c,v 1.2 2002/02/13 12:42:02 menno Exp $";
#include "config.h"
--- a/common/libsndfile/src/GSM610/gsm_decode.c
+++ b/common/libsndfile/src/GSM610/gsm_decode.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_decode.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_decode.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include "private.h"
--- a/common/libsndfile/src/GSM610/gsm_destroy.c
+++ b/common/libsndfile/src/GSM610/gsm_destroy.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_destroy.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_destroy.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include "gsm.h"
#include "config.h"
--- a/common/libsndfile/src/GSM610/gsm_encode.c
+++ b/common/libsndfile/src/GSM610/gsm_encode.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_encode.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_encode.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include "private.h"
#include "gsm.h"
--- a/common/libsndfile/src/GSM610/gsm_option.c
+++ b/common/libsndfile/src/GSM610/gsm_option.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_option.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/gsm_option.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include "private.h"
--- a/common/libsndfile/src/GSM610/long_term.c
+++ b/common/libsndfile/src/GSM610/long_term.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/long_term.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/long_term.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
#include <assert.h>
--- a/common/libsndfile/src/GSM610/lpc.c
+++ b/common/libsndfile/src/GSM610/lpc.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/lpc.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/lpc.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
#include <assert.h>
--- a/common/libsndfile/src/GSM610/preprocess.c
+++ b/common/libsndfile/src/GSM610/preprocess.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/preprocess.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/preprocess.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
#include <assert.h>
--- a/common/libsndfile/src/GSM610/private.h
+++ b/common/libsndfile/src/GSM610/private.h
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/private.h,v 1.1 2001/05/09 19:44:12 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/private.h,v 1.2 2002/02/13 12:42:02 menno Exp $*/
#ifndef PRIVATE_H
#define PRIVATE_H
--- a/common/libsndfile/src/GSM610/proto.h
+++ b/common/libsndfile/src/GSM610/proto.h
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/proto.h,v 1.1 2001/05/09 19:44:12 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/proto.h,v 1.2 2002/02/13 12:42:02 menno Exp $*/
#ifndef PROTO_H
#define PROTO_H
--- a/common/libsndfile/src/GSM610/rpe.c
+++ b/common/libsndfile/src/GSM610/rpe.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/rpe.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/rpe.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
#include <assert.h>
--- a/common/libsndfile/src/GSM610/short_term.c
+++ b/common/libsndfile/src/GSM610/short_term.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/short_term.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/short_term.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
#include <stdio.h>
#include <assert.h>
--- a/common/libsndfile/src/GSM610/table.c
+++ b/common/libsndfile/src/GSM610/table.c
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/table.c,v 1.1 2001/05/09 19:44:12 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/table.c,v 1.2 2002/02/13 12:42:02 menno Exp $ */
/* Most of these tables are inlined at their point of use.
*/
--- a/common/libsndfile/src/GSM610/unproto.h
+++ b/common/libsndfile/src/GSM610/unproto.h
@@ -4,7 +4,7 @@
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
*/
-/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/unproto.h,v 1.1 2001/05/09 19:44:12 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faac/common/libsndfile/src/GSM610/Attic/unproto.h,v 1.2 2002/02/13 12:42:02 menno Exp $*/
#ifdef PROTO_H /* sic */
#undef PROTO_H
--- a/common/libsndfile/src/Makefile.am
+++ b/common/libsndfile/src/Makefile.am
@@ -8,13 +8,14 @@
include_HEADERS = sndfile.h
INCLUDES = -I$(srcdir)/../src -I$(srcdir)
-noinst_HEADERS = common.h sfendian.h pcm.h ulaw.h alaw.h wav.h au.h
+noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
-COMMON = common.c newpcm.c pcm.c ulaw.c alaw.c sndfile.c
-FILESPECIFIC = aiff.c au.c au_g72x.c paf.c raw.c svx.c wav.c wav_float.c \
- wav_gsm610.c wav_ima_adpcm.c wav_ms_adpcm.c
+COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c \
+ svx.c wav.c wav_gsm610.c wav_ima_adpcm.c \
+ wav_ms_adpcm.c voc.c ircam.c
-libsndfile_la_SOURCES = $(FILESPECIFIC) $(COMMON) sndfile.h common.h
+libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la
--- a/common/libsndfile/src/Makefile.in
+++ b/common/libsndfile/src/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -69,11 +69,9 @@
AS = @AS@
CC = @CC@
DLLTOOL = @DLLTOOL@
-LD = @LD@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
-NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@
RANLIB = @RANLIB@
@@ -88,13 +86,13 @@
include_HEADERS = sndfile.h
INCLUDES = -I$(srcdir)/../src -I$(srcdir)
-noinst_HEADERS = common.h sfendian.h pcm.h ulaw.h alaw.h wav.h au.h
+noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
-COMMON = common.c newpcm.c pcm.c ulaw.c alaw.c sndfile.c
-FILESPECIFIC = aiff.c au.c au_g72x.c paf.c raw.c svx.c wav.c wav_float.c wav_gsm610.c wav_ima_adpcm.c wav_ms_adpcm.c
+COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c svx.c wav.c wav_gsm610.c wav_ima_adpcm.c wav_ms_adpcm.c voc.c ircam.c
-libsndfile_la_SOURCES = $(FILESPECIFIC) $(COMMON) sndfile.h common.h
+libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la
@@ -111,9 +109,10 @@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
libsndfile_la_DEPENDENCIES = GSM610/libgsm.la G72x/libg72x.la
-libsndfile_la_OBJECTS = aiff.lo au.lo au_g72x.lo paf.lo raw.lo svx.lo \
-wav.lo wav_float.lo wav_gsm610.lo wav_ima_adpcm.lo wav_ms_adpcm.lo \
-common.lo newpcm.lo pcm.lo ulaw.lo alaw.lo sndfile.lo
+libsndfile_la_OBJECTS = common.lo pcm.lo ulaw.lo alaw.lo float32.lo \
+sndfile.lo aiff.lo au.lo au_g72x.lo nist.lo paf.lo raw.lo samplitude.lo \
+svx.lo wav.lo wav_gsm610.lo wav_ima_adpcm.lo wav_ms_adpcm.lo voc.lo \
+ircam.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -126,7 +125,7 @@
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = gtar
+TAR = tar
GZIP_ENV = --best
SOURCES = $(libsndfile_la_SOURCES)
OBJECTS = $(libsndfile_la_OBJECTS)
@@ -348,7 +347,7 @@
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -365,35 +364,31 @@
|| exit 1; \
fi; \
done
-aiff.lo aiff.o : aiff.c sndfile.h config.h sfendian.h common.h pcm.h
-alaw.lo alaw.o : alaw.c sndfile.h common.h
-au.lo au.o : au.c sndfile.h config.h sfendian.h common.h pcm.h au.h \
- ulaw.h alaw.h
-au_g721.lo au_g721.o : au_g721.c sndfile.h config.h sfendian.h common.h \
- au.h G72x/g72x.h
-au_g721_32.lo au_g721_32.o : au_g721_32.c sndfile.h config.h sfendian.h \
- common.h au.h G72x/g72x.h
-au_g72x.lo au_g72x.o : au_g72x.c sndfile.h config.h sfendian.h common.h \
- au.h G72x/g72x.h
+aiff.lo aiff.o : aiff.c sndfile.h config.h sfendian.h common.h
+alaw.lo alaw.o : alaw.c sndfile.h floatcast.h common.h
+au.lo au.o : au.c sndfile.h config.h sfendian.h common.h au.h
+au_g72x.lo au_g72x.o : au_g72x.c config.h sndfile.h sfendian.h \
+ floatcast.h common.h au.h G72x/g72x.h
common.lo common.o : common.c sndfile.h sfendian.h config.h common.h
-newpcm.lo newpcm.o : newpcm.c config.h sndfile.h common.h sfendian.h \
- pcm.h
-paf.lo paf.o : paf.c sndfile.h config.h sfendian.h common.h pcm.h
-pcm.lo pcm.o : pcm.c config.h sndfile.h common.h sfendian.h pcm.h
-raw.lo raw.o : raw.c sndfile.h config.h sfendian.h common.h pcm.h
+float32.lo float32.o : float32.c sndfile.h config.h sfendian.h common.h
+ircam.lo ircam.o : ircam.c sndfile.h config.h sfendian.h common.h
+nist.lo nist.o : nist.c sndfile.h config.h sfendian.h common.h
+paf.lo paf.o : paf.c config.h sndfile.h sfendian.h floatcast.h common.h
+pcm.lo pcm.o : pcm.c config.h sndfile.h sfendian.h floatcast.h common.h
+raw.lo raw.o : raw.c sndfile.h config.h sfendian.h common.h
+samplitude.lo samplitude.o : samplitude.c sndfile.h config.h sfendian.h \
+ common.h
sndfile.lo sndfile.o : sndfile.c sndfile.h config.h sfendian.h common.h
-svx.lo svx.o : svx.c sndfile.h config.h sfendian.h common.h pcm.h
-ulaw.lo ulaw.o : ulaw.c sndfile.h common.h
-wav.lo wav.o : wav.c sndfile.h config.h sfendian.h common.h pcm.h ulaw.h \
- alaw.h wav.h
-wav_float.lo wav_float.o : wav_float.c sndfile.h config.h sfendian.h \
- common.h wav.h
+svx.lo svx.o : svx.c sndfile.h config.h sfendian.h common.h
+ulaw.lo ulaw.o : ulaw.c sndfile.h floatcast.h common.h
+voc.lo voc.o : voc.c sndfile.h config.h sfendian.h common.h
+wav.lo wav.o : wav.c sndfile.h config.h sfendian.h common.h wav.h
wav_gsm610.lo wav_gsm610.o : wav_gsm610.c sndfile.h config.h sfendian.h \
- common.h wav.h GSM610/gsm.h
+ floatcast.h common.h wav.h GSM610/gsm.h
wav_ima_adpcm.lo wav_ima_adpcm.o : wav_ima_adpcm.c sndfile.h config.h \
- sfendian.h common.h wav.h
+ sfendian.h floatcast.h common.h wav.h
wav_ms_adpcm.lo wav_ms_adpcm.o : wav_ms_adpcm.c sndfile.h config.h \
- sfendian.h common.h wav.h
+ sfendian.h floatcast.h common.h wav.h
info-am:
info: info-recursive
--- a/common/libsndfile/src/aiff.c
+++ b/common/libsndfile/src/aiff.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -21,12 +21,12 @@
#include <unistd.h>
#include <string.h>
#include <ctype.h>
+#include <time.h>
#include "sndfile.h"
#include "config.h"
#include "sfendian.h"
#include "common.h"
-#include "pcm.h"
/*------------------------------------------------------------------------------
@@ -54,21 +54,55 @@
#define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E'))
#define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H'))
#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O'))
+#define COMT_MARKER (MAKE_MARKER ('C', 'O', 'M', 'T'))
#define FVER_MARKER (MAKE_MARKER ('F', 'V', 'E', 'R'))
+#define SFX_MARKER (MAKE_MARKER ('S', 'F', 'X', '!'))
+
+#define PEAK_MARKER (MAKE_MARKER ('P', 'E', 'A', 'K'))
+
+/* Supported AIFC encodings.*/
#define NONE_MARKER (MAKE_MARKER ('N', 'O', 'N', 'E'))
+#define sowt_MARKER (MAKE_MARKER ('s', 'o', 'w', 't'))
+#define twos_MARKER (MAKE_MARKER ('t', 'w', 'o', 's'))
+#define fl32_MARKER (MAKE_MARKER ('f', 'l', '3', '2'))
+#define FL32_MARKER (MAKE_MARKER ('F', 'L', '3', '2'))
-#define REAL_COMM_SIZE (2+4+2+10)
+/* Unsupported AIFC encodings.*/
+#define fl64_MARKER (MAKE_MARKER ('f', 'l', '6', '4'))
+#define FL64_MARKER (MAKE_MARKER ('F', 'L', '6', '4'))
+#define MAC3_MARKER (MAKE_MARKER ('M', 'A', 'C', '3'))
+#define MAC6_MARKER (MAKE_MARKER ('M', 'A', 'C', '6'))
+#define ima4_MARKER (MAKE_MARKER ('i', 'm', 'a', '4'))
+#define ulaw_MARKER (MAKE_MARKER ('a', 'l', 'a', 'w'))
+#define alaw_MARKER (MAKE_MARKER ('u', 'l', 'a', 'w'))
+#define ADP4_MARKER (MAKE_MARKER ('A', 'D', 'P', '4'))
+/* Predfined chunk sizes. */
+#define AIFF_COMM_SIZE 18
+#define AIFC_COMM_SIZE 24
+#define SSND_CHUNK_SIZE 8
+
/*------------------------------------------------------------------------------
* Typedefs for file chunks.
*/
+enum
+{ HAVE_FORM = 0x01,
+ HAVE_AIFF = 0x02,
+ HAVE_COMM = 0x04,
+ HAVE_SSND = 0x08
+} ;
+
typedef struct
-{ short numChannels ;
+{ unsigned int type ;
+ unsigned int size ;
+ short numChannels ;
unsigned int numSampleFrames ;
short sampleSize ;
unsigned char sampleRate [10] ;
+ unsigned int encoding ;
+ char zero_bytes [2] ;
} COMM_CHUNK ;
typedef struct
@@ -76,7 +110,6 @@
unsigned int blocksize ;
} SSND_CHUNK ;
-
typedef struct
{ short playMode;
int beginLoop;
@@ -92,188 +125,228 @@
static int tenbytefloat2int (unsigned char *bytes) ;
static void uint2tenbytefloat (unsigned int num, unsigned char *bytes) ;
-static
-void endswap_comm_fmt (COMM_CHUNK *comm)
-{ comm->numChannels = ENDSWAP_SHORT (comm->numChannels) ;
- comm->numSampleFrames = ENDSWAP_INT (comm->numSampleFrames) ;
- comm->sampleSize = ENDSWAP_SHORT (comm->sampleSize) ;
-} /* endswap_comm_fmt */
+static int aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
-static
-void endswap_ssnd_fmt (SSND_CHUNK *ssnd)
-{ ssnd->offset = ENDSWAP_INT (ssnd->offset) ;
- ssnd->blocksize = ENDSWAP_INT (ssnd->blocksize) ;
-} /* endswap_ssnd_fmt */
+static int aiff_write_header (SF_PRIVATE *psf) ;
+static int aiff_write_tailer (SF_PRIVATE *psf) ;
-
/*------------------------------------------------------------------------------
** Public functions.
*/
-int aiff_open_read (SF_PRIVATE *psf)
+int
+aiff_open_read (SF_PRIVATE *psf)
{ COMM_CHUNK comm_fmt ;
SSND_CHUNK ssnd_fmt ;
int marker, dword ;
- long FORMsize, commsize, SSNDsize ;
- int filetype, parsestage = 0, done = 0 ;
-
+ long FORMsize, SSNDsize ;
+ int filetype, found_chunk = 0, done = 0, error = 0 ;
+ char *cptr ;
+
+ psf->sf.seekable = SF_TRUE ;
+
+ /* Set position to start of file to begin reading header. */
+ psf_binheader_readf (psf, "p", 0) ;
+
+ memset (&comm_fmt, 0, sizeof (comm_fmt)) ;
+
+ /* Until recently AIF* file were all BIG endian. */
+ psf->endian = SF_ENDIAN_BIG ;
+
+ /* AIFF files can apparently have their chunks in any order. However, they must
+ ** a FORM chunk. Approach here is to read allthe chunks one by one and then
+ ** check for the mandatory chunks at the end.
+ */
while (! done)
- { fread (&marker, sizeof (marker), 1, psf->file) ;
+ { psf_binheader_readf (psf, "m", &marker) ;
switch (marker)
{ case FORM_MARKER :
- if (parsestage != 0)
+ if (found_chunk)
return SFE_AIFF_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- FORMsize = BE2H_INT (dword) ;
+ psf_binheader_readf (psf, "L", &FORMsize) ;
+
if (FORMsize != psf->filelength - 2 * sizeof (dword))
{ dword = psf->filelength - 2 * sizeof (dword);
- psf_sprintf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+ psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
FORMsize = dword ;
}
else
- psf_sprintf (psf, "FORM : %d\n", FORMsize) ;
- parsestage = 1 ;
+ psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+ found_chunk |= HAVE_FORM ;
break ;
case AIFC_MARKER :
case AIFF_MARKER :
- if (parsestage != 1)
- return SFE_AIFF_NO_FORM ;
+ if (! (found_chunk & HAVE_FORM))
+ return SFE_AIFF_AIFF_NO_FORM ;
filetype = marker ;
- psf_sprintf (psf, " %D\n", marker) ;
- parsestage = 2 ;
+ psf_log_printf (psf, " %D\n", marker) ;
+ found_chunk |= HAVE_AIFF ;
break ;
case COMM_MARKER :
- if (parsestage != 2)
- return SFE_AIFF_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- commsize = BE2H_INT (dword) ;
-
- /* The COMM chunk has an int aligned to a word boundary. Some procesors
- ** are not able to deal with this (ie bus fault) so we have to take
- ** special care.
- */
+ error = aiff_read_comm_chunk (psf, &comm_fmt) ;
- fread (&(comm_fmt.numChannels), sizeof (comm_fmt.numChannels), 1, psf->file) ;
- fread (&(comm_fmt.numSampleFrames), sizeof (comm_fmt.numSampleFrames), 1, psf->file) ;
- fread (&(comm_fmt.sampleSize), sizeof (comm_fmt.sampleSize), 1, psf->file) ;
- fread (&(comm_fmt.sampleRate), sizeof (comm_fmt.sampleRate), 1, psf->file) ;
-
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_comm_fmt (&comm_fmt) ;
-
psf->sf.samplerate = tenbytefloat2int (comm_fmt.sampleRate) ;
psf->sf.samples = comm_fmt.numSampleFrames ;
psf->sf.channels = comm_fmt.numChannels ;
psf->sf.pcmbitwidth = comm_fmt.sampleSize ;
- psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM);
psf->sf.sections = 1 ;
- psf_sprintf (psf, " COMM : %d\n", commsize) ;
- psf_sprintf (psf, " Sample Rate : %d\n", psf->sf.samplerate) ;
- psf_sprintf (psf, " Samples : %d\n", comm_fmt.numSampleFrames) ;
- psf_sprintf (psf, " Channels : %d\n", comm_fmt.numChannels) ;
- psf_sprintf (psf, " Sample Size : %d\n", comm_fmt.sampleSize) ;
+ if (error)
+ return error ;
+
+ found_chunk |= HAVE_COMM ;
+ break ;
+
+ case PEAK_MARKER :
+ /* Must have COMM chunk before PEAK chunk. */
+ 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, "L", &dword) ;
- if (commsize > REAL_COMM_SIZE)
- { fread (&dword, sizeof (dword), 1, psf->file) ;
- if (dword != NONE_MARKER)
- { psf_sprintf (psf, "AIFC : Unimplemented format : %D\n", dword) ;
- return SFE_UNIMPLEMENTED ;
- } ;
- fseek (psf->file, commsize - (long) (sizeof (dword) + REAL_COMM_SIZE), SEEK_CUR) ;
+ psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+ if (dword > sizeof (psf->peak))
+ { psf_binheader_readf (psf, "j", dword) ;
+ psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
+ return SFE_WAV_BAD_PEAK ;
} ;
+ if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+ { psf_binheader_readf (psf, "j", dword) ;
+ psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
+ return SFE_WAV_BAD_PEAK ;
+ } ;
- parsestage = 3 ;
+ /* read in rest of PEAK chunk. */
+ psf_binheader_readf (psf, "LL", &(psf->peak.version), &(psf->peak.timestamp)) ;
+
+ if (psf->peak.version != 1)
+ psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak.version) ;
+ else
+ psf_log_printf (psf, " version : %d\n", psf->peak.version) ;
+
+ psf_log_printf (psf, " time stamp : %d\n", psf->peak.timestamp) ;
+ psf_log_printf (psf, " Ch Position Value\n") ;
+
+ cptr = (char *) psf->buffer ;
+ for (dword = 0 ; dword < psf->sf.channels ; dword++)
+ { psf_binheader_readf (psf, "FL", &(psf->peak.peak[dword].value),
+ &(psf->peak.peak[dword].position)) ;
+
+ snprintf (cptr, sizeof (psf->buffer), " %2d %-12d %g\n",
+ dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
+ cptr [sizeof (psf->buffer) - 1] = 0 ;
+ psf_log_printf (psf, cptr) ;
+ };
+
+ psf->has_peak = SF_TRUE ;
break ;
case SSND_MARKER :
- if (parsestage != 3)
- return SFE_AIFF_NO_SSND ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- SSNDsize = BE2H_INT (dword) ;
-
- fread (&ssnd_fmt, sizeof (SSND_CHUNK), 1, psf->file) ;
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_ssnd_fmt (&ssnd_fmt) ;
-
+ psf_binheader_readf (psf, "LLL", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
+
psf->dataoffset = ftell (psf->file) ;
psf->datalength = psf->filelength - psf->dataoffset ;
- if (SSNDsize != psf->datalength + sizeof (SSND_CHUNK))
- psf_sprintf (psf, " SSND : %d (should be %d)\n", SSNDsize, psf->datalength + sizeof (SSND_CHUNK)) ;
+ if (SSNDsize > psf->datalength + sizeof (SSND_CHUNK))
+ psf_log_printf (psf, " SSND : %d (should be %d)\n", SSNDsize, psf->datalength + sizeof (SSND_CHUNK)) ;
else
- psf_sprintf (psf, " SSND : %d\n", SSNDsize) ;
+ psf_log_printf (psf, " SSND : %d\n", SSNDsize) ;
- psf_sprintf (psf, " Offset : %d\n", ssnd_fmt.offset) ;
- psf_sprintf (psf, " Block Size : %d\n", ssnd_fmt.blocksize) ;
+ psf_log_printf (psf, " Offset : %d\n", ssnd_fmt.offset) ;
+ psf_log_printf (psf, " Block Size : %d\n", ssnd_fmt.blocksize) ;
+ found_chunk |= HAVE_SSND ;
- fseek (psf->file, psf->datalength, SEEK_CUR) ;
- dword = ftell (psf->file) ;
- if (dword != (off_t) (psf->dataoffset + psf->datalength))
- psf_sprintf (psf, "*** fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
- parsestage = 4 ;
+ if (! psf->sf.seekable)
+ break ;
+
+ /* Seek to end of SSND chunk. */
+ fseek (psf->file, SSNDsize - 8, SEEK_CUR) ;
break ;
- case NAME_MARKER :
- case AUTH_MARKER :
- case ANNO_MARKER :
case c_MARKER :
+ case ANNO_MARKER :
+ case AUTH_MARKER :
+ case COMT_MARKER :
+ case NAME_MARKER :
+ psf_binheader_readf (psf, "L", &dword);
+ dword += (dword & 1) ;
+ if (dword == 0)
+ break ;
+ if (dword > sizeof (psf->buffer))
+ { psf_log_printf (psf, " *** %D : %d (too big)\n", marker, dword) ;
+ return SFE_INTERNAL ;
+ } ;
+ psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+ psf->buffer [dword - 1] = 0 ;
+ psf_log_printf (psf, "*** %D : %s\n", marker, psf->buffer) ;
+ break ;
+
case FVER_MARKER :
- if (parsestage < 2)
- return SFE_AIFF_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = BE2H_INT (dword) ;
- psf_sprintf (psf, " %D : %d\n", marker, dword) ;
- fseek (psf->file, dword, SEEK_CUR) ;
+ case SFX_MARKER :
+ psf_binheader_readf (psf, "L", &dword) ;
+ psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
- case MARK_MARKER :
- case INST_MARKER :
case APPL_MARKER :
- if (parsestage < 2)
- return SFE_AIFF_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = BE2H_INT (dword) ;
- psf_sprintf (psf, " %D : %d\n", marker, dword) ;
- fseek (psf->file, dword, SEEK_CUR) ;
+ case INST_MARKER :
+ case MARK_MARKER :
+ psf_binheader_readf (psf, "L", &dword) ;
+ psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
default :
if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
- { fread (&dword, sizeof (dword), 1, psf->file) ;
- psf_sprintf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
- fseek (psf->file, dword, SEEK_CUR) ;
+ { psf_binheader_readf (psf, "L", &dword) ;
+ psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
} ;
if ((dword = ftell (psf->file)) & 0x03)
- { psf_sprintf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
- fseek (psf->file, -3, SEEK_CUR) ;
+ { psf_log_printf (psf, " Unknown chunk marker at position %d. Resyncing.\n", dword - 4) ;
+
+ psf_binheader_readf (psf, "j", -3) ;
break ;
} ;
- psf_sprintf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+ psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
done = 1 ;
break ;
} ; /* switch (marker) */
+
+ if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND))
+ break ;
if (ferror (psf->file))
- { psf_sprintf (psf, "*** Error on file handle. ***\n") ;
+ { psf_log_printf (psf, "*** Error on file handle. ***\n") ;
clearerr (psf->file) ;
break ;
} ;
- if (ftell (psf->file) >= (off_t) (psf->filelength - (2 * sizeof (dword))))
+ if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
break ;
} ; /* while (1) */
+ if (! (found_chunk & HAVE_FORM))
+ return SFE_AIFF_NO_FORM ;
+
+ if (! (found_chunk & HAVE_AIFF))
+ return SFE_AIFF_COMM_NO_FORM ;
+
+ if (! (found_chunk & HAVE_COMM))
+ return SFE_AIFF_SSND_NO_COMM ;
+
if (! psf->dataoffset)
return SFE_AIFF_NO_DATA ;
psf->current = 0 ;
- psf->endian = SF_ENDIAN_BIG ; /* All AIF* files are big endian. */
psf->sf.seekable = SF_TRUE ;
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
@@ -283,155 +356,96 @@
psf->close = (func_close) aiff_close ;
- switch (psf->bytewidth)
- { case 1 :
- psf->read_short = (func_short) pcm_read_sc2s ;
- psf->read_int = (func_int) pcm_read_sc2i ;
- psf->read_double = (func_double) pcm_read_sc2d ;
+ switch (psf->sf.format & SF_FORMAT_SUBMASK)
+ { case SF_FORMAT_PCM :
+ case SF_FORMAT_PCM_LE :
+ case SF_FORMAT_PCM_BE :
+ if (psf->bytewidth == 1)
+ psf->chars = SF_CHARS_SIGNED ;
+
+ error = pcm_read_init (psf) ;
break ;
- case 2 :
- psf->read_short = (func_short) pcm_read_bes2s ;
- psf->read_int = (func_int) pcm_read_bes2i ;
- psf->read_double = (func_double) pcm_read_bes2d ;
+
+ case SF_FORMAT_FLOAT :
+ error = float32_read_init (psf) ;
break ;
- case 3 :
- psf->read_short = (func_short) pcm_read_bet2s ;
- psf->read_int = (func_int) pcm_read_bet2i ;
- psf->read_double = (func_double) pcm_read_bet2d ;
- break ;
- case 4 :
- psf->read_short = (func_short) pcm_read_bei2s ;
- psf->read_int = (func_int) pcm_read_bei2i ;
- psf->read_double = (func_double) pcm_read_bei2d ;
- break ;
- default :
- /* printf ("Weird bytewidth (%d)\n", psf->bytewidth) ; */
- return SFE_UNIMPLEMENTED ;
+
+ default : return SFE_UNIMPLEMENTED ;
} ;
- return 0 ;
+ return error ;
} /* aiff_open_read */
/*------------------------------------------------------------------------------
*/
-int aiff_open_write (SF_PRIVATE *psf)
-{ COMM_CHUNK comm_fmt ;
- SSND_CHUNK ssnd_fmt ;
- unsigned int dword, FORMsize ;
-
+int
+aiff_open_write (SF_PRIVATE *psf)
+{ int error ;
+
if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AIFF)
return SFE_BAD_OPEN_FORMAT ;
- if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
- return SFE_BAD_OPEN_FORMAT ;
- psf->endian = SF_ENDIAN_BIG ; /* All AIF* files are big endian. */
psf->sf.seekable = SF_TRUE ;
+ psf->error = 0 ;
+
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- psf->dataoffset = 5 * sizeof (dword) + REAL_COMM_SIZE + 4 * sizeof (dword) ;
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
- psf->error = 0 ;
- FORMsize = 0x7FFFFFFF ; /* Correct this when closing file. */
+ /* Set sample count artifically high and fix later. */
+ psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ;
- comm_fmt.numChannels = psf->sf.channels ;
- comm_fmt.numSampleFrames = psf->sf.samples ;
- comm_fmt.sampleSize = psf->sf.pcmbitwidth ;
- uint2tenbytefloat (psf->sf.samplerate, comm_fmt.sampleRate) ;
+ psf->datalength = psf->blockwidth * psf->sf.samples ;
+ psf->filelength = 0x7FFFFFFF ;
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_comm_fmt (&comm_fmt) ;
+ if ((error = aiff_write_header (psf)))
+ return error ;
- ssnd_fmt.offset = 0 ;
- ssnd_fmt.blocksize = 0 ; /* Not normally used. */
+ psf->close = (func_close) aiff_close ;
+ psf->write_header = (func_wr_hdr) aiff_write_header ;
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_ssnd_fmt (&ssnd_fmt) ;
+ switch (psf->sf.format & SF_FORMAT_SUBMASK)
+ { case SF_FORMAT_PCM :
+ case SF_FORMAT_PCM_LE :
+ case SF_FORMAT_PCM_BE :
+ if (psf->bytewidth == 1)
+ psf->chars = SF_CHARS_SIGNED ;
- dword = FORM_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = H2BE_INT (FORMsize) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- dword = AIFF_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = COMM_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- dword = H2BE_INT (REAL_COMM_SIZE) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- fwrite (&(comm_fmt.numChannels), sizeof (comm_fmt.numChannels), 1, psf->file) ;
- fwrite (&(comm_fmt.numSampleFrames), sizeof (comm_fmt.numSampleFrames), 1, psf->file) ;
- fwrite (&(comm_fmt.sampleSize), sizeof (comm_fmt.sampleSize), 1, psf->file) ;
- fwrite (&(comm_fmt.sampleRate), sizeof (comm_fmt.sampleRate), 1, psf->file) ;
-
- dword = SSND_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = H2BE_INT (psf->datalength + sizeof (SSND_CHUNK)) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- fwrite (&ssnd_fmt, sizeof (ssnd_fmt), 1, psf->file) ;
-
- psf->close = (func_close) aiff_close ;
-
- switch (psf->bytewidth)
- { case 1 :
- psf->write_short = (func_short) pcm_write_s2sc ;
- psf->write_int = (func_int) pcm_write_i2sc ;
- psf->write_double = (func_double) pcm_write_d2sc ;
+ error = pcm_write_init (psf) ;
break ;
- case 2 :
- psf->write_short = (func_short) pcm_write_s2bes ;
- psf->write_int = (func_int) pcm_write_i2bes ;
- psf->write_double = (func_double) pcm_write_d2bes ;
+
+ case SF_FORMAT_FLOAT :
+ error = float32_write_init (psf) ;
break ;
- case 3 :
- psf->write_short = (func_short) pcm_write_s2bet ;
- psf->write_int = (func_int) pcm_write_i2bet ;
- psf->write_double = (func_double) pcm_write_d2bet ;
- break ;
- case 4 :
- psf->write_short = (func_short) pcm_write_s2bei ;
- psf->write_int = (func_int) pcm_write_i2bei ;
- psf->write_double = (func_double) pcm_write_d2bei ;
- break ;
+
default : return SFE_UNIMPLEMENTED ;
} ;
- return 0 ;
+ return error ;
} /* aiff_open_write */
-/*------------------------------------------------------------------------------
- */
+/*==========================================================================================
+** Private functions.
+*/
-int aiff_close (SF_PRIVATE *psf)
-{ unsigned int dword ;
-
+static int
+aiff_close (SF_PRIVATE *psf)
+{
if (psf->mode == SF_MODE_WRITE)
{ /* Now we know for certain the length of the file we can re-write
** correct values for the FORM, COMM and SSND chunks.
*/
- fseek (psf->file, 0, SEEK_END) ;
+ aiff_write_tailer (psf) ;
+
+ fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
+ fseek (psf->file, 0, SEEK_SET) ;
- dword = psf->filelength - 2 * sizeof (dword) ;
- fseek (psf->file, sizeof (dword), SEEK_SET) ;
- dword = H2BE_INT (dword) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ; /* FORM */
-
- fseek (psf->file, psf->dataoffset - (long)((sizeof (SSND_CHUNK) + sizeof (dword))), SEEK_SET) ;
psf->datalength = psf->filelength - psf->dataoffset ;
- dword = H2BE_INT (psf->datalength + sizeof (SSND_CHUNK)) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ; /* SSND */
+ psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
- fseek (psf->file, 5 * sizeof (dword) + sizeof (short), SEEK_SET) ;
- dword = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
- dword = H2BE_INT (dword) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ; /* COMM.numSampleFrames */
+ aiff_write_header (psf) ;
} ;
if (psf->fdata)
@@ -441,6 +455,193 @@
return 0 ;
} /* aiff_close */
+static int
+aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
+{ int error = 0, bytesread ;
+
+ bytesread = psf_binheader_readf (psf, "L", &(comm_fmt->size)) ;
+
+ /* 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.
+ */
+
+ bytesread +=
+ psf_binheader_readf (psf, "WLWB", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames),
+ &(comm_fmt->sampleSize), &(comm_fmt->sampleRate), sizeof (comm_fmt->sampleRate)) ;
+
+ if (comm_fmt->size == AIFF_COMM_SIZE)
+ comm_fmt->encoding = NONE_MARKER ;
+ else if (comm_fmt->size >= AIFC_COMM_SIZE)
+ { bytesread +=
+ psf_binheader_readf (psf, "mB", &(comm_fmt->encoding), &(comm_fmt->zero_bytes), 2) ;
+
+ psf_binheader_readf (psf, "B", psf->header, comm_fmt->size - AIFC_COMM_SIZE) ;
+ } ;
+
+ psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ;
+ psf_log_printf (psf, " Sample Rate : %d\n", tenbytefloat2int (comm_fmt->sampleRate)) ;
+ psf_log_printf (psf, " Samples : %d\n", comm_fmt->numSampleFrames) ;
+ psf_log_printf (psf, " Channels : %d\n", comm_fmt->numChannels) ;
+
+ /* Found some broken 'fl32' files with comm.samplesize == 16. Fix it here. */
+
+ if ((comm_fmt->encoding == fl32_MARKER || comm_fmt->encoding == FL32_MARKER) && comm_fmt->sampleSize != 32)
+ { psf_log_printf (psf, " Sample Size : %d (should be 32)\n", comm_fmt->sampleSize) ;
+ comm_fmt->sampleSize = 32 ;
+ }
+ else
+ psf_log_printf (psf, " Sample Size : %d\n", comm_fmt->sampleSize) ;
+
+ switch (comm_fmt->encoding)
+ { case NONE_MARKER :
+ psf->endian = SF_ENDIAN_BIG ;
+ psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM) ;
+ break ;
+
+ case twos_MARKER :
+ psf->endian = SF_ENDIAN_BIG ;
+ psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_BE) ;
+ break ;
+
+ case sowt_MARKER :
+ psf->endian = SF_ENDIAN_LITTLE ;
+ psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_LE) ;
+ break ;
+
+ case fl32_MARKER :
+ case FL32_MARKER :
+ psf->endian = SF_ENDIAN_BIG ;
+ psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
+ break ;
+
+ default :
+ psf_log_printf (psf, "AIFC : Unimplemented format : %D\n", comm_fmt->encoding) ;
+ error = SFE_UNIMPLEMENTED ;
+ } ;
+
+ psf_log_printf (psf, " Encoding : %D\n", comm_fmt->encoding) ;
+
+ return error ;
+} /* aiff_read_comm_chunk */
+
+static int
+aiff_write_header (SF_PRIVATE *psf)
+{ unsigned char comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ;
+ unsigned int comm_type, comm_size, comm_encoding ;
+ int k ;
+
+ switch (psf->sf.format & SF_FORMAT_SUBMASK)
+ { case SF_FORMAT_PCM : /* Standard big endian AIFF. */
+ psf->endian = SF_ENDIAN_BIG ;
+ comm_type = AIFF_MARKER ;
+ comm_size = AIFF_COMM_SIZE ;
+ comm_encoding = 0 ;
+ break ;
+
+ case SF_FORMAT_PCM_BE : /* Big endian AIFC. */
+ psf->endian = SF_ENDIAN_BIG ;
+ comm_type = AIFC_MARKER ;
+ comm_size = AIFC_COMM_SIZE ;
+ comm_encoding = twos_MARKER ;
+ break ;
+
+ case SF_FORMAT_PCM_LE : /* Little endian AIFC. */
+ psf->endian = SF_ENDIAN_LITTLE ;
+ comm_type = AIFC_MARKER ;
+ comm_size = AIFC_COMM_SIZE ;
+ comm_encoding = sowt_MARKER ;
+ break ;
+
+ case SF_FORMAT_FLOAT : /* Big endian floating point. */
+ psf->endian = SF_ENDIAN_BIG ;
+ comm_type = AIFC_MARKER ;
+ comm_size = AIFC_COMM_SIZE ;
+ comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */
+ psf->has_peak = SF_TRUE ;
+ psf->peak_loc = SF_PEAK_START ;
+ break ;
+
+ default : return SFE_BAD_OPEN_FORMAT ;
+ } ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+
+ /* Write COMM chunk. */
+ psf_binheader_writef (psf, "mmL", comm_type, COMM_MARKER, comm_size) ;
+
+ uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate) ;
+
+ psf_binheader_writef (psf, "WLW", psf->sf.channels, psf->sf.samples, psf->sf.pcmbitwidth) ;
+ psf_binheader_writef (psf, "B", comm_sample_rate, sizeof (comm_sample_rate)) ;
+
+ /* AIFC chunks have some extra data. */
+ if (comm_type == AIFC_MARKER)
+ psf_binheader_writef (psf, "mB", comm_encoding, comm_zero_bytes, sizeof (comm_zero_bytes)) ;
+
+ if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
+ { psf_binheader_writef (psf, "mL", PEAK_MARKER,
+ sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+ psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+ for (k = 0 ; k < psf->sf.channels ; k++)
+ psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+ } ;
+
+ /* Write SSND chunk. */
+ psf_binheader_writef (psf, "mLLL", SSND_MARKER, psf->datalength + SSND_CHUNK_SIZE, 0, 0) ;
+
+ /* Header cunstruction complete so write it out. */
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ return 0 ;
+} /* aiff_write_header */
+
+static int
+aiff_write_tailer (SF_PRIVATE *psf)
+{ int k ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
+ { psf_binheader_writef (psf, "mL", PEAK_MARKER,
+ sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+ psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+ for (k = 0 ; k < psf->sf.channels ; k++)
+ psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+ } ;
+
+ if (psf->headindex)
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ return 0 ;
+} /* aiff_write_tailer */
+
+/*-
+static void
+endswap_comm_fmt (COMM_CHUNK *comm)
+{ comm->size = ENDSWAP_INT (comm->size) ;
+ comm->numChannels = ENDSWAP_SHORT (comm->numChannels) ;
+ comm->numSampleFrames = ENDSWAP_INT (comm->numSampleFrames) ;
+ comm->sampleSize = ENDSWAP_SHORT (comm->sampleSize) ;
+} /+* endswap_comm_fmt *+/
+
+static void
+endswap_ssnd_fmt (SSND_CHUNK *ssnd)
+{ ssnd->offset = ENDSWAP_INT (ssnd->offset) ;
+ ssnd->blocksize = ENDSWAP_INT (ssnd->blocksize) ;
+} /+* endswap_ssnd_fmt *+/
+-*/
+
/*==========================================================================================
** Rough hack at converting from 80 bit IEEE float in AIFF header to an int and
** back again. It assumes that all sample rates are between 1 and 800MHz, which
@@ -450,8 +651,8 @@
** has a copyright which probably prevents it from being allowable as GPL/LGPL.
*/
-static
-int tenbytefloat2int (unsigned char *bytes)
+static int
+tenbytefloat2int (unsigned char *bytes)
{ int val = 3 ;
if (bytes [0] & 0x80) /* Negative number. */
@@ -475,8 +676,8 @@
return val ;
} /* tenbytefloat2int */
-static
-void uint2tenbytefloat (unsigned int num, unsigned char *bytes)
+static void
+uint2tenbytefloat (unsigned int num, unsigned char *bytes)
{ int count, mask = 0x40000000 ;
memset (bytes, 0, 10) ;
--- a/common/libsndfile/src/alaw.c
+++ b/common/libsndfile/src/alaw.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -20,18 +20,53 @@
#include <unistd.h>
#include "sndfile.h"
+#include "floatcast.h"
#include "common.h"
+static int alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static int alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int alaw_write_f2alaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
static void alaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
static void alaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
+static void alaw2f_array (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
static void alaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
static void s2alaw_array (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
static void i2alaw_array (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static void f2alaw_array (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
static void d2alaw_array (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
+int
+alaw_read_init (SF_PRIVATE *psf)
+{
+ psf->read_short = (func_short) alaw_read_alaw2s ;
+ psf->read_int = (func_int) alaw_read_alaw2i ;
+ psf->read_float = (func_float) alaw_read_alaw2f ;
+ psf->read_double = (func_double) alaw_read_alaw2d ;
-int alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
+ return 0 ;
+} /* alaw_read_init */
+
+int
+alaw_write_init (SF_PRIVATE *psf)
+{
+ psf->write_short = (func_short) alaw_write_s2alaw ;
+ psf->write_int = (func_int) alaw_write_i2alaw ;
+ psf->write_float = (func_float) alaw_write_f2alaw ;
+ psf->write_double = (func_double) alaw_write_d2alaw ;
+
+ return 0 ;
+} /* alaw_read_init */
+
+static int
+alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -56,7 +91,8 @@
return total ;
} /* alaw_read_alaw2s */
-int alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
+static int
+alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -81,10 +117,40 @@
return total ;
} /* alaw_read_alaw2i */
-int alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+static int
+alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ alaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* alaw_read_alaw2f */
+
+static int
+alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{ unsigned int readcount, thisread, index = 0 ;
+ int bytecount, bufferlen ;
+ int total = 0 ;
double normfact ;
normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
@@ -111,7 +177,8 @@
/*=============================================================================================
*/
-int alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len)
+static int
+alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -136,7 +203,8 @@
return total ;
} /* alaw_write_s2alaw */
-int alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, unsigned int len)
+static int
+alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -161,10 +229,40 @@
return total ;
} /* alaw_write_i2alaw */
-int alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+static int
+alaw_write_f2alaw (SF_PRIVATE *psf, float *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* alaw_write_f2alaw */
+
+static int
+alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{ unsigned int writecount, thiswrite, index = 0 ;
+ int bytecount, bufferlen ;
+ int total = 0 ;
double normfact ;
normfact = (normalize ? ((double) 0x8000) : 1.0) ;
@@ -189,9 +287,6 @@
return total ;
} /* alaw_write_d2alaw */
-
-
-
/*=============================================================================================
* Private static functions and data.
*/
@@ -391,44 +486,56 @@
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x2A
} ; /* alaw_encode */
-static
-void alaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
+static void
+alaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -1 * alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
} /* alaw2s_array */
-static
-void alaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
+static void
+alaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -1 * alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
} /* alaw2i_array */
-static
-void alaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+static void
+alaw2f_array (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -normfact * alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = normfact * alaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
} /* alaw2d_array */
-static
-void s2alaw_array (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+static void
+alaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { if (buffer [k] & 0x80)
+ ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+ else
+ ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+ index ++ ;
+ } ;
+} /* alaw2d_array */
+
+static void
+s2alaw_array (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
@@ -440,8 +547,8 @@
} ;
} /* s2alaw_array */
-static
-void i2alaw_array (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+static void
+i2alaw_array (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
@@ -453,15 +560,28 @@
} ;
} /* i2alaw_array */
-static
-void d2alaw_array (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+static void
+f2alaw_array (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
{ if (ptr [index] >= 0)
- buffer [k] = alaw_encode [((int) (normfact * ptr [index])) / 16] ;
+ buffer [k] = alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 16] ;
else
- buffer [k] = 0x7F & alaw_encode [((int) (normfact * ptr [index])) / -16] ;
+ buffer [k] = 0x7F & alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -16] ;
+ index ++ ;
+ } ;
+} /* f2alaw_array */
+
+static void
+d2alaw_array (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+{ unsigned int k ;
+
+ for (k = 0 ; k < count ; k++)
+ { if (ptr [index] >= 0)
+ buffer [k] = alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 16] ;
+ else
+ buffer [k] = 0x7F & alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -16] ;
index ++ ;
} ;
} /* d2alaw_array */
--- a/common/libsndfile/src/alaw.h
+++ /dev/null
@@ -1,27 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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.
-*/
-
-
-int alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int alaw_read_alaw2i (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int alaw_read_alaw2d (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-
-int alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int alaw_write_i2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int alaw_write_d2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-
--- a/common/libsndfile/src/au.c
+++ b/common/libsndfile/src/au.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -27,27 +27,17 @@
#include "config.h"
#include "sfendian.h"
#include "common.h"
-#include "pcm.h"
#include "au.h"
-#include "ulaw.h"
-#include "alaw.h"
-
/*------------------------------------------------------------------------------
** Macros to handle big/little endian issues.
*/
-#if (CPU_IS_LITTLE_ENDIAN == 1)
- #define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
- #define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
- #error "Cannot determine endian-ness of processor."
-#endif
-
#define DOTSND_MARKER (MAKE_MARKER ('.', 's', 'n', 'd'))
#define DNSDOT_MARKER (MAKE_MARKER ('d', 'n', 's', '.'))
+#define AU_DATA_OFFSET 24
+
/*------------------------------------------------------------------------------
** Known AU file encoding types.
*/
@@ -102,55 +92,63 @@
** Private static functions.
*/
-static int au_close (SF_PRIVATE *psf) ;
+static int au_close (SF_PRIVATE *psf) ;
-static int get_encoding (unsigned int format, unsigned int bitwidth) ;
-static char* get_encoding_str(int format) ;
-static void endswap_au_fmt (AU_FMT *pau_fmt) ;
+static int get_encoding (unsigned int format, unsigned int bitwidth) ;
+static char const* get_encoding_str(int format) ;
+static int au_write_header (SF_PRIVATE *psf) ;
+/*
+static void endswap_au_fmt (AU_FMT *pau_fmt) ;
+*/
+
/*------------------------------------------------------------------------------
** Public functions.
*/
-int au_open_read (SF_PRIVATE *psf)
+int
+au_open_read (SF_PRIVATE *psf)
{ AU_FMT au_fmt ;
unsigned int marker, dword ;
- int big_endian_file, error = SFE_NO_ERROR ;
+ int error = SFE_NO_ERROR ;
- fread (&marker, sizeof (marker), 1, psf->file) ;
+ psf_binheader_readf (psf, "pm", 0, &marker) ;
+ psf_log_printf (psf, "%D\n", marker) ;
+
if (marker == DOTSND_MARKER)
- big_endian_file = 1 ;
+ { psf->endian = SF_ENDIAN_BIG ;
+
+ psf_binheader_readf (psf, "LLLLL", &(au_fmt.dataoffset), &(au_fmt.datasize),
+ &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+ }
else if (marker == DNSDOT_MARKER)
- big_endian_file = 0 ;
+ { psf->endian = SF_ENDIAN_LITTLE ;
+ psf_binheader_readf (psf, "lllll", &(au_fmt.dataoffset), &(au_fmt.datasize),
+ &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+ }
else
return SFE_AU_NO_DOTSND ;
- psf_sprintf (psf, "%D\n", marker) ;
- fread (&au_fmt, sizeof (AU_FMT), 1, psf->file) ;
+ psf_log_printf (psf, " Data Offset : %d\n", au_fmt.dataoffset) ;
- if (CPU_IS_LITTLE_ENDIAN && big_endian_file)
- endswap_au_fmt (&au_fmt) ;
- else if (CPU_IS_BIG_ENDIAN && ! big_endian_file)
- endswap_au_fmt (&au_fmt) ;
-
- psf_sprintf (psf, " Data Offset : %d\n", au_fmt.dataoffset) ;
-
- if (au_fmt.dataoffset + au_fmt.datasize != psf->filelength)
- { dword = psf->filelength - au_fmt.dataoffset ;
- psf_sprintf (psf, " Data Size : %d (should be %d)\n", au_fmt.datasize, dword) ;
- au_fmt.datasize = dword ;
+ if (au_fmt.datasize == 0xFFFFFFFF || au_fmt.dataoffset + au_fmt.datasize == psf->filelength)
+ psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ;
+ else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength)
+ { psf->filelength = au_fmt.dataoffset + au_fmt.dataoffset ;
+ psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ;
}
else
- psf_sprintf (psf, " Data Size : %d\n", au_fmt.datasize) ;
+ { dword = psf->filelength - au_fmt.dataoffset ;
+ psf_log_printf (psf, " Data Size : %d (should be %d)\n", au_fmt.datasize, dword) ;
+ au_fmt.datasize = dword ;
+ } ;
psf->dataoffset = au_fmt.dataoffset ;
psf->datalength = psf->filelength - psf->dataoffset ;
psf->current = 0 ;
- psf->endian = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
- psf->sf.seekable = SF_TRUE ;
if (fseek (psf->file, psf->dataoffset, SEEK_SET))
return SFE_BAD_SEEK ;
@@ -161,39 +159,30 @@
psf->sf.channels = au_fmt.channels ;
/* Only fill in type major. */
- psf->sf.format = big_endian_file ? SF_FORMAT_AU : SF_FORMAT_AULE ;
+ if (psf->endian == SF_ENDIAN_BIG)
+ psf->sf.format = SF_FORMAT_AU ;
+ else if (psf->endian == SF_ENDIAN_LITTLE)
+ psf->sf.format = SF_FORMAT_AULE ;
psf->sf.sections = 1 ;
- psf_sprintf (psf, " Encoding : %d => %s\n", au_fmt.encoding, get_encoding_str (au_fmt.encoding)) ;
+ psf_log_printf (psf, " Encoding : %d => %s\n", au_fmt.encoding, get_encoding_str (au_fmt.encoding)) ;
- psf_sprintf (psf, " Sample Rate : %d\n", au_fmt.samplerate) ;
- psf_sprintf (psf, " Channels : %d\n", au_fmt.channels) ;
+ psf_log_printf (psf, " Sample Rate : %d\n", au_fmt.samplerate) ;
+ psf_log_printf (psf, " Channels : %d\n", au_fmt.channels) ;
switch (au_fmt.encoding)
- { case AU_ENCODING_ULAW_8 :
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
- psf->bytewidth = 1 ; /* Before decoding */
- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
- psf->sf.format |= SF_FORMAT_ULAW ;
-
- psf->read_short = (func_short) ulaw_read_ulaw2s ;
- psf->read_int = (func_int) ulaw_read_ulaw2i ;
- psf->read_double = (func_double) ulaw_read_ulaw2d ;
-
- break ;
-
- case AU_ENCODING_PCM_8 :
+ { case AU_ENCODING_PCM_8 :
psf->sf.pcmbitwidth = 8 ;
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
psf->blockwidth = psf->sf.channels * psf->bytewidth ;
psf->sf.format |= SF_FORMAT_PCM ;
-
- psf->read_short = (func_short) pcm_read_sc2s ;
- psf->read_int = (func_int) pcm_read_sc2i ;
- psf->read_double = (func_double) pcm_read_sc2d ;
+
+ psf->chars = SF_CHARS_SIGNED ;
+
+ if ((error = pcm_read_init (psf)))
+ return error ;
break ;
case AU_ENCODING_PCM_16 :
@@ -203,16 +192,8 @@
psf->sf.format |= SF_FORMAT_PCM ;
- if (big_endian_file)
- { psf->read_short = (func_short) pcm_read_bes2s ;
- psf->read_int = (func_int) pcm_read_bes2i ;
- psf->read_double = (func_double) pcm_read_bes2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_les2s ;
- psf->read_int = (func_int) pcm_read_les2i ;
- psf->read_double = (func_double) pcm_read_les2d ;
- } ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
break ;
case AU_ENCODING_PCM_24 :
@@ -222,16 +203,8 @@
psf->sf.format |= SF_FORMAT_PCM ;
- if (big_endian_file)
- { psf->read_short = (func_short) pcm_read_bet2s ;
- psf->read_int = (func_int) pcm_read_bet2i ;
- psf->read_double = (func_double) pcm_read_bet2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_let2s ;
- psf->read_int = (func_int) pcm_read_let2i ;
- psf->read_double = (func_double) pcm_read_let2d ;
- } ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
break ;
case AU_ENCODING_PCM_32 :
@@ -241,59 +214,19 @@
psf->sf.format |= SF_FORMAT_PCM ;
- if (big_endian_file)
- { psf->read_short = (func_short) pcm_read_bei2s ;
- psf->read_int = (func_int) pcm_read_bei2i ;
- psf->read_double = (func_double) pcm_read_bei2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_lei2s ;
- psf->read_int = (func_int) pcm_read_lei2i ;
- psf->read_double = (func_double) pcm_read_lei2d ;
- } ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
break ;
- case AU_ENCODING_ALAW_8 :
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
- psf->bytewidth = 1 ; /* Before decoding */
+ case AU_ENCODING_FLOAT :
+ psf->sf.pcmbitwidth = 32 ;
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
- psf->sf.format |= SF_FORMAT_ALAW ;
-
- psf->read_short = (func_short) alaw_read_alaw2s ;
- psf->read_int = (func_int) alaw_read_alaw2i ;
- psf->read_double = (func_double) alaw_read_alaw2d ;
- break ;
- case AU_ENCODING_ADPCM_G721_32 : /* G721 32kbs ADPCM */
- if (psf->sf.channels != 1)
- { psf_sprintf (psf, "Channels != 1\n") ;
- break ;
- } ;
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
-
- psf->sf.format |= SF_FORMAT_G721_32 ;
-
- error = au_g72x_reader_init (psf, AU_H_G721_32) ;
- psf->sf.seekable = SF_FALSE ;
+ psf->sf.format |= SF_FORMAT_FLOAT ;
+
+ float32_read_init (psf) ;
break ;
-
- case AU_ENCODING_ADPCM_G723_24 : /* G723 24kbs ADPCM */
- if (psf->sf.channels != 1)
- { psf_sprintf (psf, "Channels != 1\n") ;
- break ;
- } ;
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
-
- psf->sf.format |= SF_FORMAT_G723_24 ;
-
- error = au_g72x_reader_init (psf, AU_H_G723_24) ;
- psf->sf.seekable = SF_FALSE ;
- break ;
-
- case AU_ENCODING_NEXT :
- error = SFE_AU_UNKNOWN_FORMAT ;
- break ;
default :
error = SFE_AU_UNKNOWN_FORMAT ;
@@ -310,53 +243,21 @@
return 0 ;
} /* au_open_read */
-/*------------------------------------------------------------------------------
-*/
-int au_nh_open_read (SF_PRIVATE *psf)
-{ if (fseek (psf->file, psf->dataoffset, SEEK_SET))
- return SFE_BAD_SEEK ;
-
- psf_sprintf (psf, "Setting up for 8kHz, mono, u-law.\n") ;
-
- psf->sf.format = SF_FORMAT_AU | SF_FORMAT_ULAW ;
-
- psf->dataoffset = 0 ;
- psf->current = 0 ;
- psf->endian = 0 ; /* Irrelevant but it must be something. */
- psf->sf.seekable = SF_TRUE ;
- psf->sf.samplerate = 8000 ;
- psf->sf.channels = 1 ;
- psf->sf.sections = 1 ;
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
- psf->bytewidth = 1 ; /* Before decoding */
-
- psf->read_short = (func_short) ulaw_read_ulaw2s ;
- psf->read_int = (func_int) ulaw_read_ulaw2i ;
- psf->read_double = (func_double) ulaw_read_ulaw2d ;
- psf->close = (func_close) au_close ;
-
- psf->blockwidth = 1 ;
- psf->sf.samples = psf->filelength ;
- psf->datalength = psf->filelength ;
-
- return 0 ;
-} /* au_open_read */
-
/*------------------------------------------------------------------------------
*/
-int au_open_write (SF_PRIVATE *psf)
-{ AU_FMT au_fmt ;
- unsigned int dword, encoding, format, subformat, big_endian_file ;
+int
+au_open_write (SF_PRIVATE *psf)
+{ unsigned int encoding, format, subformat ;
int error = 0 ;
-
+
format = psf->sf.format & SF_FORMAT_TYPEMASK ;
subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
if (format == SF_FORMAT_AU)
- big_endian_file = 1 ;
+ psf->endian = SF_ENDIAN_BIG ;
else if (format == SF_FORMAT_AULE)
- big_endian_file = 0 ;
+ psf->endian = SF_ENDIAN_LITTLE ;
else
return SFE_BAD_OPEN_FORMAT ;
@@ -366,122 +267,37 @@
else
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
- psf->endian = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
psf->sf.seekable = SF_TRUE ;
+ psf->error = 0 ;
+
psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- psf->dataoffset = 6 * sizeof (dword) ;
+ psf->dataoffset = AU_DATA_OFFSET ;
psf->datalength = psf->blockwidth * psf->sf.samples ;
psf->filelength = psf->datalength + psf->dataoffset ;
- psf->error = 0 ;
- encoding = get_encoding (subformat, psf->bytewidth * 8) ;
- if (! encoding)
- return SFE_BAD_OPEN_FORMAT ;
+ if (! (encoding = au_write_header (psf)))
+ return psf->error ;
- au_fmt.dataoffset = 24 ;
- au_fmt.datasize = psf->datalength ;
- au_fmt.encoding = encoding ;
- au_fmt.samplerate = psf->sf.samplerate ;
- au_fmt.channels = psf->sf.channels ;
+ psf->close = (func_close) au_close ;
+ psf->write_header = (func_wr_hdr) au_write_header ;
- if (CPU_IS_LITTLE_ENDIAN && big_endian_file)
- endswap_au_fmt (&au_fmt) ;
- else if (CPU_IS_BIG_ENDIAN && ! big_endian_file)
- endswap_au_fmt (&au_fmt) ;
-
- dword = big_endian_file ? DOTSND_MARKER : DNSDOT_MARKER ; /* Marker */
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- fwrite (&au_fmt, sizeof (AU_FMT), 1, psf->file) ;
-
- psf->close = (func_close) au_close ;
-
switch (encoding)
- { case AU_ENCODING_ULAW_8 : /* 8-bit Ulaw encoding. */
- psf->write_short = (func_short) ulaw_write_s2ulaw ;
- psf->write_int = (func_int) ulaw_write_i2ulaw ;
- psf->write_double = (func_double) ulaw_write_d2ulaw ;
- break ;
-
- case AU_ENCODING_PCM_8 : /* 8-bit linear PCM. */
- psf->write_short = (func_short) pcm_write_s2sc ;
- psf->write_int = (func_int) pcm_write_i2sc ;
- psf->write_double = (func_double) pcm_write_d2sc ;
- break ;
+ { case AU_ENCODING_PCM_8 : /* 8-bit linear PCM. */
+ psf->chars = SF_CHARS_SIGNED ;
- case AU_ENCODING_PCM_16 : /* 16-bit linear PCM. */
- if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bes ;
- psf->write_int = (func_int) pcm_write_i2bes ;
- psf->write_double = (func_double) pcm_write_d2bes ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2les ;
- psf->write_int = (func_int) pcm_write_i2les ;
- psf->write_double = (func_double) pcm_write_d2les ;
- } ;
+ error = pcm_write_init (psf) ;
break ;
+ case AU_ENCODING_PCM_16 : /* 16-bit linear PCM. */
case AU_ENCODING_PCM_24 : /* 24-bit linear PCM */
- if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bet ;
- psf->write_int = (func_int) pcm_write_i2bet ;
- psf->write_double = (func_double) pcm_write_d2bet ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2let ;
- psf->write_int = (func_int) pcm_write_i2let ;
- psf->write_double = (func_double) pcm_write_d2let ;
- } ;
- break ;
-
case AU_ENCODING_PCM_32 : /* 32-bit linear PCM. */
- if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bei ;
- psf->write_int = (func_int) pcm_write_i2bei ;
- psf->write_double = (func_double) pcm_write_d2bei ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2lei ;
- psf->write_int = (func_int) pcm_write_i2lei ;
- psf->write_double = (func_double) pcm_write_d2lei ;
- } ;
+ error = pcm_write_init (psf) ;
break ;
-
- case AU_ENCODING_ALAW_8 : /* 8-bit Alaw encoding. */
- psf->write_short = (func_short) alaw_write_s2alaw ;
- psf->write_int = (func_int) alaw_write_i2alaw ;
- psf->write_double = (func_double) alaw_write_d2alaw ;
- break ;
-
- case AU_ENCODING_ADPCM_G721_32 :
- if (psf->sf.channels != 1)
- { psf_sprintf (psf, "Channels != 1\n") ;
- break ;
- } ;
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
- psf->bytewidth = 0 ;
- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
- psf->sf.format |= SF_FORMAT_G721_32 ;
-
- error = au_g72x_writer_init (psf, AU_H_G721_32) ;
- break ;
- case AU_ENCODING_ADPCM_G723_24 :
- if (psf->sf.channels != 1)
- { psf_sprintf (psf, "Channels != 1\n") ;
- break ;
- } ;
- psf->sf.pcmbitwidth = 16 ; /* After decoding */
- psf->bytewidth = 0 ;
- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
- psf->sf.format |= SF_FORMAT_G721_32 ;
-
- error = au_g72x_writer_init (psf, AU_H_G723_24) ;
+ case AU_ENCODING_FLOAT : /* 32-bit linear PCM. */
+ error = float32_write_init (psf) ;
break ;
-
+
default : break ;
} ;
@@ -491,9 +307,9 @@
/*------------------------------------------------------------------------------
*/
-int au_close (SF_PRIVATE *psf)
-{ unsigned int dword ;
-
+static int
+au_close (SF_PRIVATE *psf)
+{
if (psf->mode == SF_MODE_WRITE)
{ /* Now we know for certain the length of the file we can
* re-write correct values for the datasize header element.
@@ -502,16 +318,11 @@
fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
- psf->datalength = psf->filelength - psf->dataoffset ;
- fseek (psf->file, 2 * sizeof (dword), SEEK_SET) ;
+ psf->datalength = psf->filelength - AU_DATA_OFFSET ;
+ fseek (psf->file, 0, SEEK_SET) ;
- if (psf->endian == SF_ENDIAN_BIG)
- dword = H2BE_INT (psf->datalength) ;
- else if (psf->endian == SF_ENDIAN_LITTLE)
- dword = H2LE_INT (psf->datalength) ;
- else
- dword = 0xFFFFFFFF ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+ psf->sf.samples = psf->datalength / psf->blockwidth ;
+ au_write_header (psf) ;
} ;
if (psf->fdata)
@@ -521,8 +332,44 @@
return 0 ;
} /* au_close */
-static
-int get_encoding (unsigned int format, unsigned int bitwidth)
+static int
+au_write_header (SF_PRIVATE *psf)
+{ int encoding ;
+
+ encoding = get_encoding (psf->sf.format & SF_FORMAT_SUBMASK, psf->bytewidth * 8) ;
+ if (! encoding)
+ { psf->error = SFE_BAD_OPEN_FORMAT ;
+ return encoding ;
+ } ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ { psf_binheader_writef (psf, "mL", DOTSND_MARKER, AU_DATA_OFFSET) ;
+ psf_binheader_writef (psf, "LLLL", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+ }
+ else if (psf->endian == SF_ENDIAN_LITTLE)
+ { psf_binheader_writef (psf, "ml", DNSDOT_MARKER, AU_DATA_OFFSET) ;
+ psf_binheader_writef (psf, "llll", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+ }
+ else
+ { psf->error = SFE_BAD_OPEN_FORMAT ;
+ return encoding ;
+ } ;
+
+ /* Header construction complete so write it out. */
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ return encoding ;
+} /* au_write_header */
+
+static int
+get_encoding (unsigned int format, unsigned int bitwidth)
{ if (format == SF_FORMAT_ULAW)
return AU_ENCODING_ULAW_8 ;
@@ -535,6 +382,9 @@
if (format == SF_FORMAT_G723_24)
return AU_ENCODING_ADPCM_G723_24 ;
+ if (format == SF_FORMAT_FLOAT)
+ return AU_ENCODING_FLOAT ;
+
if (format != SF_FORMAT_PCM)
return 0 ;
@@ -547,19 +397,21 @@
default : break ;
} ;
return 0 ;
-} /* get encoding */
+} /* get_encoding */
-static
-void endswap_au_fmt (AU_FMT *pau_fmt)
+/*-
+static void
+endswap_au_fmt (AU_FMT *pau_fmt)
{ pau_fmt->dataoffset = ENDSWAP_INT (pau_fmt->dataoffset) ;
pau_fmt->datasize = ENDSWAP_INT (pau_fmt->datasize) ;
pau_fmt->encoding = ENDSWAP_INT (pau_fmt->encoding) ;
pau_fmt->samplerate = ENDSWAP_INT (pau_fmt->samplerate) ;
pau_fmt->channels = ENDSWAP_INT (pau_fmt->channels) ;
-} /* endswap_au_fmt */
+} /+* endswap_au_fmt *+/
+-*/
-static
-char* get_encoding_str (int format)
+static char const*
+get_encoding_str (int format)
{ switch (format)
{ case AU_ENCODING_ULAW_8 :
return "8-bit ISDN u-law" ;
@@ -575,6 +427,9 @@
case AU_ENCODING_PCM_32 :
return "32-bit linear PCM" ;
+
+ case AU_ENCODING_FLOAT :
+ return "32-bit float" ;
case AU_ENCODING_ALAW_8 :
return "8-bit ISDN A-law" ;
--- a/common/libsndfile/src/au.h
+++ b/common/libsndfile/src/au.h
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
--- a/common/libsndfile/src/au_g72x.c
+++ b/common/libsndfile/src/au_g72x.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -16,15 +16,15 @@
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
-#include "sndfile.h"
#include "config.h"
+#include "sndfile.h"
#include "sfendian.h"
+#include "floatcast.h"
#include "common.h"
#include "au.h"
#include "G72x/g72x.h"
@@ -37,13 +37,15 @@
static int au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
static int au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int au_g72x_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
static int au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
static int au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
static int au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int au_g72x_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
static int au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static off_t au_g72x_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
+static long au_g72x_seek (SF_PRIVATE *psf, long offset, int whence) ;
static int au_g72x_close (SF_PRIVATE *psf) ;
@@ -52,7 +54,8 @@
** WAV G721 Reader initialisation function.
*/
-int au_g72x_reader_init (SF_PRIVATE *psf, int codec)
+int
+au_g72x_reader_init (SF_PRIVATE *psf, int codec)
{ G72x_DATA *pg72x ;
int bitspersample ;
@@ -86,6 +89,7 @@
psf->read_short = (func_short) au_g72x_read_s ;
psf->read_int = (func_int) au_g72x_read_i ;
+ psf->read_float = (func_float) au_g72x_read_f ;
psf->read_double = (func_double) au_g72x_read_d ;
psf->seek_func = (func_seek) au_g72x_seek ;
@@ -99,7 +103,7 @@
psf->sf.samples = (8 * psf->datalength) / bitspersample ;
if ((psf->sf.samples * bitspersample) / 8 != psf->datalength)
- psf_sprintf (psf, "*** Warning : weird psf->datalength.\n") ;
+ psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ;
psf->blockwidth = psf->bytewidth = 1 ;
@@ -112,7 +116,8 @@
** WAV G721 writer initialisation function.
*/
-int au_g72x_writer_init (SF_PRIVATE *psf, int codec)
+int
+au_g72x_writer_init (SF_PRIVATE *psf, int codec)
{ G72x_DATA *pg72x ;
psf->sf.seekable = SF_FALSE ;
@@ -143,6 +148,7 @@
psf->write_short = (func_short) au_g72x_write_s ;
psf->write_int = (func_int) au_g72x_write_i ;
+ psf->write_float = (func_float) au_g72x_write_f ;
psf->write_double = (func_double) au_g72x_write_d ;
psf->seek_func = (func_seek) au_g72x_seek ;
@@ -159,8 +165,8 @@
** G721 Read Functions.
*/
-static
-int au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+static int
+au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
{ int k ;
pg72x->blockcount ++ ;
@@ -172,7 +178,7 @@
} ;
if ((k = fread (pg72x->block, 1, pg72x->bytesperblock, psf->file)) != pg72x->bytesperblock)
- psf_sprintf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ;
+ psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ;
pg72x->blocksize = k ;
g72x_decode_block (pg72x) ;
@@ -180,8 +186,8 @@
return 1 ;
} /* au_g72x_read_block */
-static
-int au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
+static int
+au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -205,8 +211,8 @@
return total ;
} /* au_g72x_read */
-static
-int au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len)
{ G72x_DATA *pg72x ;
int total ;
@@ -219,8 +225,8 @@
return total ;
} /* au_g72x_read_s */
-static
-int au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len)
{ G72x_DATA *pg72x ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
@@ -244,17 +250,20 @@
return total ;
} /* au_g72x_read_i */
-static
-int au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+au_g72x_read_f (SF_PRIVATE *psf, float *ptr, int len)
{ G72x_DATA *pg72x ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
if (! psf->fdata)
return 0 ;
pg72x = (G72x_DATA*) psf->fdata ;
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
sptr = (short*) psf->buffer ;
bufferlen = SF_BUFFER_LEN / sizeof (short) ;
while (len > 0)
@@ -261,7 +270,7 @@
{ readcount = (len >= bufferlen) ? bufferlen : len ;
count = au_g72x_read (psf, pg72x, sptr, readcount) ;
for (k = 0 ; k < readcount ; k++)
- ptr [index+k] = (double) (sptr [k]) ;
+ ptr [index+k] = normfact * sptr [k] ;
index += readcount ;
total += count ;
len -= readcount ;
@@ -268,10 +277,39 @@
} ;
return total ;
+} /* au_g72x_read_f */
+
+static int
+au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ G72x_DATA *pg72x ;
+ short *sptr ;
+ int k, bufferlen, readcount = 0, count ;
+ int index = 0, total = 0 ;
+ double normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pg72x = (G72x_DATA*) psf->fdata ;
+
+ normfact = (normalize) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+ while (len > 0)
+ { readcount = (len >= bufferlen) ? bufferlen : len ;
+ count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+ for (k = 0 ; k < readcount ; k++)
+ ptr [index+k] = normfact * (double) (sptr [k]) ;
+ index += readcount ;
+ total += count ;
+ len -= readcount ;
+ } ;
+
+ return total ;
} /* au_g72x_read_d */
-static
-off_t au_g72x_seek (SF_PRIVATE *psf, off_t offset, int whence)
+static long
+au_g72x_seek (SF_PRIVATE *psf, long offset, int whence)
{
/* No simple solution. To do properly, would need to seek
@@ -290,7 +328,7 @@
**
** if (! (psf->datalength && psf->dataoffset))
** { psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
**
** samplecount = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ;
@@ -299,7 +337,7 @@
** { case SEEK_SET :
** if (offset < 0 || offset > samplecount)
** { psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
** newblock = offset / pg72x->samplesperblock ;
** newsample = offset % pg72x->samplesperblock ;
@@ -308,7 +346,7 @@
** case SEEK_CUR :
** if (psf->current + offset < 0 || psf->current + offset > samplecount)
** { psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
** newblock = (8 * (psf->current + offset)) / pg72x->samplesperblock ;
** newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ;
@@ -317,7 +355,7 @@
** case SEEK_END :
** if (offset > 0 || samplecount + offset < 0)
** { psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
** newblock = (samplecount + offset) / pg72x->samplesperblock ;
** newsample = (samplecount + offset) % pg72x->samplesperblock ;
@@ -325,7 +363,7 @@
**
** default :
** psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
**
** if (psf->mode == SF_MODE_READ)
@@ -337,7 +375,7 @@
** else
** { /+* What to do about write??? *+/
** psf->error = SFE_BAD_SEEK ;
-** return ((off_t) -1) ;
+** return ((long) -1) ;
** } ;
**
** psf->current = newblock * pg72x->samplesperblock + newsample ;
@@ -347,16 +385,11 @@
} /* au_g72x_seek */
/*==========================================================================================
-** G721 Write Functions.
+** G72x Write Functions.
*/
-
-
-/*==========================================================================================
-*/
-
-static
-int au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+static int
+au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
{ int k ;
/* Encode the samples. */
@@ -364,7 +397,7 @@
/* Write the block to disk. */
if ((k = fwrite (pg72x->block, 1, pg72x->blocksize, psf->file)) != pg72x->blocksize)
- psf_sprintf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ;
pg72x->samplecount = 0 ;
pg72x->blockcount ++ ;
@@ -375,8 +408,8 @@
return 1 ;
} /* au_g72x_write_block */
-static
-int au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
+static int
+au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -397,8 +430,8 @@
return total ;
} /* au_g72x_write */
-static
-int au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len)
{ G72x_DATA *pg72x ;
int total ;
@@ -411,8 +444,8 @@
return total ;
} /* au_g72x_write_s */
-static
-int au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len)
{ G72x_DATA *pg72x ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
@@ -427,7 +460,7 @@
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- sptr [k] = (short) ptr [index+k] ;
+ sptr [k] = ptr [index+k] ;
count = au_g72x_write (psf, pg72x, sptr, writecount) ;
index += writecount ;
total += count ;
@@ -436,23 +469,54 @@
return total ;
} /* au_g72x_write_i */
-static
-int au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+au_g72x_write_f (SF_PRIVATE *psf, float *ptr, int len)
{ G72x_DATA *pg72x ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pg72x = (G72x_DATA*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { writecount = (len >= bufferlen) ? bufferlen : len ;
+ for (k = 0 ; k < writecount ; k++)
+ sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
+ count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+ index += writecount ;
+ total += count ;
+ len -= writecount ;
+ } ;
+ return total ;
+} /* au_g72x_write_f */
+
+static int
+au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ G72x_DATA *pg72x ;
+ short *sptr ;
+ int k, bufferlen, writecount = 0, count ;
+ int index = 0, total = 0 ;
+ double normfact ;
+
if (! psf->fdata)
return 0 ;
pg72x = (G72x_DATA*) psf->fdata ;
+ normfact = (normalize) ? ((float) 0x8000) : 1.0 ;
+
sptr = (short*) psf->buffer ;
bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- sptr [k] = (short) ptr [index+k] ;
+ sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
count = au_g72x_write (psf, pg72x, sptr, writecount) ;
index += writecount ;
total += count ;
@@ -461,8 +525,8 @@
return total ;
} /* au_g72x_write_d */
-static
-int au_g72x_close (SF_PRIVATE *psf)
+static int
+au_g72x_close (SF_PRIVATE *psf)
{ G72x_DATA *pg72x ;
if (! psf->fdata)
@@ -478,12 +542,18 @@
if (pg72x->samplecount && pg72x->samplecount < G72x_BLOCK_SIZE)
au_g72x_write_block (psf, pg72x) ;
-
-
/* Now we know for certain the length of the file we can
** re-write correct values for the RIFF and data chunks.
*/
-
+
+ fseek (psf->file, 0, SEEK_END) ;
+ psf->filelength = ftell (psf->file) ;
+
+ psf->sf.samples = pg72x->samplesperblock * pg72x->blockcount ;
+ psf->datalength = psf->filelength - psf->dataoffset ;
+
+ if (psf->write_header)
+ psf->write_header (psf) ;
} ;
if (psf->fdata)
--- a/common/libsndfile/src/common.c
+++ b/common/libsndfile/src/common.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -18,6 +18,7 @@
#include <stdarg.h>
#include <string.h>
+#include <math.h>
#include "sndfile.h"
#include "sfendian.h"
@@ -24,15 +25,18 @@
#include "common.h"
/*-----------------------------------------------------------------------------------------------
- */
+** Generic functions for performing endian swapping on short and int arrays.
+*/
-void endswap_short_array (short *ptr, int len)
+void
+endswap_short_array (short *ptr, int len)
{ int k ;
for (k = 0 ; k < len ; k++)
ptr[k] = ((((ptr[k])>>8)&0xFF)|(((ptr[k])&0xFF)<<8)) ;
} /* endswap_short_array */
-void endswap_int_array (int *ptr, int len)
+void
+endswap_int_array (int *ptr, int len)
{ int k ;
for (k = 0 ; k < len ; k++)
ptr[k] = ((((ptr[k])>>24)&0xFF)|(((ptr[k])>>8)&0xFF00)|
@@ -40,15 +44,22 @@
} /* endswap_int_array */
/*-----------------------------------------------------------------------------------------------
- */
+** psf_log_printf allows libsndfile internal functions to print to an internal logbuffer 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 done in such a way as to guarantee that the log never overflows the end of the
+** logbuffer array.
+*/
#define psf_putchar(a,b) \
- if ((a)->strindex < SF_BUFFER_LEN - 1) \
- { (a)->strbuffer [(a)->strindex++] = (b) ; \
- (a)->strbuffer [(a)->strindex] = 0 ; \
+ if ((a)->logindex < SF_BUFFER_LEN - 1) \
+ { (a)->logbuffer [(a)->logindex++] = (b) ; \
+ (a)->logbuffer [(a)->logindex] = 0 ; \
} ;
-void psf_sprintf (SF_PRIVATE *psf, char *format, ...)
+void
+psf_log_printf (SF_PRIVATE *psf, char *format, ...)
{ va_list ap ;
int d, tens, shift ;
char c, *strptr, istr [5] ;
@@ -55,7 +66,7 @@
va_start(ap, format);
- /* printf ("psf_sprintf : %s\n", format) ; */
+ /* printf ("psf_log_printf : %s\n", format) ; */
while ((c = *format++))
{ if (c != '%')
@@ -136,9 +147,9 @@
break;
default :
- psf_putchar (psf, '?') ;
+ psf_putchar (psf, '*') ;
psf_putchar (psf, c) ;
- psf_putchar (psf, '?') ;
+ psf_putchar (psf, '*') ;
break ;
} /* switch */
} /* while */
@@ -145,24 +156,65 @@
va_end(ap);
return ;
-} /* psf_sprintf */
+} /* psf_log_printf */
-/*------------------------------------------------------------------------------
-** Format specifiers for psf_hprintf are as follows
-** m - marker - four bytes - no endian problems
+/*-----------------------------------------------------------------------------------------------
+** ASCII header printf functions.
+** Some formats (ie NIST) use ascii text in their headers.
+** Format specifiers are the same as the standard printf specifiers (uses vsnprintf).
+** If this generates a compile error on any system, the author should be notified
+** so an alternative vsnprintf can be provided.
+*/
+
+void
+psf_asciiheader_printf (SF_PRIVATE *psf, char *format, ...)
+{ va_list argptr ;
+ int maxlen ;
+ char *start ;
+
+ start = (char*) psf->header + strlen ((char*) psf->header) ;
+ maxlen = sizeof (psf->header) - strlen ((char*) psf->header) ;
+
+ va_start (argptr, format) ;
+ vsnprintf (start, maxlen, format, argptr) ;
+ va_end (argptr) ;
+
+ /* Make sure the string is properly terminated. */
+ start [maxlen - 1] = 0 ;
+
+ return ;
+} /* psf_asciiheader_printf */
+
+/*-----------------------------------------------------------------------------------------------
+** Binary header writing functions. Returns number of bytes written.
+**
+** Format specifiers for psf_binheader_writef are as follows
+** m - marker - four bytes - no endian manipulation
+**
+** b - byte
+**
** w - two byte value - little endian
** W - two byte value - big endian
** l - four byte value - little endian
** L - four byte value - big endian
+**
** s - string preceded by a little endian four byte length
** S - string preceded by a big endian four byte length
-** b - binary data (see below)
**
+** f - little endian 32 bit float
+** F - big endian 32 bit float
+**
+** B - binary data (see below)
+** z - zero bytes (se below)
+**
** To write a word followed by a long (both little endian) use:
-** psf_hprintf ("wl", wordval, longval) ;
+** psf_binheader_writef ("wl", wordval, longval) ;
**
** To write binary data use:
-** psf_hprintf ("b", &bindata, sizeof (bindata)) ;
+** psf_binheader_writef ("B", &bindata, sizeof (bindata)) ;
+**
+** To write N zero bytes use:
+** psf_binheader_writef ("z", N) ;
*/
/* These macros may seem a bit messy but do prevent problems with processors which
@@ -170,20 +222,25 @@
*/
#if (CPU_IS_BIG_ENDIAN == 1)
-#define put_int(psf,x) { (psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ; \
+#define PUT_INT(psf,x) if ((psf)->headindex < sizeof ((psf)->header) - 4) \
+ { (psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ; \
(psf)->header [(psf)->headindex++] = (x) & 0xFF ; }
-
-#define put_short(psf,x) { (psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ; \
+
+#define PUT_SHORT(psf,x) if ((psf)->headindex < sizeof ((psf)->header) - 2) \
+ { (psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ; \
(psf)->header [(psf)->headindex++] = (x) & 0xFF ; }
+
#elif (CPU_IS_LITTLE_ENDIAN == 1)
-#define put_int(psf,x) { (psf)->header [(psf)->headindex++] = (x) & 0xFF ; \
+#define PUT_INT(psf,x) if ((psf)->headindex < sizeof ((psf)->header) - 4) \
+ { (psf)->header [(psf)->headindex++] = (x) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ; }
-#define put_short(psf,x) { (psf)->header [(psf)->headindex++] = (x) & 0xFF ; \
+#define PUT_SHORT(psf,x) if ((psf)->headindex < sizeof ((psf)->header) - 2) \
+ { (psf)->header [(psf)->headindex++] = (x) & 0xFF ; \
(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ; }
#else
@@ -190,13 +247,18 @@
# error "Cannot determine endian-ness of processor."
#endif
-void psf_hprintf (SF_PRIVATE *psf, char *format, ...)
+#define PUT_BYTE(psf,x) if ((psf)->headindex < sizeof ((psf)->header) - 1) \
+ { (psf)->header [(psf)->headindex++] = (x) & 0xFF ; }
+
+int
+psf_binheader_writef (SF_PRIVATE *psf, char *format, ...)
{ va_list argptr ;
- unsigned int longdata ;
- unsigned short worddata ;
- void *bindata ;
- size_t size ;
- char c, *strptr ;
+ unsigned int data ;
+ float floatdata ;
+ void *bindata ;
+ size_t size ;
+ char c, *strptr ;
+ int count = 0 ;
va_start(argptr, format);
@@ -203,165 +265,419 @@
while ((c = *format++))
{ switch (c)
{ case 'm' :
- longdata = va_arg (argptr, unsigned int) ;
- put_int (psf, longdata) ;
+ data = va_arg (argptr, unsigned int) ;
+ PUT_INT (psf, data) ;
+ count += 4 ;
break ;
- case 'l' :
- longdata = va_arg (argptr, unsigned int) ;
- longdata = H2LE_INT (longdata) ;
- put_int (psf, longdata) ;
+ case 'b' :
+ data = va_arg (argptr, unsigned int) ;
+ PUT_BYTE (psf, data) ;
+ count += 1 ;
break ;
-
- case 'L' :
- longdata = va_arg (argptr, unsigned int) ;
- longdata = H2BE_INT (longdata) ;
- put_int (psf, longdata) ;
- break ;
case 'w' :
- worddata = va_arg (argptr, int) & 0xFFFF ;
- worddata = H2LE_SHORT (worddata) ;
- put_short (psf, worddata) ;
+ data = va_arg (argptr, unsigned int) ;
+ data = H2LE_SHORT (data) ;
+ PUT_SHORT (psf, data) ;
+ count += 2 ;
break ;
case 'W' :
- worddata = va_arg (argptr, int) & 0xFFFF ;
- worddata = H2BE_SHORT (worddata) ;
- put_short (psf, worddata) ;
+ data = va_arg (argptr, unsigned int) ;
+ data = H2BE_SHORT (data) ;
+ PUT_SHORT (psf, data) ;
+ count += 2 ;
break ;
- case 'b' :
- bindata = va_arg (argptr, void *) ;
- size = va_arg (argptr, size_t) ;
- memcpy (&(psf->header [psf->headindex]), bindata, size) ;
- psf->headindex += size ;
+ case 'l' :
+ data = va_arg (argptr, unsigned int) ;
+ data = H2LE_INT (data) ;
+ PUT_INT (psf, data) ;
+ count += 4 ;
break ;
-
+
+ case 'L' :
+ data = va_arg (argptr, unsigned int) ;
+ data = H2BE_INT (data) ;
+ PUT_INT (psf, data) ;
+ count += 4 ;
+ break ;
+
+ case 'f' :
+ floatdata = (float) va_arg (argptr, double) ;
+ float32_write (floatdata, (unsigned char *) &data) ;
+ data = H2LE_INT (data) ;
+ PUT_INT (psf, data) ;
+ count += 4 ;
+ break ;
+
+ case 'F' :
+ floatdata = (float) va_arg (argptr, double) ;
+ float32_write (floatdata, (unsigned char *) &data) ;
+ data = H2BE_INT (data) ;
+ PUT_INT (psf, data) ;
+ count += 4 ;
+ break ;
+
case 's' :
strptr = va_arg (argptr, char *) ;
- size = strlen (strptr) + 1 ;
- size += (size & 1) ;
- longdata = H2LE_INT (size) ;
- put_int (psf, longdata) ;
+ size = strlen (strptr) + 1 ;
+ size += (size & 1) ;
+ data = H2LE_INT (size) ;
+ PUT_INT (psf, data) ;
memcpy (&(psf->header [psf->headindex]), strptr, size) ;
psf->headindex += size ;
+ count += 4 + size ;
break ;
case 'S' :
strptr = va_arg (argptr, char *) ;
- size = strlen (strptr) + 1 ;
- size += (size & 1) ;
- longdata = H2BE_INT (size) ;
- put_int (psf, longdata) ;
+ size = strlen (strptr) + 1 ;
+ size += (size & 1) ;
+ data = H2BE_INT (size) ;
+ PUT_INT (psf, data) ;
memcpy (&(psf->header [psf->headindex]), strptr, size) ;
psf->headindex += size ;
+ count += 4 + size ;
break ;
- default : break ;
+ case 'B' :
+ bindata = va_arg (argptr, void *) ;
+ size = va_arg (argptr, size_t) ;
+ memcpy (&(psf->header [psf->headindex]), bindata, size) ;
+ psf->headindex += size ;
+ count += size ;
+ break ;
+
+ case 'z' :
+ size = va_arg (argptr, size_t) ;
+ count += size ;
+ while (size)
+ { psf->header [psf->headindex] = 0 ;
+ psf->headindex ++ ;
+ size -- ;
+ } ;
+ break ;
+
+ default :
+ psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+ psf->error = SFE_INTERNAL ;
+ break ;
} ;
} ;
va_end(argptr);
- return ;
-} /* psf_hprintf */
+ return count ;
+} /* psf_binheader_writef */
-
/*-----------------------------------------------------------------------------------------------
+** Binary header reading functions. Returns number of bytes read.
+**
+** Format specifiers are the same as for header write function above with the following
+** additions:
+**
+** p - jump a given number of position from start of file.
+**
+** If format is NULL, psf_binheader_readf returns the current offset.
*/
-void psf_hsetf (SF_PRIVATE *psf, unsigned int marker, char *format, ...)
-{ va_list argptr ;
- unsigned int longdata, oldheadindex ;
- unsigned short worddata ;
- void *bindata ;
- size_t size ;
- char c, *strptr ;
-
- /* Save old head index. */
- oldheadindex = psf->headindex ;
- psf->headindex = 0 ;
-
- /* Find the marker. */
- while (psf->headindex < oldheadindex)
- { if (*((unsigned int*) &(psf->header[psf->headindex])) == marker)
- break ;
- psf->headindex += 4 ;
- } ;
-
- /* If not found return. */
- if (psf->headindex >= oldheadindex)
- return ;
+#if (CPU_IS_BIG_ENDIAN == 1)
+#define GET_INT(psf) ( ((psf)->header [0] << 24) + ((psf)->header [1] << 16) + \
+ ((psf)->header [2] << 8) + ((psf)->header [3]) )
- /* Move past marker. */
- psf->headindex += 4 ;
+#define GET_3BYTE(psf) ( ((psf)->header [0] << 16) + ((psf)->header [1] << 8) + \
+ ((psf)->header [2]) )
+#define GET_SHORT(psf) ( ((psf)->header [0] << 8) + ((psf)->header [1]) )
+
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+#define GET_INT(psf) ( ((psf)->header [0] ) + ((psf)->header [1] << 8) + \
+ ((psf)->header [2] << 16) + ((psf)->header [3] << 24) )
+
+#define GET_3BYTE(psf) ( ((psf)->header [0] ) + ((psf)->header [1] << 8) + \
+ ((psf)->header [2] << 16) )
+
+#define GET_SHORT(psf) ( ((psf)->header [0]) + ((psf)->header [1] << 8) )
+
+#else
+# error "Cannot determine endian-ness of processor."
+#endif
+
+#define GET_BYTE(psf) ( (psf)->header [0] )
+
+int
+psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+{ va_list argptr ;
+ unsigned int *longptr, longdata ;
+ unsigned short *wordptr, worddata ;
+ char *charptr ;
+ int position ;
+ float *floatptr ;
+ size_t size ;
+ char c ;
+ int count = 0 ;
+
+ if (! format)
+ return ftell (psf->file) ;
+
va_start(argptr, format);
while ((c = *format++))
{ switch (c)
{ case 'm' :
- longdata = va_arg (argptr, unsigned int) ;
- put_int (psf, longdata) ;
+ longptr = va_arg (argptr, unsigned int*) ;
+ fread (psf->header, 1, sizeof (int), psf->file) ;
+ *longptr = GET_INT (psf) ;
+ count += 4 ;
break ;
- case 'l' :
- longdata = va_arg (argptr, unsigned int) ;
- longdata = H2LE_INT (longdata) ;
- put_int (psf, longdata) ;
+ case 'b' :
+ charptr = va_arg (argptr, char*) ;
+ fread (psf->header, 1, sizeof (char), psf->file) ;
+ *charptr = GET_BYTE (psf) ;
+ count += 1 ;
break ;
-
- case 'L' :
- longdata = va_arg (argptr, unsigned int) ;
- longdata = H2BE_INT (longdata) ;
- put_int (psf, longdata) ;
- break ;
case 'w' :
- worddata = va_arg (argptr, int) & 0xFFFF ;
- worddata = H2LE_SHORT (worddata) ;
- put_short (psf, worddata) ;
+ wordptr = va_arg (argptr, unsigned short*) ;
+ fread (psf->header, 1, sizeof (short), psf->file) ;
+ worddata = GET_SHORT (psf) ;
+ *wordptr = H2LE_SHORT (worddata) ;
+ count += 2 ;
break ;
case 'W' :
- worddata = va_arg (argptr, int) & 0xFFFF ;
- worddata = H2BE_SHORT (worddata) ;
- put_short (psf, worddata) ;
+ wordptr = va_arg (argptr, unsigned short*) ;
+ fread (psf->header, 1, sizeof (short), psf->file) ;
+ worddata = GET_SHORT (psf) ;
+ *wordptr = H2BE_SHORT (worddata) ;
+ count += 2 ;
break ;
- case 'b' :
- bindata = va_arg (argptr, void *) ;
- size = va_arg (argptr, size_t) ;
- memcpy (&(psf->header [psf->headindex]), bindata, size) ;
- psf->headindex += size ;
+ case 'l' :
+ longptr = va_arg (argptr, unsigned int*) ;
+ fread (psf->header, 1, sizeof (int), psf->file) ;
+ longdata = GET_INT (psf) ;
+ *longptr = H2LE_INT (longdata) ;
+ count += 4 ;
break ;
-
+
+ case 'L' :
+ longptr = va_arg (argptr, unsigned int*) ;
+ fread (psf->header, 1, sizeof (int), psf->file) ;
+ longdata = GET_INT (psf) ;
+ *longptr = H2BE_INT (longdata) ;
+ count += 4 ;
+ break ;
+
+ case 't' :
+ longptr = va_arg (argptr, unsigned int*) ;
+ fread (psf->header, 1, 3, psf->file) ;
+ longdata = GET_3BYTE (psf) ;
+ *longptr = H2LE_INT (longdata) ;
+ count += 3 ;
+ break ;
+
+ case 'T' :
+ longptr = va_arg (argptr, unsigned int*) ;
+ fread (psf->header, 1, 3, psf->file) ;
+ longdata = GET_3BYTE (psf) ;
+ *longptr = H2BE_INT (longdata) ;
+ count += 3 ;
+ break ;
+
+ case 'f' :
+ floatptr = va_arg (argptr, float *) ;
+ fread (psf->header, 1, sizeof (float), psf->file) ;
+ longdata = GET_INT (psf) ;
+ longdata = H2LE_INT (longdata) ;
+ *floatptr = float32_read ((unsigned char*) &longdata) ;
+ count += 4 ;
+ break ;
+
+ case 'F' :
+ floatptr = va_arg (argptr, float *) ;
+ fread (psf->header, 1, sizeof (float), psf->file) ;
+ longdata = GET_INT (psf) ;
+ longdata = H2BE_INT (longdata) ;
+ *floatptr = float32_read ((unsigned char*) &longdata) ;
+ count += 4 ;
+ break ;
+
case 's' :
+ printf ("Format conversion not implemented yet.\n") ;
+ /*
strptr = va_arg (argptr, char *) ;
- size = strlen (strptr) + 1 ;
- size += (size & 1) ;
+ size = strlen (strptr) + 1 ;
+ size += (size & 1) ;
longdata = H2LE_INT (size) ;
- put_int (psf, longdata) ;
+ get_int (psf, longdata) ;
memcpy (&(psf->header [psf->headindex]), strptr, size) ;
psf->headindex += size ;
+ */
break ;
case 'S' :
+ printf ("Format conversion not implemented yet.\n") ;
+ /*
strptr = va_arg (argptr, char *) ;
- size = strlen (strptr) + 1 ;
- size += (size & 1) ;
+ size = strlen (strptr) + 1 ;
+ size += (size & 1) ;
longdata = H2BE_INT (size) ;
- put_int (psf, longdata) ;
+ get_int (psf, longdata) ;
memcpy (&(psf->header [psf->headindex]), strptr, size) ;
psf->headindex += size ;
+ */
break ;
- default : break ;
+ case 'B' :
+ charptr = va_arg (argptr, char*) ;
+ size = va_arg (argptr, size_t) ;
+ if (size > 0)
+ { memset (charptr, 0, size) ;
+ fread (charptr, 1, size, psf->file) ;
+ count += size ;
+ } ;
+ break ;
+
+ case 'z' :
+ printf ("Format conversion not implemented yet.\n") ;
+ /*
+ size = va_arg (argptr, size_t) ;
+ while (size)
+ { psf->header [psf->headindex] = 0 ;
+ psf->headindex ++ ;
+ size -- ;
+ } ;
+ */
+ break ;
+
+ case 'p' :
+ /* Get the seek position first. */
+ position = va_arg (argptr, int) ;
+ fseek (psf->file, position, SEEK_SET) ;
+ count = 0 ;
+ break ;
+
+ case 'j' :
+ /* Get the seek position first. */
+ position = va_arg (argptr, int) ;
+ fseek (psf->file, position, SEEK_CUR) ;
+ count = 0 ;
+ break ;
+
+ default :
+ psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+ psf->error = SFE_INTERNAL ;
+ break ;
} ;
} ;
- va_end(argptr);
+ va_end (argptr);
- psf->headindex = oldheadindex ;
- return ;
-} /* psf_hsetf */
+ return count ;
+} /* psf_binheader_readf */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+void
+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, " Samples : %d\n", psf->sf.samples) ;
+ psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ;
+
+ psf_log_printf (psf, " Bit width : %d\n", psf->sf.pcmbitwidth) ;
+ psf_log_printf (psf, " Format : %X\n", psf->sf.format) ;
+ psf_log_printf (psf, " Sections : %d\n", psf->sf.sections) ;
+ psf_log_printf (psf, " Seekable : %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ;
+
+ psf_log_printf (psf, "---------------------------------\n") ;
+} /* psf_dump_SFINFO */
+
+/*========================================================================================
+** Functions used in the write function for updating the peak chunk.
+*/
+
+/*-void
+peak_update_short (SF_PRIVATE *psf, short *ptr, size_t items)
+{ int chan, k, position ;
+ short maxval ;
+ float fmaxval ;
+
+ for (chan = 0 ; chan < psf->sf.channels ; chan++)
+ { maxval = abs (ptr [chan]) ;
+ position = 0 ;
+ for (k = chan ; k < items ; k += psf->sf.channels)
+ if (maxval < abs (ptr [k]))
+ { maxval = abs (ptr [k]) ;
+ position = k ;
+ } ;
+
+ fmaxval = maxval / 32767.0 ;
+ position /= psf->sf.channels ;
+
+ if (fmaxval > psf->peak.peak[chan].value)
+ { psf->peak.peak[chan].value = fmaxval ;
+ psf->peak.peak[chan].position = psf->current - position ;
+ } ;
+ } ;
+
+ return ;
+} /+* peak_update_short *+/
+
+void
+peak_update_int (SF_PRIVATE *psf, int *ptr, size_t items)
+{ int chan, k, position ;
+ int maxval ;
+ float fmaxval ;
+
+ for (chan = 0 ; chan < psf->sf.channels ; chan++)
+ { maxval = abs (ptr [chan]) ;
+ position = 0 ;
+ for (k = chan ; k < items ; k += psf->sf.channels)
+ if (maxval < abs (ptr [k]))
+ { maxval = abs (ptr [k]) ;
+ position = k ;
+ } ;
+
+ fmaxval = maxval / 0x7FFFFFFF ;
+ position /= psf->sf.channels ;
+
+ if (fmaxval > psf->peak.peak[chan].value)
+ { psf->peak.peak[chan].value = fmaxval ;
+ psf->peak.peak[chan].position = psf->current - position ;
+ } ;
+ } ;
+
+ return ;
+} /+* peak_update_int *+/
+
+void
+peak_update_double (SF_PRIVATE *psf, double *ptr, size_t items)
+{ int chan, k, position ;
+ double fmaxval ;
+
+ for (chan = 0 ; chan < psf->sf.channels ; chan++)
+ { fmaxval = fabs (ptr [chan]) ;
+ position = 0 ;
+ for (k = chan ; k < items ; k += psf->sf.channels)
+ if (fmaxval < fabs (ptr [k]))
+ { fmaxval = fabs (ptr [k]) ;
+ position = k ;
+ } ;
+
+ position /= psf->sf.channels ;
+
+ if (fmaxval > psf->peak.peak[chan].value)
+ { psf->peak.peak[chan].value = fmaxval ;
+ psf->peak.peak[chan].position = psf->current - position ;
+ } ;
+ } ;
+
+ return ;
+} /+* peak_update_double *+/
+-*/
--- a/common/libsndfile/src/common.h
+++ b/common/libsndfile/src/common.h
@@ -1,18 +1,18 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
** 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
+** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
@@ -24,74 +24,163 @@
#endif
-#define SF_BUFFER_LEN (4096)
-#define SF_FILENAME_LEN (256)
-#define SF_HEADER_LEN (2048)
+#define SF_BUFFER_LEN (4096)
+#define SF_FILENAME_LEN (256)
+#define SF_HEADER_LEN (2048)
+#define SF_TEXT_LEN (1024)
#define BITWIDTH2BYTES(x) (((x) + 7) / 8)
+#define PEAK_CHANNEL_COUNT 16
+
enum
-{ SF_MODE_READ = 1,
- SF_MODE_WRITE = 2,
- SF_MODE_RW = 3
-} ;
+{ SF_MODE_READ = 11,
+ SF_MODE_WRITE = 12,
+ SF_MODE_RW = 13, /* Unlikely that RW will ever be implemented. */
+
+ /* PEAK chunk location. */
+ SF_PEAK_START = 42,
+ SF_PEAK_END = 43,
+ /* Two endian enums. */
+ SF_ENDIAN_LITTLE = 100,
+ SF_ENDIAN_BIG = 101,
+
+ /* Char type for 8 bit files. */
+ SF_CHARS_SIGNED = 200,
+ SF_CHARS_UNSIGNED = 201
+} ;
+
+/* Processor floating point capabilities. float32_get_capabilities () in
+** src/float32.c returns one of the latter three values.
+*/
enum
-{ SF_ENDIAN_LITTLE = 100,
- SF_ENDIAN_BIG = 200
+{ FLOAT_UNKNOWN = 0x00,
+ FLOAT_CAN_RW_LE = 0x23,
+ FLOAT_CAN_RW_BE = 0x34,
+ FLOAT_BROKEN_LE = 0x35,
+ FLOAT_BROKEN_BE = 0x36
} ;
enum
-{ SF_FALSE = 0,
+{ SF_FALSE = 0,
SF_TRUE = 1
+} ;
+
+/* Command values for sf_command (). These are obtained using the Python
+** script sf_command.py in the top level directory of the libsndfile sources.
+*/
+enum
+{ SFC_LIB_VERSION = 0x1048C,
+ SFC_READ_TEXT = 0x054F0,
+ SFC_WRITE_TEXT = 0x0B990,
+ SFC_NORM_FLOAT = 0x0914A,
+ SFC_NORM_DOUBLE = 0x1226D,
+ SFC_SCALE_MODE = 0x0A259,
+ SFC_ADD_PEAK = 0x96F53
} ;
-typedef int (*func_seek) (void*, int, int) ;
+/* Function pointer typedefs. */
+typedef int (*func_seek) (void*, long, int) ;
+
typedef int (*func_short) (void*, short *ptr, unsigned int len) ;
typedef int (*func_int) (void*, int *ptr, unsigned int len) ;
+typedef int (*func_float) (void*, float *ptr, unsigned int len) ;
typedef int (*func_double) (void*, double *ptr, unsigned int len, int normalize) ;
+typedef int (*func_wr_hdr) (void*) ;
+typedef int (*func_command) (void*, int command, void *data, int datasize) ;
+
typedef int (*func_close) (void*) ;
+/*---------------------------------------------------------------------------------------
+** PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their
+** endian encodings are different.
+*/
+
+typedef struct
+{ float value ; /* signed value of peak */
+ unsigned int position ; /* the sample frame for the peak */
+} PEAK_POS ;
+
+typedef struct
+{ unsigned int version ; /* version of the PEAK chunk */
+ unsigned int timestamp ; /* secs since 1/1/1970 */
+ PEAK_POS peak [PEAK_CHANNEL_COUNT] ; /* the peak info */
+} PEAK_CHUNK ;
+
+/*=======================================================================================
+** SF_PRIVATE stuct - a pointer to this struct is passed back to the caller of the
+** sf_open_XXXX functions. The caller however has no knowledge of the struct's
+** contents.
+*/
+
typedef struct
{ /* Force the compiler to double align the start of buffer. */
double buffer [SF_BUFFER_LEN/sizeof(double)] ;
- char strbuffer [SF_BUFFER_LEN] ;
char filename [SF_FILENAME_LEN] ;
- char header [SF_HEADER_LEN] ;
+
+ /* logbuffer and logindex should only be changed within the logging functions
+ ** of common.c
+ */
+ char logbuffer [SF_BUFFER_LEN] ;
+ unsigned char header [SF_HEADER_LEN] ;
+
+ /* For storing text from header. */
+ char headertext [SF_TEXT_LEN] ;
+
+ /* Guard value. If this changes the buffers above have overflowed. */
int Magick ;
- unsigned int strindex ;
- unsigned int headindex ;
+
+ /* Index variables for maintaining logbuffer and header above. */
+ unsigned int logindex ;
+ unsigned int headindex, headcurrent ;
+ int has_text ;
+
FILE *file ;
- int mode ;
int error ;
- int endian ;
+
+ int mode ; /* Open mode : SF_MODE_READ or SF_MODE_WRITE. */
+ int endian ; /* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */
+ int chars ; /* Chars are SF_CHARS_SIGNED or SF_CHARS_UNSIGNED. */
+ int fl32_endswap ; /* Need to endswap float32s? */
+
+ SF_INFO sf ;
- SF_INFO sf ;
+ int has_peak ; /* Has a PEAK chunk (AIFF and WAVE) been read? */
+ int peak_loc ; /* Write a PEAK chunk at the start or end of the file? */
+ PEAK_CHUNK peak ;
+
+ long dataoffset ; /* Offset in number of bytes from beginning of file. */
+ long datalength ; /* Length in bytes of the audio data. */
+ long tailstart ; /* Offset to file tailer. */
+ unsigned int blockwidth ; /* Size in bytes of one set of interleaved samples. */
+ unsigned int bytewidth ; /* Size in bytes of one sample (one channel). */
- long dataoffset ; /* Offset in number of bytes from beginning of file. */
- long datalength ; /* Length in bytes of the audio data. */
- unsigned int blockwidth ; /* Size in bytes of one set of interleaved samples. */
- unsigned int bytewidth ; /* Size in bytes of one sample (one channel). */
-
long filelength ;
long current ;
void *fdata ;
+
+ int scale_mode ;
+ int norm_double ;
+ int norm_float ;
- double normfactor ;
-
func_seek seek_func ;
func_short read_short ;
func_int read_int ;
+ func_float read_float ;
func_double read_double ;
func_short write_short ;
func_int write_int ;
+ func_float write_float ;
func_double write_double ;
+ func_wr_hdr write_header ;
+ func_command command ;
func_close close ;
} SF_PRIVATE ;
@@ -106,8 +195,8 @@
SFE_BAD_SF_INFO_PTR,
SFE_BAD_INT_FD,
SFE_BAD_INT_PTR,
- SFE_MALLOC_FAILED,
- SFE_BAD_SEEK,
+ SFE_MALLOC_FAILED,
+ SFE_BAD_SEEK,
SFE_NOT_SEEKABLE,
SFE_UNIMPLEMENTED,
SFE_BAD_READ_ALIGN,
@@ -120,12 +209,16 @@
SFE_SHORT_READ,
SFE_SHORT_WRITE,
SFE_INTERNAL,
-
+ SFE_BAD_CONTROL_CMD,
+
SFE_WAV_NO_RIFF,
SFE_WAV_NO_WAVE,
SFE_WAV_NO_FMT,
SFE_WAV_FMT_SHORT,
SFE_WAV_FMT_TOO_BIG,
+ SFE_WAV_BAD_FACT,
+ SFE_WAV_BAD_PEAK,
+ SFE_WAV_PEAK_B4_FMT,
SFE_WAV_BAD_FORMAT,
SFE_WAV_BAD_BLOCKALIGN,
SFE_WAV_NO_DATA,
@@ -135,65 +228,145 @@
SFE_WAV_UNKNOWN_CHUNK,
SFE_AIFF_NO_FORM,
+ SFE_AIFF_AIFF_NO_FORM,
+ SFE_AIFF_COMM_NO_FORM,
+ SFE_AIFF_SSND_NO_COMM,
SFE_AIFF_UNKNOWN_CHUNK,
- SFE_COMM_CHUNK_SIZE,
+ SFE_AIFF_COMM_CHUNK_SIZE,
+ SFE_AIFF_BAD_COMM_CHUNK,
+ SFE_AIFF_PEAK_B4_COMM,
+ SFE_AIFF_BAD_PEAK,
SFE_AIFF_NO_SSND,
SFE_AIFF_NO_DATA,
SFE_AU_UNKNOWN_FORMAT,
SFE_AU_NO_DOTSND,
-
+
SFE_RAW_READ_BAD_SPEC,
SFE_RAW_BAD_BITWIDTH,
-
+
SFE_PAF_NO_MARKER,
SFE_PAF_VERSION,
SFE_PAF_UNKNOWN_FORMAT,
SFE_PAF_SHORT_HEADER,
-
- SFE_SVX_NO_FORM,
+
+ SFE_SVX_NO_FORM,
SFE_SVX_NO_BODY,
SFE_SVX_NO_DATA,
- SFE_SVX_BAD_COMP,
+ SFE_SVX_BAD_COMP,
SFE_NIST_BAD_HEADER,
SFE_NIST_BAD_ENCODING,
+ SFE_SMTD_NO_SEKD,
+ SFE_SMTD_NO_SAMR,
+
+ SFE_VOC_NO_CREATIVE,
+ SFE_VOC_BAD_VERSION,
+ SFE_VOC_BAD_MARKER,
+
+ SFE_IRCAM_NO_MARKER,
+ SFE_IRCAM_BAD_CHANNELS,
+ SFE_IRCAM_UNKNOWN_FORMAT,
+
SFE_MAX_ERROR /* This must be last in list. */
} ;
+/* Get the float32 capability of the processor at run time.
+** Implemented in src/float32.c.
+*/
+int float32_get_capability (int endianness) ;
+float float32_read (unsigned char *cptr) ;
+void float32_write (float in, unsigned char *out) ;
+
+
+/* Endian swapping routines implemented in src/common.h. */
+
void endswap_short_array (short *ptr, int len) ;
void endswap_int_array (int *ptr, int len) ;
-void psf_sprintf (SF_PRIVATE *psf, char *format, ...) ;
-void psf_hprintf (SF_PRIVATE *psf, char *format, ...) ;
-void psf_hsetf (SF_PRIVATE *psf, unsigned int marker, char *format, ...) ;
+/* Functions for writing to the internal logging buffer. */
+void psf_log_printf (SF_PRIVATE *psf, char *format, ...) ;
+void psf_log_SF_INFO (SF_PRIVATE *psf) ;
+
+/* Functions used when writing file headers. */
+
+int psf_binheader_writef (SF_PRIVATE *psf, char *format, ...) ;
+void psf_asciiheader_printf (SF_PRIVATE *psf, char *format, ...) ;
+
+/* Functions used when reading file headers. */
+
+int psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) ;
+
+/* Functions used in the write function for updating the peak chunk. */
+
+void peak_update_short (SF_PRIVATE *psf, short *ptr, size_t items) ;
+void peak_update_int (SF_PRIVATE *psf, int *ptr, size_t items) ;
+void peak_update_double (SF_PRIVATE *psf, double *ptr, size_t items) ;
+
+/* Init functions for a number of common data encodings. */
+
+int pcm_read_init (SF_PRIVATE *psf) ;
+int pcm_write_init (SF_PRIVATE *psf) ;
+
+int ulaw_read_init (SF_PRIVATE *psf) ;
+int ulaw_write_init (SF_PRIVATE *psf) ;
+
+int alaw_read_init (SF_PRIVATE *psf) ;
+int alaw_write_init (SF_PRIVATE *psf) ;
+
+int float32_read_init (SF_PRIVATE *psf) ;
+int float32_write_init (SF_PRIVATE *psf) ;
+
+/* Functions for reading and writing different file formats.*/
+
int aiff_open_read (SF_PRIVATE *psf) ;
int aiff_open_write (SF_PRIVATE *psf) ;
-int au_open_read (SF_PRIVATE *psf) ;
-int au_nh_open_read (SF_PRIVATE *psf) ;
-int au_open_write (SF_PRIVATE *psf) ;
+int au_open_read (SF_PRIVATE *psf) ;
+int au_nh_open_read (SF_PRIVATE *psf) ; /* Headerless version of AU. */
+int au_open_write (SF_PRIVATE *psf) ;
-int wav_open_read (SF_PRIVATE *psf) ;
+int wav_open_read (SF_PRIVATE *psf) ;
int wav_open_write (SF_PRIVATE *psf) ;
-int raw_open_read (SF_PRIVATE *psf) ;
+int raw_open_read (SF_PRIVATE *psf) ;
int raw_open_write (SF_PRIVATE *psf) ;
-int paf_open_read (SF_PRIVATE *psf) ;
+int paf_open_read (SF_PRIVATE *psf) ;
int paf_open_write (SF_PRIVATE *psf) ;
-int svx_open_read (SF_PRIVATE *psf) ;
+int svx_open_read (SF_PRIVATE *psf) ;
int svx_open_write (SF_PRIVATE *psf) ;
-int aunist_open_read (SF_PRIVATE *psf) ;
-int aunist_open_write (SF_PRIVATE *psf) ;
+int nist_open_read (SF_PRIVATE *psf) ;
+int nist_open_write (SF_PRIVATE *psf) ;
+int smpltd_open_read (SF_PRIVATE *psf) ;
+int smpltd_open_write (SF_PRIVATE *psf) ;
+int voc_open_read (SF_PRIVATE *psf) ;
+int voc_open_write (SF_PRIVATE *psf) ;
+
+int rx2_open_read (SF_PRIVATE *psf) ;
+int rx2_open_write (SF_PRIVATE *psf) ;
+
+int ircam_open_read (SF_PRIVATE *psf) ;
+int ircam_open_write (SF_PRIVATE *psf) ;
+
+
+/* Win32 does seem to have snprintf and vsnprintf but prepends
+** the names with an underscore. Why?
+*/
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+#endif
+
#ifdef _WIN32
-// #pragma pack(pop,1)
+ #pragma pack(pop,1)
#endif
#endif /* COMMON_H_INCLUDED */
--- a/common/libsndfile/src/config.h.in
+++ b/common/libsndfile/src/config.h.in
@@ -1,4 +1,4 @@
-/* src/config.h.in. Generated automatically from configure.in by autoheader. */
+/* src/config.h.in. Generated automatically from configure.in by autoheader 2.13. */
/* Define to `long' if <sys/types.h> doesn't define. */
#undef off_t
@@ -24,9 +24,9 @@
/* Set to 1 if the processor is little endian, otherwise set to 0. */
#undef GUESS_LITTLE_ENDIAN
-/* Set to 1 if the processor can read and write Intel x86 32 bit floats. */
+/* Set to 1 to force the use of code for processors with broken floats */
/* Otherwise set it to 0. */
-#undef CAN_READ_WRITE_x86_IEEE
+#undef FORCE_BROKEN_FLOAT
/* The number of bytes in a double. */
#undef SIZEOF_DOUBLE
@@ -45,6 +45,36 @@
/* The number of bytes in a void*. */
#undef SIZEOF_VOIDP
+
+/* Define if you have the fclose function. */
+#undef HAVE_FCLOSE
+
+/* Define if you have the fopen function. */
+#undef HAVE_FOPEN
+
+/* Define if you have the fread function. */
+#undef HAVE_FREAD
+
+/* Define if you have the free function. */
+#undef HAVE_FREE
+
+/* Define if you have the fseek function. */
+#undef HAVE_FSEEK
+
+/* Define if you have the ftell function. */
+#undef HAVE_FTELL
+
+/* Define if you have the fwrite function. */
+#undef HAVE_FWRITE
+
+/* Define if you have the malloc function. */
+#undef HAVE_MALLOC
+
+/* Define if you have the snprintf function. */
+#undef HAVE_SNPRINTF
+
+/* Define if you have the vsnprintf function. */
+#undef HAVE_VSNPRINTF
/* Define if you have the <endian.h> header file. */
#undef HAVE_ENDIAN_H
--- /dev/null
+++ b/common/libsndfile/src/float32.c
@@ -1,0 +1,968 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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 <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*--------------------------------------------------------------------------------------------
+*/
+
+/*--------------------------------------------------------------------------------------------
+** Prototypes for private functions.
+*/
+
+static int host_read_f2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int host_read_f2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int host_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int host_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int host_write_s2f (SF_PRIVATE *psf, short *ptr, int len) ;
+static int host_write_i2f (SF_PRIVATE *psf, int *ptr, int len) ;
+static int host_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int host_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static void f2s_array (float *buffer, unsigned int count, short *ptr, int index) ;
+static void f2i_array (float *buffer, unsigned int count, int *ptr, int index) ;
+static void f2d_array (float *buffer, unsigned int count, double *ptr, int index) ;
+
+static void s2f_array (short *ptr, int index, float *buffer, unsigned int count) ;
+static void i2f_array (int *ptr, int index, float *buffer, unsigned int count) ;
+static void d2f_array (double *ptr, int index, float *buffer, unsigned int count) ;
+
+static void float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index) ;
+
+static int broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int broken_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len) ;
+static int broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len) ;
+static int broken_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static void bf2f_array (float *buffer, unsigned int count) ;
+static void f2bf_array (float *buffer, unsigned int count) ;
+
+/*--------------------------------------------------------------------------------------------
+** Exported functions.
+*/
+
+int
+float32_read_init (SF_PRIVATE *psf)
+{ static int float_caps = FLOAT_UNKNOWN ;
+
+ if (float_caps == FLOAT_UNKNOWN)
+ float_caps = float32_get_capability (psf->endian) ;
+
+ switch (psf->endian + 0x1000 * float_caps)
+ { case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->read_short = (func_short) host_read_f2s ;
+ psf->read_int = (func_int) host_read_f2i ;
+ psf->read_float = (func_float) host_read_f ;
+ psf->read_double = (func_double) host_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->read_short = (func_short) host_read_f2s ;
+ psf->read_int = (func_int) host_read_f2i ;
+ psf->read_float = (func_float) host_read_f ;
+ psf->read_double = (func_double) host_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->read_short = (func_short) host_read_f2s ;
+ psf->read_int = (func_int) host_read_f2i ;
+ psf->read_float = (func_float) host_read_f ;
+ psf->read_double = (func_double) host_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->read_short = (func_short) host_read_f2s ;
+ psf->read_int = (func_int) host_read_f2i ;
+ psf->read_float = (func_float) host_read_f ;
+ psf->read_double = (func_double) host_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->read_short = (func_short) broken_read_f2s ;
+ psf->read_int = (func_int) broken_read_f2i ;
+ psf->read_float = (func_float) broken_read_f ;
+ psf->read_double = (func_double) broken_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->read_short = (func_short) broken_read_f2s ;
+ psf->read_int = (func_int) broken_read_f2i ;
+ psf->read_float = (func_float) broken_read_f ;
+ psf->read_double = (func_double) broken_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->read_short = (func_short) broken_read_f2s ;
+ psf->read_int = (func_int) broken_read_f2i ;
+ psf->read_float = (func_float) broken_read_f ;
+ psf->read_double = (func_double) broken_read_f2d ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->read_short = (func_short) broken_read_f2s ;
+ psf->read_int = (func_int) broken_read_f2i ;
+ psf->read_float = (func_float) broken_read_f ;
+ psf->read_double = (func_double) broken_read_f2d ;
+ break ;
+
+ default : break ;
+ } ;
+
+ return 0 ;
+} /* float32_read_init */
+
+int
+float32_write_init (SF_PRIVATE *psf)
+{ static int float_caps = FLOAT_UNKNOWN ;
+
+ if (float_caps == FLOAT_UNKNOWN)
+ float_caps = float32_get_capability (psf->endian) ;
+
+ switch (psf->endian + 0x1000 * float_caps)
+ { case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->write_short = (func_short) host_write_s2f ;
+ psf->write_int = (func_int) host_write_i2f ;
+ psf->write_float = (func_float) host_write_f ;
+ psf->write_double = (func_double) host_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->write_short = (func_short) host_write_s2f ;
+ psf->write_int = (func_int) host_write_i2f ;
+ psf->write_float = (func_float) host_write_f ;
+ psf->write_double = (func_double) host_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->write_short = (func_short) host_write_s2f ;
+ psf->write_int = (func_int) host_write_i2f ;
+ psf->write_float = (func_float) host_write_f ;
+ psf->write_double = (func_double) host_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->write_short = (func_short) host_write_s2f ;
+ psf->write_int = (func_int) host_write_i2f ;
+ psf->write_float = (func_float) host_write_f ;
+ psf->write_double = (func_double) host_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->write_short = (func_short) broken_write_s2f ;
+ psf->write_int = (func_int) broken_write_i2f ;
+ psf->write_float = (func_float) broken_write_f ;
+ psf->write_double = (func_double) broken_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->write_short = (func_short) broken_write_s2f ;
+ psf->write_int = (func_int) broken_write_i2f ;
+ psf->write_float = (func_float) broken_write_f ;
+ psf->write_double = (func_double) broken_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
+ psf->fl32_endswap = SF_FALSE ;
+ psf->write_short = (func_short) broken_write_s2f ;
+ psf->write_int = (func_int) broken_write_i2f ;
+ psf->write_float = (func_float) broken_write_f ;
+ psf->write_double = (func_double) broken_write_d2f ;
+ break ;
+
+ case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
+ psf->fl32_endswap = SF_TRUE ;
+ psf->write_short = (func_short) broken_write_s2f ;
+ psf->write_int = (func_int) broken_write_i2f ;
+ psf->write_float = (func_float) broken_write_f ;
+ psf->write_double = (func_double) broken_write_d2f ;
+ break ;
+
+ default : break ;
+ } ;
+
+ return 0 ;
+} /* float32_write_init */
+
+float
+float32_read (unsigned char *cptr)
+{ int exponent, mantissa, negative ;
+ float fvalue ;
+
+ if (CPU_IS_LITTLE_ENDIAN)
+ { negative = cptr [3] & 0x80 ;
+ exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0);
+ mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
+ }
+ else
+ { negative = cptr [0] & 0x80 ;
+ exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0);
+ mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ;
+ } ;
+
+ if (! (exponent || mantissa))
+ return 0.0 ;
+
+ mantissa |= 0x800000 ;
+ exponent = exponent ? exponent - 127 : 0 ;
+
+ fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
+
+ if (negative)
+ fvalue *= -1 ;
+
+ if (exponent > 0)
+ fvalue *= (1 << exponent) ;
+ else if (exponent < 0)
+ fvalue /= (1 << abs (exponent)) ;
+
+ return fvalue ;
+} /* float32_read */
+
+void
+float32_write (float in, unsigned char *out)
+{ int exponent, mantissa, negative = 0 ;
+
+ *((int*) out) = 0 ;
+
+ if (in == 0.0)
+ return ;
+
+ if (in < 0.0)
+ { in *= -1.0 ;
+ negative = 1 ;
+ } ;
+
+ in = frexp (in, &exponent) ;
+
+ exponent += 126 ;
+
+ in *= (float) 0x1000000 ;
+ mantissa = (((int) in) & 0x7FFFFF) ;
+
+ if (CPU_IS_LITTLE_ENDIAN)
+ { if (negative)
+ out [3] |= 0x80 ;
+
+ if (exponent & 0x01)
+ out [2] |= 0x80 ;
+
+ out [0] = mantissa & 0xFF ;
+ out [1] = (mantissa >> 8) & 0xFF ;
+ out [2] |= (mantissa >> 16) & 0x7F ;
+ out [3] |= (exponent >> 1) & 0x7F ;
+ }
+ else
+ { if (negative)
+ out [0] |= 0x80 ;
+
+ if (exponent & 0x01)
+ out [1] |= 0x80 ;
+
+ out [3] = mantissa & 0xFF ;
+ out [2] = (mantissa >> 8) & 0xFF ;
+ out [1] |= (mantissa >> 16) & 0x7F ;
+ out [0] |= (exponent >> 1) & 0x7F ;
+ }
+
+ return ;
+} /* float32_write */
+
+/*==============================================================================================
+** Private functions.
+*/
+
+static void
+float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index)
+{ int k, chan, position ;
+ float fmaxval;
+
+ for (chan = 0 ; chan < psf->sf.channels ; chan++)
+ { fmaxval = fabs (buffer [chan]) ;
+ position = 0 ;
+ for (k = chan ; k < count ; k += psf->sf.channels)
+ if (fmaxval < fabs (buffer [k]))
+ { fmaxval = fabs (buffer [k]) ;
+ position = k ;
+ } ;
+
+ if (fmaxval > psf->peak.peak[chan].value)
+ { psf->peak.peak[chan].value = fmaxval ;
+ psf->peak.peak[chan].position = psf->current + index + (position /psf->sf.channels) ;
+ } ;
+ } ;
+
+ return ;
+} /* float32_peak_update */
+
+int
+float32_get_capability (int endianness)
+{ union
+ { float f ;
+ int i ;
+ unsigned char c [4] ;
+ } data ;
+
+ data.f = 1.23456789 ; /* Some abitrary value. */
+
+ if (FORCE_BROKEN_FLOAT || data.i != 0x3f9e0652)
+ return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ;
+
+ /* If this test is true ints and floats are compatible and little endian. */
+ if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f)
+ return FLOAT_CAN_RW_LE ;
+
+ /* If this test is true ints and floats are compatible and big endian. */
+ if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f)
+ return FLOAT_CAN_RW_BE ;
+
+ /* Floats are broken. Don't expect reading or writing to be fast. */
+ return 0 ;
+} /* float32_get_capability */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+
+static int
+host_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* host_read_f2s */
+
+static int
+host_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* host_read_f2i */
+
+static int
+host_read_f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ if (psf->fl32_endswap != SF_TRUE)
+ return fread (ptr, sizeof (float), len, psf->file) ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ memcpy (ptr + index, psf->buffer, thisread) ;
+
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* host_read_f */
+
+static int
+host_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* host_read_f2d */
+
+static int
+host_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* host_write_s2f */
+
+static int
+host_write_i2f (SF_PRIVATE *psf, int *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* host_write_i2f */
+
+static int
+host_write_f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ float32_peak_update (psf, ptr, len, 0) ;
+
+ if (psf->fl32_endswap != SF_TRUE)
+ return fwrite (ptr, sizeof (float), len, psf->file) ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+
+ memcpy (psf->buffer, ptr + index, writecount) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* host_write_f */
+
+static int
+host_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* host_write_d2f */
+
+/*=======================================================================================
+*/
+
+static void
+f2s_array (float *buffer, unsigned int count, short *ptr, int index)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { ptr [index] = ((double) buffer [k]) ;
+ index ++ ;
+ } ;
+} /* f2s_array */
+
+static void
+f2i_array (float *buffer, unsigned int count, int *ptr, int index)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { ptr [index] = (int) ((double) buffer [k]) ;
+ index ++ ;
+ } ;
+} /* f2i_array */
+
+static void
+f2d_array (float *buffer, unsigned int count, double *ptr, int index)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { ptr [index] = ((double) buffer [k]) ;
+ index ++ ;
+ } ;
+} /* f2d_array */
+
+static void
+s2f_array (short *ptr, int index, float *buffer, unsigned int count)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = (float) (ptr [index]) ;
+ index ++ ;
+ } ;
+
+} /* s2f_array */
+
+static void
+i2f_array (int *ptr, int index, float *buffer, unsigned int count)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = (float) (ptr [index]) ;
+ index ++ ;
+ } ;
+} /* i2f_array */
+
+static void
+d2f_array (double *ptr, int index, float *buffer, unsigned int count)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = (float) (ptr [index]) ;
+ index ++ ;
+ } ;
+} /* d2f_array */
+
+/*=======================================================================================
+*/
+
+static int
+broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
+{ unsigned int bytecount, readcount, bufferlen, thisread ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+ f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* broken_read_f2s */
+
+static int
+broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+{ unsigned int bytecount, readcount, bufferlen, thisread ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+ f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* broken_read_f2i */
+
+static int
+broken_read_f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int bytecount, readcount, bufferlen, thisread ;
+ int index = 0, total = 0 ;
+
+ /* FIX THIS */
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+ memcpy (ptr + index, psf->buffer, readcount) ;
+
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* broken_read_f */
+
+static int
+broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ unsigned int bytecount, readcount, bufferlen, thisread ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+ bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+ f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* broken_read_f2d */
+
+static int
+broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
+{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* broken_write_s2f */
+
+static int
+broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len)
+{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* broken_write_i2f */
+
+static int
+broken_write_f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
+ int index = 0, total = 0 ;
+
+ /* FIX THIS */
+ float32_peak_update (psf, ptr, len, 0) ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+
+ memcpy (psf->buffer, ptr + index, writecount) ;
+
+ f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* broken_write_f */
+
+static int
+broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
+ int index = 0, total = 0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+ float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+ f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+ if (psf->fl32_endswap == SF_TRUE)
+ endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* broken_write_d2f */
+
+/*==============================================================================
+*/
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static void
+bf2f_array (float *buffer, unsigned int count)
+{ int k ;
+
+ for (k = 0 ; k < count ; k++)
+ buffer [k] = float32_read ((unsigned char *) (buffer + k)) ;
+} /* bf2f_array */
+
+static void
+f2bf_array (float *buffer, unsigned int count)
+{ int k ;
+
+ for (k = 0 ; k < count ; k++)
+ float32_write (buffer [k], (unsigned char*) (buffer + k)) ;
+} /* f2bf_array */
+
--- /dev/null
+++ b/common/libsndfile/src/floatcast.h
@@ -1,0 +1,37 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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.
+*/
+
+/* On Intel Pentium processors (especially PIII and probably P4), converting
+** from float to int is very slow. To meet the C specs, the code produced by
+** most C compilers targeting Pentium needs to change the FPU rounding mode
+** before the float to int conversion is performed.
+**
+** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It
+** is this flushing of the pipeline which is so slow.
+*/
+
+
+/* These macros are place holders for inline functions which will replace
+** them in the near future.
+*/
+
+#define FLOAT_TO_INT(x) ((int)(x))
+#define FLOAT_TO_SHORT(x) ((short)(x))
+
+#define DOUBLE_TO_INT(x) ((int)(x))
+#define DOUBLE_TO_SHORT(x) ((short)(x))
--- /dev/null
+++ b/common/libsndfile/src/ircam.c
@@ -1,0 +1,332 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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 <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+/* The IRCAM magic number is weird in that one byte in the number can have
+** values of 0x1, 0x2, 0x03 or 0x04. Hence the need for a marker and a mask.
+*/
+
+#define IRCAM_02_MARKER (MAKE_MARKER (0x00, 0x02, 0xA3, 0x64))
+#define IRCAM_03_MARKER (MAKE_MARKER (0x64, 0xA3, 0x03, 0x00))
+#define IRCAM_04_MARKER (MAKE_MARKER (0x64, 0xA3, 0x04, 0x00))
+
+#define IRCAM_DATA_OFFSET (1024)
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+enum
+{ IRCAM_PCM_16 = 0x00002,
+ IRCAM_FLOAT = 0x00004,
+ IRCAM_ALAW = 0x10001,
+ IRCAM_ULAW = 0x20001,
+ IRCAM_PCM_32 = 0x40004
+} ;
+
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int ircam_close (SF_PRIVATE *psf) ;
+static int ircam_write_header (SF_PRIVATE *psf) ;
+
+static int get_encoding (SF_PRIVATE *psf) ;
+
+static char* get_encoding_str (int encoding) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+ircam_open_read (SF_PRIVATE *psf)
+{ unsigned int marker, encoding ;
+ float samplerate ;
+ int error = SFE_NO_ERROR ;
+
+ psf_binheader_readf (psf, "pm", 0, &marker) ;
+
+ if (marker == IRCAM_03_MARKER)
+ { psf->endian = SF_ENDIAN_LITTLE ;
+
+ if (CPU_IS_LITTLE_ENDIAN)
+ marker = ENDSWAP_INT (marker) ;
+ psf_log_printf (psf, "marker: 0x%X => little endian\n", marker) ;
+
+ psf_binheader_readf (psf, "fll", &samplerate, &(psf->sf.channels), &encoding) ;
+
+ psf->sf.samplerate = (int) samplerate ;
+ psf_log_printf (psf, " Sample Rate : %d\n", psf->sf.samplerate) ;
+ psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ;
+ psf_log_printf (psf, " Encoding : %X => %s\n", encoding, get_encoding_str (encoding)) ;
+ }
+ else if (marker == IRCAM_02_MARKER || marker == IRCAM_04_MARKER)
+ { psf->endian = SF_ENDIAN_BIG ;
+
+ if (CPU_IS_BIG_ENDIAN)
+ marker = ENDSWAP_INT (marker) ;
+ psf_log_printf (psf, "marker: 0x%X => big endian\n", marker) ;
+
+ psf_binheader_readf (psf, "FLL", &samplerate, &(psf->sf.channels), &encoding) ;
+
+ psf->sf.samplerate = (int) samplerate ;
+ psf_log_printf (psf, " Sample Rate : %d\n", psf->sf.samplerate) ;
+ psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ;
+ psf_log_printf (psf, " Encoding : %X => %s\n", encoding, get_encoding_str (encoding)) ;
+ }
+ else
+ return SFE_IRCAM_NO_MARKER ;
+
+ /* Sanit checking for endian-ness detection. */
+ if (psf->sf.channels > 256)
+ return SFE_IRCAM_BAD_CHANNELS ;
+
+ psf->sf.sections = 1 ;
+ psf->sf.seekable = SF_TRUE ;
+
+ switch (encoding)
+ { case IRCAM_PCM_16 :
+ psf->sf.pcmbitwidth = 16 ;
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+ psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
+ else
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
+
+ error = pcm_read_init (psf) ;
+ break ;
+
+ case IRCAM_PCM_32 :
+ psf->sf.pcmbitwidth = 32 ;
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+ psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
+ else
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
+
+ error = pcm_read_init (psf) ;
+ break ;
+
+ case IRCAM_FLOAT :
+ psf->sf.pcmbitwidth = 32 ;
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+ psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_BE ;
+ else
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_LE ;
+
+ error = float32_read_init (psf) ;
+ break ;
+
+ default :
+ error = SFE_IRCAM_UNKNOWN_FORMAT ;
+ break ;
+ } ;
+
+ if (error)
+ return error ;
+
+ psf->dataoffset = IRCAM_DATA_OFFSET ;
+ psf->datalength = psf->filelength - psf->dataoffset ;
+
+ if (! psf->sf.samples && psf->blockwidth)
+ psf->sf.samples = psf->datalength / psf->blockwidth ;
+
+ psf_log_printf (psf, " Samples : %d\n", psf->sf.samples) ;
+
+ psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ;
+
+ return 0 ;
+} /* ircam_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+ircam_open_write (SF_PRIVATE *psf)
+{ unsigned int encoding, subformat ;
+ int error = SFE_NO_ERROR ;
+
+ if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_IRCAM)
+ return SFE_BAD_OPEN_FORMAT ;
+
+ subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+ if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+ psf->bytewidth = 1 ;
+ else
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+ psf->sf.seekable = SF_TRUE ;
+ psf->error = 0 ;
+
+ psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+ psf->dataoffset = IRCAM_DATA_OFFSET ;
+ psf->datalength = psf->blockwidth * psf->sf.samples ;
+ psf->filelength = psf->datalength + psf->dataoffset ;
+
+ if (! (encoding = ircam_write_header (psf)))
+ return psf->error ;
+
+ psf->close = (func_close) ircam_close ;
+ psf->write_header = (func_wr_hdr) ircam_write_header ;
+
+ switch (encoding)
+ { case IRCAM_PCM_16 : /* 16-bit linear PCM. */
+ case IRCAM_PCM_32 : /* 32-bit linear PCM. */
+ error = pcm_write_init (psf) ;
+ break ;
+
+ case IRCAM_FLOAT : /* 32-bit linear PCM. */
+ error = float32_write_init (psf) ;
+ break ;
+
+ default : break ;
+ } ;
+
+ return error ;
+} /* ircam_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+ircam_close (SF_PRIVATE *psf)
+{
+ return 0 ;
+} /* ircam_close */
+
+static int
+ircam_write_header (SF_PRIVATE *psf)
+{ int encoding ;
+ float samplerate ;
+
+ /* This also sets psf->endian. */
+ encoding = get_encoding (psf) ;
+
+ if (! encoding)
+ { psf->error = SFE_BAD_OPEN_FORMAT ;
+ return encoding ;
+ } ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ samplerate = psf->sf.samplerate ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ { psf_binheader_writef (psf, "mF", IRCAM_02_MARKER, samplerate) ;
+ psf_binheader_writef (psf, "LL", psf->sf.channels, encoding) ;
+ }
+ else if (psf->endian == SF_ENDIAN_LITTLE)
+ { psf_binheader_writef (psf, "mf", IRCAM_03_MARKER, samplerate) ;
+ psf_binheader_writef (psf, "ll", psf->sf.channels, encoding) ;
+ }
+ else
+ { psf->error = SFE_BAD_OPEN_FORMAT ;
+ return encoding ;
+ } ;
+
+ psf_binheader_writef (psf, "z", IRCAM_DATA_OFFSET - psf->headindex) ;
+
+ /* Header construction complete so write it out. */
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ return encoding ;
+} /* ircam_write_header */
+
+static int
+get_encoding (SF_PRIVATE *psf)
+{ unsigned int format, bitwidth ;
+
+ format = psf->sf.format & SF_FORMAT_SUBMASK ;
+ bitwidth = psf->bytewidth * 8 ;
+
+ /* Default endian-ness is the same as host processor unless overridden. */
+ if (format == SF_FORMAT_PCM_BE || format == SF_FORMAT_FLOAT_BE)
+ psf->endian = SF_ENDIAN_BIG ;
+ else if (format == SF_FORMAT_PCM_LE || format == SF_FORMAT_FLOAT_LE)
+ psf->endian = SF_ENDIAN_LITTLE ;
+ else if (CPU_IS_BIG_ENDIAN)
+ psf->endian = SF_ENDIAN_BIG ;
+ else
+ psf->endian = SF_ENDIAN_LITTLE ;
+
+ switch (format)
+ { case SF_FORMAT_ULAW : return IRCAM_ULAW ;
+ case SF_FORMAT_ALAW : return IRCAM_ALAW ;
+
+ case SF_FORMAT_PCM :
+ case SF_FORMAT_PCM_BE :
+ case SF_FORMAT_PCM_LE :
+ /* For PCM encoding, the header encoding field depends on the bitwidth. */
+ switch (bitwidth)
+ { case 16 : return IRCAM_PCM_16 ;
+ case 32 : return IRCAM_PCM_32 ;
+ default : break ;
+ } ;
+ break ;
+
+ case SF_FORMAT_FLOAT :
+ case SF_FORMAT_FLOAT_BE :
+ case SF_FORMAT_FLOAT_LE :
+ return IRCAM_FLOAT ;
+
+ default : break ;
+ } ;
+
+ return 0 ;
+} /* get_encoding */
+
+static char*
+get_encoding_str (int encoding)
+{ switch (encoding)
+ { case IRCAM_PCM_16 : return "16 bit PCM" ;
+ case IRCAM_FLOAT : return "32 bit float" ;
+ case IRCAM_ALAW : return "A law" ;
+ case IRCAM_ULAW : return "u law" ;
+ case IRCAM_PCM_32 : return "32 bit PCM" ;
+ } ;
+ return "Unknown encoding" ;
+} /* get_encoding_str */
+
--- a/common/libsndfile/src/newpcm.c
+++ /dev/null
@@ -1,44 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <unistd.h>
-
-#include "config.h"
-#include "sndfile.h"
-#include "common.h"
-#include "sfendian.h"
-#include "pcm.h"
-
-
-/*==================================================================================
-*/
-
-int pcm_read_init (SF_PRIVATE *psf, int channels, int bytewidth)
-{
-
- return 0 ;
-} /* pcm_read_init */
-
-int pcm_write_init (SF_PRIVATE *psf, int channels, int bytewidth)
-{
-
- return 0 ;
-} /* pcm_read_init */
-
-
--- /dev/null
+++ b/common/libsndfile/src/nist.c
@@ -1,0 +1,274 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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.
+*/
+
+/*
+** Some of the information used to read NIST files was gleaned from
+** reading the code of Bill Schottstaedt's sndlib library
+** ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
+** However, no code from that package was used.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*------------------------------------------------------------------------------
+*/
+
+#define NIST_HEADER_LENGTH 1024
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int nist_close (SF_PRIVATE *psf) ;
+static void nist_write_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+nist_open_read (SF_PRIVATE *psf)
+{ char *psf_header ;
+ int error ;
+
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ psf_header = (char*) psf->header ;
+
+ fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+ psf_log_printf (psf, psf_header) ;
+ if (strlen (psf_header) != 8 || strcmp (psf_header, "NIST_1A\n"))
+ return SFE_NIST_BAD_HEADER ;
+
+ fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+ psf_log_printf (psf, psf_header) ;
+ if (strlen (psf_header) != 8 || atoi (psf_header) != 1024)
+ return SFE_NIST_BAD_HEADER ;
+
+ while (ftell (psf->file) < 1024 && !ferror (psf->file))
+ { fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+ psf_log_printf (psf, psf_header) ;
+
+ if (strstr (psf_header, "channel_count -i ") == psf_header)
+ sscanf (psf_header, "channel_count -i %u", &(psf->sf.channels)) ;
+
+ if (strstr (psf_header, "sample_count -i ") == psf_header)
+ sscanf (psf_header, "sample_count -i %u", &(psf->sf.samples)) ;
+
+ if (strstr (psf_header, "sample_rate -i ") == psf_header)
+ sscanf (psf_header, "sample_rate -i %u", &(psf->sf.samplerate)) ;
+
+ if (strstr (psf_header, "sample_n_bytes -i ") == psf_header)
+ sscanf (psf_header, "sample_n_bytes -i %u", &(psf->bytewidth)) ;
+
+ if (strstr (psf_header, "sample_sig_bits -i ") == psf_header)
+ sscanf (psf_header, "sample_sig_bits -i %u", &(psf->sf.pcmbitwidth)) ;
+
+ if (strstr (psf_header, "sample_byte_format -s") == psf_header)
+ { int bytes ;
+ char str [8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
+
+ sscanf (psf_header, "sample_byte_format -s%d %5s", &bytes, str) ;
+ if (bytes < 2 || bytes > 4)
+ return SFE_NIST_BAD_ENCODING ;
+
+ psf->bytewidth = bytes ;
+
+ if (strstr (str, "01") == str)
+ { psf->endian = SF_ENDIAN_LITTLE ;
+ psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_LE ;
+ }
+ else if (strstr (str, "10"))
+ { psf->endian = SF_ENDIAN_BIG ;
+ psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_BE ;
+ } ;
+ } ;
+
+ if (strstr (psf_header, "sample_coding -s") == psf_header)
+ return SFE_NIST_BAD_ENCODING ;
+
+ if (strstr (psf_header, "end_head") == psf_header)
+ break ;
+ } ;
+
+ psf->dataoffset = NIST_HEADER_LENGTH ;
+ psf->current = 0 ;
+ psf->sf.seekable = SF_TRUE ;
+ psf->sf.sections = 1 ;
+
+ psf->close = (func_close) nist_close ;
+
+ psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+ psf->datalength = psf->filelength - psf->dataoffset ;
+
+ if ((error = pcm_read_init (psf)))
+ return error ;
+
+ fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+
+ return 0 ;
+} /* nist_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+nist_open_write (SF_PRIVATE *psf)
+{ int subformat, error ;
+
+ if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_NIST)
+ return SFE_BAD_OPEN_FORMAT ;
+
+ subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+ if (subformat == SF_FORMAT_PCM_BE)
+ psf->endian = SF_ENDIAN_BIG ;
+ else if (subformat == SF_FORMAT_PCM_LE)
+ psf->endian = SF_ENDIAN_LITTLE ;
+ else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
+ psf->endian = SF_ENDIAN_BIG ;
+ else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
+ psf->endian = SF_ENDIAN_LITTLE ;
+ else
+ return SFE_BAD_OPEN_FORMAT ;
+
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+ psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+ psf->dataoffset = NIST_HEADER_LENGTH ;
+ psf->datalength = psf->blockwidth * psf->sf.samples ;
+ psf->filelength = psf->datalength + psf->dataoffset ;
+ psf->error = 0 ;
+
+ if ((error = pcm_write_init (psf)))
+ return error ;
+
+ psf->close = (func_close) nist_close ;
+ psf->write_header = (func_wr_hdr) nist_write_header ;
+
+ nist_write_header (psf) ;
+
+ return 0 ;
+} /* nist_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+nist_close (SF_PRIVATE *psf)
+{
+ if (psf->mode == SF_MODE_WRITE)
+ { /* Now we know for certain the length of the file we can
+ ** re-write correct values for the datasize header element.
+ */
+
+ fseek (psf->file, 0, SEEK_END) ;
+ psf->filelength = ftell (psf->file) ;
+
+ psf->dataoffset = NIST_HEADER_LENGTH ;
+ psf->datalength = psf->filelength - psf->dataoffset ;
+
+ psf->sf.samples = psf->datalength / psf->blockwidth ;
+
+ nist_write_header (psf) ;
+ } ;
+
+ if (psf->fdata)
+ free (psf->fdata) ;
+ psf->fdata = NULL ;
+
+ return 0 ;
+} /* nist_close */
+
+/*=========================================================================
+*/
+
+static void
+nist_write_header (SF_PRIVATE *psf)
+{ char *end_str ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ end_str = "10" ;
+ else if (psf->endian == SF_ENDIAN_LITTLE)
+ end_str = "01" ;
+ else
+ end_str = "error" ;
+
+ /* Clear the whole header. */
+ memset (psf->header, 0, sizeof (psf->header)) ;
+
+ psf_asciiheader_printf (psf, "NIST_1A\n 1024\n") ;
+ psf_asciiheader_printf (psf, "channel_count -i %d\n", psf->sf.channels) ;
+ psf_asciiheader_printf (psf, "sample_rate -i %d\n", psf->sf.samplerate) ;
+ psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ;
+ psf_asciiheader_printf (psf, "sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ;
+ psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->sf.pcmbitwidth) ;
+ psf_asciiheader_printf (psf, "sample_count -i %d\n", psf->sf.samples) ;
+ psf_asciiheader_printf (psf, "end_head\n") ;
+
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ /* Zero fill to dataoffset. */
+ psf_binheader_writef (psf, "z", NIST_HEADER_LENGTH - psf->headindex) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ return ;
+} /* nist_write_header */
+
+/*-
+
+These were used to parse the sample_byte_format field but were discarded in favour
+os a simpler method using strstr ().
+
+static
+int strictly_ascending (char *str)
+{ int k ;
+
+ if (strlen (str) < 2)
+ return 0 ;
+
+ for (k = 1 ; str [k] ; k++)
+ if (str [k] != str [k-1] + 1)
+ return 0 ;
+
+ return 1 ;
+} /+* strictly_ascending *+/
+
+static int strictly_descending (char *str)
+{ int k ;
+
+ if (strlen (str) < 2)
+ return 0 ;
+
+ for (k = 1 ; str [k] ; k++)
+ if (str [k] + 1 != str [k-1])
+ return 0 ;
+
+ return 1 ;
+} /+* strictly_descending *+/
+
+-*/
--- a/common/libsndfile/src/paf.c
+++ b/common/libsndfile/src/paf.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -23,25 +23,16 @@
#include <string.h>
#include <ctype.h>
-#include "sndfile.h"
#include "config.h"
+#include "sndfile.h"
#include "sfendian.h"
+#include "floatcast.h"
#include "common.h"
-#include "pcm.h"
-
/*------------------------------------------------------------------------------
** Macros to handle big/little endian issues.
*/
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-# error "Cannot determine endian-ness of processor."
-#endif
-
#define FAP_MARKER (MAKE_MARKER ('f', 'a', 'p', ' '))
#define PAF_MARKER (MAKE_MARKER (' ', 'p', 'a', 'f'))
@@ -68,11 +59,9 @@
{ unsigned int index, blocks, channels, samplesperblock, blockcount, blocksize, samplecount ;
unsigned char *block ;
int *samples ;
- unsigned char data [4] ;
+ unsigned char data [1] ; /* Data size fixed during malloc (). */
} PAF24_PRIVATE ;
-
-
/*------------------------------------------------------------------------------
** Private static functions.
*/
@@ -86,51 +75,57 @@
static int paf24_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
static int paf24_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int paf24_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
static int paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
static int paf24_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
static int paf24_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int paf24_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
static int paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static off_t paf24_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
+static long paf24_seek (SF_PRIVATE *psf, long offset, int whence) ;
+/*
static void endswap_paf_fmt (PAF_FMT *ppaf_fmt) ;
+*/
/*------------------------------------------------------------------------------
** Public functions.
*/
-int paf_open_read (SF_PRIVATE *psf)
+int
+paf_open_read (SF_PRIVATE *psf)
{ PAF_FMT paf_fmt ;
unsigned int marker ;
int error ;
- fread (&marker, sizeof (marker), 1, psf->file) ;
- if (marker != PAF_MARKER && marker != FAP_MARKER)
- return SFE_PAF_NO_MARKER ;
-
- psf_sprintf (psf, "Signature : %D\n", marker) ;
-
- fread (&paf_fmt, sizeof (PAF_FMT), 1, psf->file) ;
+ psf_binheader_readf (psf, "pm", 0, &marker) ;
- if (CPU_IS_LITTLE_ENDIAN && marker == PAF_MARKER)
- endswap_paf_fmt (&paf_fmt) ;
- else if (CPU_IS_BIG_ENDIAN && marker == FAP_MARKER)
- endswap_paf_fmt (&paf_fmt) ;
+ psf_log_printf (psf, "Signature : %D\n", marker) ;
- psf_sprintf (psf, "Version : %d\n", paf_fmt.version) ;
+ if (marker == PAF_MARKER)
+ { psf_binheader_readf (psf, "LLLLLL", &(paf_fmt.version), &(paf_fmt.endianness),
+ &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
+ }
+ else if (marker == FAP_MARKER)
+ { psf_binheader_readf (psf, "llllll", &(paf_fmt.version), &(paf_fmt.endianness),
+ &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
+ }
+ else
+ return SFE_PAF_NO_MARKER ;
+
+ psf_log_printf (psf, "Version : %d\n", paf_fmt.version) ;
if (paf_fmt.version != 0)
- { psf_sprintf (psf, "*** Bad version number. Should be zero.\n") ;
+ { psf_log_printf (psf, "*** Bad version number. should be zero.\n") ;
return SFE_PAF_VERSION ;
} ;
- psf_sprintf (psf, "Endianness : %d => ", paf_fmt.endianness) ;
+ psf_log_printf (psf, "Endianness : %d => ", paf_fmt.endianness) ;
if (paf_fmt.endianness)
- psf_sprintf (psf, "Little\n", paf_fmt.endianness) ;
+ psf_log_printf (psf, "Little\n", paf_fmt.endianness) ;
else
- psf_sprintf (psf, "Big\n", paf_fmt.endianness) ;
- psf_sprintf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
-
+ psf_log_printf (psf, "Big\n", paf_fmt.endianness) ;
+ psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
if (psf->filelength < PAF_HEADER_LENGTH)
return SFE_PAF_SHORT_HEADER ;
@@ -140,11 +135,9 @@
psf->current = 0 ;
psf->endian = paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
- psf->sf.seekable = SF_TRUE ;
-
- if (fseek (psf->file, psf->dataoffset, SEEK_SET))
- return SFE_BAD_SEEK ;
+ psf_binheader_readf (psf, "p", psf->dataoffset) ;
+
psf->sf.samplerate = paf_fmt.samplerate ;
psf->sf.channels = paf_fmt.channels ;
@@ -153,38 +146,31 @@
psf->sf.sections = 1 ;
- psf_sprintf (psf, "Format : %d => ", paf_fmt.format) ;
+ psf_log_printf (psf, "Format : %d => ", paf_fmt.format) ;
switch (paf_fmt.format)
- { case 0 : psf_sprintf (psf, "16 bit linear PCM\n") ;
+ { case 0 : psf_log_printf (psf, "16 bit linear PCM\n") ;
psf->sf.pcmbitwidth = 16 ;
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
psf->sf.format |= paf_fmt.endianness ? SF_FORMAT_PCM_LE : SF_FORMAT_PCM_BE ; ;
- if (psf->endian == SF_ENDIAN_BIG)
- { psf->read_short = (func_short) pcm_read_bes2s ;
- psf->read_int = (func_int) pcm_read_bes2i ;
- psf->read_double = (func_double) pcm_read_bes2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_les2s ;
- psf->read_int = (func_int) pcm_read_les2i ;
- psf->read_double = (func_double) pcm_read_les2d ;
- } ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
+
psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- psf_sprintf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
+ psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
if (psf->blockwidth)
psf->sf.samples = psf->datalength / psf->blockwidth ;
else
- psf_sprintf (psf, "*** Warning : blockwidth == 0.\n") ;
+ psf_log_printf (psf, "*** Warning : blockwidth == 0.\n") ;
- psf_sprintf (psf, "X samples : %d\n", psf->sf.samples) ;
+ psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
break ;
- case 1 : psf_sprintf (psf, "24 bit linear PCM\n") ;
+ case 1 : psf_log_printf (psf, "24 bit linear PCM\n") ;
psf->sf.pcmbitwidth = 24 ;
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
@@ -192,6 +178,7 @@
psf->read_short = (func_short) paf24_read_s ;
psf->read_int = (func_int) paf24_read_i ;
+ psf->read_float = (func_float) paf24_read_f ;
psf->read_double = (func_double) paf24_read_d ;
if ((error = paf24_reader_init (psf)))
@@ -201,29 +188,29 @@
psf->close = (func_close) paf24_close ;
psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- psf_sprintf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
+ psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
psf->sf.samples = 10 * psf->datalength / (32 * psf->sf.channels) ;
- psf_sprintf (psf, "X samples : %d\n", psf->sf.samples) ;
+ psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
break ;
- default : psf_sprintf (psf, "Unknown\n") ;
+ default : psf_log_printf (psf, "Unknown\n") ;
return SFE_PAF_UNKNOWN_FORMAT ;
break ;
} ;
- psf_sprintf (psf, "Channels : %d\n", paf_fmt.channels) ;
- psf_sprintf (psf, "Source : %d => ", paf_fmt.source) ;
+ psf_log_printf (psf, "Channels : %d\n", paf_fmt.channels) ;
+ psf_log_printf (psf, "Source : %d => ", paf_fmt.source) ;
switch (paf_fmt.source)
- { case 1 : psf_sprintf (psf, "Analog Recording\n") ;
+ { case 1 : psf_log_printf (psf, "Analog Recording\n") ;
break ;
- case 2 : psf_sprintf (psf, "Digital Transfer\n") ;
+ case 2 : psf_log_printf (psf, "Digital Transfer\n") ;
break ;
- case 3 : psf_sprintf (psf, "Multi-track Mixdown\n") ;
+ case 3 : psf_log_printf (psf, "Multi-track Mixdown\n") ;
break ;
- case 5 : psf_sprintf (psf, "Audio Resulting From DSP Processing\n") ;
+ case 5 : psf_log_printf (psf, "Audio Resulting From DSP Processing\n") ;
break ;
- default : psf_sprintf (psf, "Unknown\n") ;
+ default : psf_log_printf (psf, "Unknown\n") ;
break ;
} ;
@@ -233,37 +220,41 @@
/*------------------------------------------------------------------------------
*/
-int paf_open_write (SF_PRIVATE *psf)
+int
+paf_open_write (SF_PRIVATE *psf)
{ PAF_FMT paf_fmt ;
- int format, subformat, error, count ;
- unsigned int marker, big_endian_file ;
+ int subformat, error, paf_format ;
- format = psf->sf.format & SF_FORMAT_TYPEMASK ;
- subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-
- if (format != SF_FORMAT_PAF)
+ if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF)
return SFE_BAD_OPEN_FORMAT ;
+ subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
if (subformat == SF_FORMAT_PCM_BE)
- { big_endian_file = 1 ;
- paf_fmt.endianness = 0 ;
- }
+ psf->endian = SF_ENDIAN_BIG ;
else if (subformat == SF_FORMAT_PCM_LE)
- { big_endian_file = 0 ;
- paf_fmt.endianness = 1 ;
- }
+ psf->endian = SF_ENDIAN_LITTLE ;
+ else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
+ psf->endian = SF_ENDIAN_BIG ;
+ else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
+ psf->endian = SF_ENDIAN_LITTLE ;
else
return SFE_BAD_OPEN_FORMAT ;
- paf_fmt.version = 0 ;
- paf_fmt.samplerate = psf->sf.samplerate ;
-
+ psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+ psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+ psf->dataoffset = PAF_HEADER_LENGTH ;
+ psf->datalength = psf->blockwidth * psf->sf.samples ;
+ psf->filelength = psf->datalength + psf->dataoffset ;
+ psf->error = 0 ;
+
switch (psf->sf.pcmbitwidth)
- { case 16 : paf_fmt.format = 0 ;
+ { case 16 : paf_format = 0 ;
psf->bytewidth = 2 ;
break ;
- case 24 : paf_fmt.format = 1 ;
+ case 24 : paf_format = 1 ;
psf->bytewidth = 3 ;
break ;
@@ -270,36 +261,16 @@
default : return SFE_PAF_UNKNOWN_FORMAT ;
} ;
- paf_fmt.channels = psf->sf.channels ;
- paf_fmt.source = 0 ;
-
- psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-
- psf->endian = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
- psf->sf.seekable = SF_TRUE ;
- psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- psf->dataoffset = PAF_HEADER_LENGTH ;
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
- psf->error = 0 ;
-
- switch (paf_fmt.format)
+ switch (paf_format)
{ case 0 : /* 16-bit linear PCM. */
- if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bes ;
- psf->write_int = (func_int) pcm_write_i2bes ;
- psf->write_double = (func_double) pcm_write_d2bes ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2les ;
- psf->write_int = (func_int) pcm_write_i2les ;
- psf->write_double = (func_double) pcm_write_d2les ;
- } ;
+ if ((error = pcm_write_init (psf)))
+ return error ;
break ;
case 1 : /* 24-bit linear PCM */
psf->write_short = (func_short) paf24_write_s ;
psf->write_int = (func_int) paf24_write_i ;
+ psf->write_float = (func_float) paf24_write_f ;
psf->write_double = (func_double) paf24_write_d ;
if ((error = paf24_writer_init (psf)))
@@ -311,30 +282,29 @@
default : break ;
} ;
-
- if (big_endian_file)
- { if (CPU_IS_LITTLE_ENDIAN)
- endswap_paf_fmt (&paf_fmt) ;
- marker = PAF_MARKER ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+
+ if (psf->endian == SF_ENDIAN_BIG)
+ { /* Marker, version, endianness, samplerate */
+ psf_binheader_writef (psf, "mLLL", PAF_MARKER, 0, 0, psf->sf.samplerate) ;
+ /* format, channels, source */
+ psf_binheader_writef (psf, "LLL", paf_format, psf->sf.channels, paf_fmt.source) ;
}
- else
- { if (CPU_IS_BIG_ENDIAN)
- endswap_paf_fmt (&paf_fmt) ;
- marker = FAP_MARKER ;
+ else if (psf->endian == SF_ENDIAN_LITTLE)
+ { /* Marker, version, endianness, samplerate */
+ psf_binheader_writef (psf, "mlll", FAP_MARKER, 0, 1, psf->sf.samplerate) ;
+ /* format, channels, source */
+ psf_binheader_writef (psf, "lll", paf_format, psf->sf.channels, 0) ;
} ;
-
- fwrite (&marker, sizeof (marker), 1, psf->file) ;
- fwrite (&paf_fmt, sizeof (PAF_FMT), 1, psf->file) ;
- /* Fill the file from current position to dataoffset with zero bytes. */
- memset (psf->buffer, 0, sizeof (psf->buffer)) ;
- count = psf->dataoffset - ftell (psf->file) ;
- while (count > 0)
- { int current = (count > sizeof (psf->buffer)) ? sizeof (psf->buffer) : count ;
- fwrite (psf->buffer, current, 1, psf->file) ;
- count -= current ;
- } ;
-
+ /* Zero fill to dataoffset. */
+ psf_binheader_writef (psf, "z", psf->dataoffset - psf->headindex) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
return 0 ;
} /* paf_open_write */
@@ -352,8 +322,8 @@
** The code below attempts to gain efficiency while maintaining readability.
*/
-static
-int paf24_reader_init (SF_PRIVATE *psf)
+static int
+paf24_reader_init (SF_PRIVATE *psf)
{ PAF24_PRIVATE *ppaf24 ;
unsigned int paf24size ;
@@ -372,7 +342,7 @@
ppaf24->samplesperblock = 10 ;
if (psf->datalength % ppaf24->blocksize)
- { psf_sprintf (psf, "*** Warning : file seems to be truncated.\n") ;
+ { psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
ppaf24->blocks = psf->datalength / ppaf24->blocksize + 1 ;
}
else
@@ -386,8 +356,8 @@
} /* paf24_reader_init */
-static
-int paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
+static int
+paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
{ int k, *iptr, newsample, channel ;
unsigned char *cptr ;
@@ -402,7 +372,7 @@
/* Read the block. */
if ((k = fread (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
- psf_sprintf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
/* Do endian swapping if necessary. */
@@ -425,8 +395,8 @@
return 1 ;
} /* paf24_read_block */
-static
-int paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+static int
+paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -450,8 +420,8 @@
return total ;
} /* paf24_read */
-static
-int paf24_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+paf24_read_s (SF_PRIVATE *psf, short *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int *iptr ;
int k, bufferlen, readcount = 0, count ;
@@ -475,8 +445,8 @@
return total ;
} /* paf24_read_s */
-static
-int paf24_read_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+paf24_read_i (SF_PRIVATE *psf, int *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int total ;
@@ -489,8 +459,8 @@
return total ;
} /* paf24_read_i */
-static
-int paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+paf24_read_f (SF_PRIVATE *psf, float *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int *iptr ;
int k, bufferlen, readcount = 0, count ;
@@ -506,6 +476,31 @@
{ readcount = (len >= bufferlen) ? bufferlen : len ;
count = paf24_read (psf, ppaf24, iptr, readcount) ;
for (k = 0 ; k < readcount ; k++)
+ ptr [index+k] = (float) (iptr [k]) ;
+ index += readcount ;
+ total += count ;
+ len -= readcount ;
+ } ;
+ return total ;
+} /* paf24_read_f */
+
+static int
+paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ PAF24_PRIVATE *ppaf24 ;
+ int *iptr ;
+ int k, bufferlen, readcount = 0, count ;
+ int index = 0, total = 0 ;
+
+ if (! psf->fdata)
+ return 0 ;
+ ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+
+ iptr = (int*) psf->buffer ;
+ bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+ while (len > 0)
+ { readcount = (len >= bufferlen) ? bufferlen : len ;
+ count = paf24_read (psf, ppaf24, iptr, readcount) ;
+ for (k = 0 ; k < readcount ; k++)
ptr [index+k] = (double) (iptr [k]) ;
index += readcount ;
total += count ;
@@ -517,8 +512,8 @@
/*---------------------------------------------------------------------------
*/
-static
-int paf24_writer_init (SF_PRIVATE *psf)
+static int
+paf24_writer_init (SF_PRIVATE *psf)
{ PAF24_PRIVATE *ppaf24 ;
unsigned int paf24size ;
@@ -537,7 +532,7 @@
ppaf24->samplesperblock = 10 ;
if (psf->datalength % ppaf24->blocksize)
- { psf_sprintf (psf, "*** Warning : file seems to be truncated.\n") ;
+ { psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
ppaf24->blocks = psf->datalength / ppaf24->blocksize + 1 ;
}
else
@@ -549,8 +544,8 @@
} /* paf24_writer_init */
-static
-int paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
+static int
+paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
{ int k, *iptr, nextsample, channel ;
unsigned char *cptr ;
@@ -577,7 +572,7 @@
/* Write block to disk. */
if ((k = fwrite (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
- psf_sprintf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
ppaf24->blockcount ++ ;
ppaf24->samplecount = 0 ;
@@ -585,8 +580,8 @@
return 1 ;
} /* paf24_write_block */
-static
-int paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+static int
+paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -607,8 +602,8 @@
return total ;
} /* paf24_write */
-static
-int paf24_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+paf24_write_s (SF_PRIVATE *psf, short *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int *iptr ;
int k, bufferlen, writecount = 0, count ;
@@ -632,8 +627,8 @@
return total ;
} /* paf24_write_s */
-static
-int paf24_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+paf24_write_i (SF_PRIVATE *psf, int *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int total = 0 ;
@@ -646,8 +641,8 @@
return total ;
} /* paf24_write_i */
-static
-int paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+paf24_write_f (SF_PRIVATE *psf, float *ptr, int len)
{ PAF24_PRIVATE *ppaf24 ;
int *iptr ;
int k, bufferlen, writecount = 0, count ;
@@ -662,7 +657,7 @@
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- iptr [k] = (int) ptr [index+k] ;
+ iptr [k] = FLOAT_TO_INT (ptr [index+k]) ;
count = paf24_write (psf, ppaf24, iptr, writecount) ;
index += writecount ;
total += count ;
@@ -669,23 +664,49 @@
len -= writecount ;
} ;
return total ;
+} /* paf24_write_f */
+
+static int
+paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ PAF24_PRIVATE *ppaf24 ;
+ int *iptr ;
+ int k, bufferlen, writecount = 0, count ;
+ int index = 0, total = 0 ;
+
+ if (! psf->fdata)
+ return 0 ;
+ ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+
+ iptr = (int*) psf->buffer ;
+ bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+ while (len > 0)
+ { writecount = (len >= bufferlen) ? bufferlen : len ;
+ for (k = 0 ; k < writecount ; k++)
+ iptr [k] = DOUBLE_TO_INT (ptr [index+k]) ;
+ count = paf24_write (psf, ppaf24, iptr, writecount) ;
+ index += writecount ;
+ total += count ;
+ len -= writecount ;
+ } ;
+ return total ;
} /* paf24_write_d */
/*---------------------------------------------------------------------------
*/
-static
-off_t paf24_seek (SF_PRIVATE *psf, off_t offset, int whence)
+static long
+paf24_seek (SF_PRIVATE *psf, long offset, int whence)
{ PAF24_PRIVATE *ppaf24 ;
int newblock, newsample ;
if (! psf->fdata)
return 0 ;
+
ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
switch (whence)
@@ -692,7 +713,7 @@
{ case SEEK_SET :
if (offset < 0 || offset > ppaf24->blocks * ppaf24->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = offset / ppaf24->samplesperblock ;
newsample = offset % ppaf24->samplesperblock ;
@@ -701,7 +722,7 @@
case SEEK_CUR :
if (psf->current + offset < 0 || psf->current + offset > ppaf24->blocks * ppaf24->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (psf->current + offset) / ppaf24->samplesperblock ;
newsample = (psf->current + offset) % ppaf24->samplesperblock ;
@@ -710,7 +731,7 @@
case SEEK_END :
if (offset > 0 || ppaf24->samplesperblock * ppaf24->blocks + offset < 0)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (ppaf24->samplesperblock * ppaf24->blocks + offset) / ppaf24->samplesperblock ;
newsample = (ppaf24->samplesperblock * ppaf24->blocks + offset) % ppaf24->samplesperblock ;
@@ -718,7 +739,7 @@
default :
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
if (psf->mode == SF_MODE_READ)
@@ -730,10 +751,11 @@
else
{ /* What to do about write??? */
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
psf->current = newblock * ppaf24->samplesperblock + newsample ;
+
return psf->current ;
} /* paf24_seek */
@@ -740,8 +762,8 @@
/*---------------------------------------------------------------------------
*/
-static
-int paf24_close (SF_PRIVATE *psf)
+static int
+paf24_close (SF_PRIVATE *psf)
{ PAF24_PRIVATE *ppaf24 ;
if (! psf->fdata)
@@ -763,8 +785,9 @@
/*---------------------------------------------------------------------------
*/
-static
-void endswap_paf_fmt (PAF_FMT *ppaf_fmt)
+/*-
+static void
+endswap_paf_fmt (PAF_FMT *ppaf_fmt)
{ ppaf_fmt->version = ENDSWAP_INT (ppaf_fmt->version) ;
ppaf_fmt->endianness = ENDSWAP_INT (ppaf_fmt->endianness) ;
ppaf_fmt->samplerate = ENDSWAP_INT (ppaf_fmt->samplerate) ;
@@ -771,4 +794,5 @@
ppaf_fmt->format = ENDSWAP_INT (ppaf_fmt->format) ;
ppaf_fmt->channels = ENDSWAP_INT (ppaf_fmt->channels) ;
ppaf_fmt->source = ENDSWAP_INT (ppaf_fmt->source) ;
-} /* endswap_paf_fmt */
+} /+* endswap_paf_fmt *+/
+-*/
--- a/common/libsndfile/src/pcm.c
+++ b/common/libsndfile/src/pcm.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -21,9 +21,9 @@
#include "config.h"
#include "sndfile.h"
-#include "common.h"
#include "sfendian.h"
-#include "pcm.h"
+#include "floatcast.h"
+#include "common.h"
/* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers
** (Metrowerks CodeWarrior for Mac is one) pad the struct with an extra byte.
@@ -33,6 +33,79 @@
{ char bytes [3] ;
} tribyte ;
+static int pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+
+static int pcm_write_s2sc (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2uc (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len) ;
+static int pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int pcm_write_i2sc (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2uc (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len) ;
+static int pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int pcm_write_f2sc (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2uc (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2les (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2let (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, int len) ;
+static int pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int pcm_write_d2sc (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2uc (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
static void sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index) ;
static void uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index) ;
static void bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
@@ -39,7 +112,6 @@
static void let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
static void bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
static void lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
-static void f2s_array (float *buffer, unsigned int count, short *ptr, int index) ;
static void sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index) ;
static void uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index) ;
@@ -47,8 +119,16 @@
static void les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
static void bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
static void let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
-static void f2i_array (float *buffer, unsigned int count, int *ptr, int index) ;
+static void sc2f_array (signed char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void uc2f_array (unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static void lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+
static void sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
static void uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
static void bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
@@ -57,8 +137,8 @@
static void let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
static void bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
static void lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static void f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+
static void s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count) ;
static void s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count) ;
static void s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
@@ -65,7 +145,6 @@
static void s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
static void s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;
static void s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;
-static void s2f_array (short *ptr, int index, float *buffer, unsigned int count) ;
static void i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count) ;
static void i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count) ;
@@ -73,8 +152,16 @@
static void i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;
static void i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
static void i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
-static void i2f_array (int *ptr, int index, float *buffer, unsigned int count) ;
+static void f2sc_array (float *ptr, int index, signed char *buffer, unsigned int count, float normfact) ;
+static void f2uc_array (float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact) ;
+static void f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
+static void f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
+static void f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
+static void f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
+static void f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
+static void f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
+
static void d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;
static void d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;
static void d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
@@ -83,13 +170,145 @@
static void d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
static void d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
static void d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
-static void d2f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact) ;
+/*-----------------------------------------------------------------------------------------------
+*/
+int
+pcm_read_init (SF_PRIVATE *psf)
+{
+ if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
+ { psf->read_short = (func_short) pcm_read_sc2s ;
+ psf->read_int = (func_int) pcm_read_sc2i ;
+ psf->read_float = (func_float) pcm_read_sc2f ;
+ psf->read_double = (func_double) pcm_read_sc2d ;
+ return 0 ;
+ }
+ else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
+ { psf->read_short = (func_short) pcm_read_uc2s ;
+ psf->read_int = (func_int) pcm_read_uc2i ;
+ psf->read_float = (func_float) pcm_read_uc2f ;
+ psf->read_double = (func_double) pcm_read_uc2d ;
+ return 0 ;
+ } ;
+
+ switch (psf->bytewidth * 0x10000 + psf->endian)
+ { case (2 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->read_short = (func_short) pcm_read_bes2s ;
+ psf->read_int = (func_int) pcm_read_bes2i ;
+ psf->read_float = (func_float) pcm_read_bes2f ;
+ psf->read_double = (func_double) pcm_read_bes2d ;
+ break ;
+ case (3 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->read_short = (func_short) pcm_read_bet2s ;
+ psf->read_int = (func_int) pcm_read_bet2i ;
+ psf->read_float = (func_float) pcm_read_bet2f ;
+ psf->read_double = (func_double) pcm_read_bet2d ;
+ break ;
+ case (4 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->read_short = (func_short) pcm_read_bei2s ;
+ psf->read_int = (func_int) pcm_read_bei2i ;
+ psf->read_float = (func_float) pcm_read_bei2f ;
+ psf->read_double = (func_double) pcm_read_bei2d ;
+ break ;
+
+ case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->read_short = (func_short) pcm_read_les2s ;
+ psf->read_int = (func_int) pcm_read_les2i ;
+ psf->read_float = (func_float) pcm_read_les2f ;
+ psf->read_double = (func_double) pcm_read_les2d ;
+ break ;
+ case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->read_short = (func_short) pcm_read_let2s ;
+ psf->read_int = (func_int) pcm_read_let2i ;
+ psf->read_float = (func_float) pcm_read_let2f ;
+ psf->read_double = (func_double) pcm_read_let2d ;
+ break ;
+ case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->read_short = (func_short) pcm_read_lei2s ;
+ psf->read_int = (func_int) pcm_read_lei2i ;
+ psf->read_float = (func_float) pcm_read_lei2f ;
+ psf->read_double = (func_double) pcm_read_lei2d ;
+ break ;
+ default : return SFE_UNIMPLEMENTED ;
+ } ;
+
+ return 0 ;
+} /* pcm_read_init */
+
+int
+pcm_write_init (SF_PRIVATE *psf)
+{
+ if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
+ { psf->write_short = (func_short) pcm_write_s2sc ;
+ psf->write_int = (func_int) pcm_write_i2sc ;
+ psf->write_float = (func_float) pcm_write_f2sc ;
+ psf->write_double = (func_double) pcm_write_d2sc ;
+ return 0 ;
+ }
+ else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
+ { psf->write_short = (func_short) pcm_write_s2uc ;
+ psf->write_int = (func_int) pcm_write_i2uc ;
+ psf->write_float = (func_float) pcm_write_f2uc ;
+ psf->write_double = (func_double) pcm_write_d2uc ;
+ return 0 ;
+ } ;
+
+ switch (psf->bytewidth * 0x10000 + psf->endian)
+ { case (2 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->write_short = (func_short) pcm_write_s2bes ;
+ psf->write_int = (func_int) pcm_write_i2bes ;
+ psf->write_float = (func_float) pcm_write_f2bes ;
+ psf->write_double = (func_double) pcm_write_d2bes ;
+ break ;
+
+ case (3 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->write_short = (func_short) pcm_write_s2bet ;
+ psf->write_int = (func_int) pcm_write_i2bet ;
+ psf->write_float = (func_float) pcm_write_f2bet ;
+ psf->write_double = (func_double) pcm_write_d2bet ;
+ break ;
+
+ case (4 * 0x10000 + SF_ENDIAN_BIG) :
+ psf->write_short = (func_short) pcm_write_s2bei ;
+ psf->write_int = (func_int) pcm_write_i2bei ;
+ psf->write_float = (func_float) pcm_write_f2bei ;
+ psf->write_double = (func_double) pcm_write_d2bei ;
+ break ;
+
+ case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->write_short = (func_short) pcm_write_s2les ;
+ psf->write_int = (func_int) pcm_write_i2les ;
+ psf->write_float = (func_float) pcm_write_f2les ;
+ psf->write_double = (func_double) pcm_write_d2les ;
+ break ;
+
+ case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->write_short = (func_short) pcm_write_s2let ;
+ psf->write_int = (func_int) pcm_write_i2let ;
+ psf->write_float = (func_float) pcm_write_f2let ;
+ psf->write_double = (func_double) pcm_write_d2let ;
+ break ;
+
+ case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+ psf->write_short = (func_short) pcm_write_s2lei ;
+ psf->write_int = (func_int) pcm_write_i2lei ;
+ psf->write_float = (func_float) pcm_write_f2lei ;
+ psf->write_double = (func_double) pcm_write_d2lei ;
+ break ;
+
+ default : return SFE_UNIMPLEMENTED ;
+ } ;
+
+ return 0 ;
+} /* pcm_read_init */
+
+
/*-----------------------------------------------------------------------------------------------
- */
+*/
-int pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -114,7 +333,8 @@
return total ;
} /* pcm_read_sc2s */
-int pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -139,7 +359,8 @@
return total ;
} /* pcm_read_uc2s */
-int pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len)
{ int total ;
total = fread (ptr, 1, len * sizeof (short), psf->file) ;
@@ -153,7 +374,8 @@
return total ;
} /* pcm_read_bes2s */
-int pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
{ int total ;
total = fread (ptr, 1, len * sizeof (short), psf->file) ;
@@ -167,7 +389,8 @@
return total ;
} /* pcm_read_les2s */
-int pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -192,7 +415,8 @@
return total ;
} /* pcm_read_bet2s */
-int pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -217,7 +441,8 @@
return total ;
} /* pcm_read_let2s */
-int pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -242,7 +467,8 @@
return total ;
} /* pcm_read_bei2s */
-int pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -267,35 +493,11 @@
return total ;
} /* pcm_read_lei2s */
-int pcm_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
-{ unsigned int readcount, thisread ;
- int bytecount, bufferlen ;
- int index = 0, total = 0 ;
-
- bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
- total += thisread ;
- if (thisread < readcount)
- break ;
- index += thisread / psf->bytewidth ;
- bytecount -= thisread ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_READ ;
-
- return total ;
-} /* pcm_read_f2s */
-
/*-----------------------------------------------------------------------------------------------
- */
+*/
-int pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -320,7 +522,8 @@
return total ;
} /* pcm_read_sc2i */
-int pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -345,7 +548,8 @@
return total ;
} /* pcm_read_uc2i */
-int pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -370,7 +574,8 @@
return total ;
} /* pcm_read_bes2i */
-int pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -395,7 +600,8 @@
return total ;
} /* pcm_read_les2i */
-int pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -420,7 +626,8 @@
return total ;
} /* pcm_read_bet2i */
-int pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -445,7 +652,8 @@
return total ;
} /* pcm_read_let2i */
-int pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len)
{ int total ;
total = fread (ptr, 1, len * sizeof (int), psf->file) ;
@@ -459,7 +667,8 @@
return total ;
} /* pcm_read_bei2i */
-int pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len)
{ int total ;
total = fread (ptr, 1, len * sizeof (int), psf->file) ;
@@ -473,17 +682,24 @@
return total ;
} /* pcm_read_lei2i */
-int pcm_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, int len)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
+ float normfact ;
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+ sc2f_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
total += thisread ;
if (thisread < readcount)
break ;
@@ -496,12 +712,216 @@
psf->error = SFE_SHORT_READ ;
return total ;
-} /* pcm_read_f2i */
+} /* pcm_read_sc2f */
+static int
+pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ uc2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_uc2f */
+
+static int
+pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ bes2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_bes2f */
+
+static int
+pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ les2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_les2f */
+
+static int
+pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x800000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ bet2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_bet2f */
+
+static int
+pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x800000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ let2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_let2f */
+
+static int
+pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ bei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_bei2f */
+
+static int
+pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int readcount, thisread ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ lei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* pcm_read_lei2f */
+
/*-----------------------------------------------------------------------------------------------
- */
+*/
-int pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -529,7 +949,8 @@
return total ;
} /* pcm_read_sc2d */
-int pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -557,7 +978,8 @@
return total ;
} /* pcm_read_uc2d */
-int pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -585,7 +1007,8 @@
return total ;
} /* pcm_read_bes2d */
-int pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -613,7 +1036,8 @@
return total ;
} /* pcm_read_les2d */
-int pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -641,7 +1065,8 @@
return total ;
} /* pcm_read_bet2d */
-int pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -669,7 +1094,8 @@
return total ;
} /* pcm_read_let2d */
-int pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -697,7 +1123,8 @@
return total ;
} /* pcm_read_bei2d */
-int pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int readcount, thisread ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -725,40 +1152,13 @@
return total ;
} /* pcm_read_lei2d */
-int pcm_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{ unsigned int readcount, thisread ;
- int bytecount, bufferlen ;
- int index = 0, total = 0 ;
- double normfact ;
-
- normfact = normalize ? 1.0 : 1.0 ;
-
- bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
- total += thisread ;
- if (thisread < readcount)
- break ;
- index += thisread / psf->bytewidth ;
- bytecount -= thisread ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_READ ;
-
- return total ;
-} /* pcm_read_f2d */
-
/*===============================================================================================
- *-----------------------------------------------------------------------------------------------
- *===============================================================================================
- */
+**-----------------------------------------------------------------------------------------------
+**===============================================================================================
+*/
-int pcm_write_s2sc (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2sc (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -783,7 +1183,8 @@
return total ;
} /* pcm_write_s2sc */
-int pcm_write_s2uc (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2uc (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -808,7 +1209,8 @@
return total ;
} /* pcm_write_s2uc */
-int pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len)
{ int total ;
if (CPU_IS_LITTLE_ENDIAN)
@@ -824,7 +1226,8 @@
return total ;
} /* pcm_write_s2bes */
-int pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len)
{ int total ;
if (CPU_IS_BIG_ENDIAN)
@@ -840,7 +1243,8 @@
return total ;
} /* pcm_write_s2les */
-int pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -865,7 +1269,8 @@
return total ;
} /* pcm_write_s2bet */
-int pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -890,7 +1295,8 @@
return total ;
} /* pcm_write_s2let */
-int pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -915,7 +1321,8 @@
return total ;
} /* pcm_write_s2bei */
-int pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len)
+static int
+pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -940,35 +1347,11 @@
return total ;
} /* pcm_write_s2lei */
-int pcm_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
-{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
- int index = 0, total = 0 ;
-
- bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
- thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
- total += thiswrite ;
- if (thiswrite < writecount)
- break ;
- index += thiswrite / psf->bytewidth ;
- bytecount -= thiswrite ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_WRITE ;
-
- return total ;
-} /* pcm_write_s2f */
-
/*-----------------------------------------------------------------------------------------------
- */
+*/
-int pcm_write_i2sc (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2sc (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -993,7 +1376,8 @@
return total ;
} /* pcm_write_i2sc */
-int pcm_write_i2uc (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2uc (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -1018,7 +1402,8 @@
return total ;
} /* pcm_write_i2uc */
-int pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -1043,7 +1428,8 @@
return total ;
} /* pcm_write_i2bes */
-int pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -1068,7 +1454,8 @@
return total ;
} /* pcm_write_i2les */
-int pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -1093,7 +1480,8 @@
return total ;
} /* pcm_write_i2bet */
-int pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
@@ -1118,7 +1506,8 @@
return total ;
} /* pcm_write_i2les */
-int pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len)
{ int total ;
if (CPU_IS_LITTLE_ENDIAN)
@@ -1134,7 +1523,8 @@
return total ;
} /* pcm_write_i2bei */
-int pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len)
+static int
+pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len)
{ int total ;
if (CPU_IS_BIG_ENDIAN)
@@ -1150,16 +1540,81 @@
return total ;
} /* pcm_write_i2lei */
-int pcm_write_i2f (SF_PRIVATE *psf, int *ptr, int len)
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_write_f2sc (SF_PRIVATE *psf, float *ptr, int len)
{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2sc */
+
+static int
+pcm_write_f2uc (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2uc */
+
+static int
+pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+ f2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1173,24 +1628,51 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_i2f */
+} /* pcm_write_f2bes */
-/*-----------------------------------------------------------------------------------------------
- */
+static int
+pcm_write_f2les (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
-int pcm_write_d2sc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2les */
+
+static int
+pcm_write_f2let (SF_PRIVATE *psf, float *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ float normfact ;
- normfact = (normalize ? ((double) 0x80) : 1.0) ;
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x800000) : 1.0 ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ f2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1204,14 +1686,107 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2sc */
+} /* pcm_write_f2les */
-int pcm_write_d2uc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, int len)
{ unsigned int writecount, thiswrite ;
int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ float normfact ;
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x800000) : 1.0 ;
+
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2bes */
+
+static int
+pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2bei */
+
+static int
+pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, int len)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+
+ bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_WRITE ;
+
+ return total ;
+} /* pcm_write_f2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_write_d2sc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ unsigned int writecount, thiswrite ;
+ int bytecount, bufferlen ;
+ int index = 0, total = 0 ;
+ double normfact ;
+
normfact = (normalize ? ((double) 0x80) : 1.0) ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1218,7 +1793,7 @@
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1232,21 +1807,22 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2uc */
+} /* pcm_write_d2sc */
-int pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2uc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
- normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+ normfact = (normalize ? ((double) 0x80) : 1.0) ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1260,13 +1836,14 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2bes */
+} /* pcm_write_d2uc */
-int pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
normfact = (normalize ? ((double) 0x8000) : 1.0) ;
@@ -1274,7 +1851,7 @@
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1288,21 +1865,22 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2les */
+} /* pcm_write_d2bes */
-int pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
- normfact = (normalize ? ((double) 0x800000) : 1.0) ;
+ normfact = (normalize ? ((double) 0x8000) : 1.0) ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1318,11 +1896,12 @@
return total ;
} /* pcm_write_d2les */
-int pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
normfact = (normalize ? ((double) 0x800000) : 1.0) ;
@@ -1330,7 +1909,7 @@
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1344,21 +1923,22 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2bes */
+} /* pcm_write_d2les */
-int pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
- normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
+ normfact = (normalize ? ((double) 0x800000) : 1.0) ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1372,13 +1952,14 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2bei */
+} /* pcm_write_d2bes */
-int pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
@@ -1386,7 +1967,7 @@
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1400,21 +1981,22 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2lei */
+} /* pcm_write_d2bei */
-int pcm_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
{ unsigned int writecount, thiswrite ;
- int bytecount, bufferlen ;
+ int bytecount, bufferlen ;
int index = 0, total = 0 ;
- double normfact ;
+ double normfact ;
- normfact = (normalize) ? 1.0 : 1.0 ;
+ normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
bytecount = len * psf->bytewidth ;
while (bytecount > 0)
{ writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ d2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
total += thiswrite ;
if (thiswrite < writecount)
@@ -1428,13 +2010,13 @@
psf->error = SFE_SHORT_WRITE ;
return total ;
-} /* pcm_write_d2f */
+} /* pcm_write_d2lei */
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index)
+static void
+sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((short) buffer [k]) ;
@@ -1442,8 +2024,8 @@
} ;
} /* sc2s_array */
-static
-void uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index)
+static void
+uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((((short) buffer [k]) - 128) % 256) ;
@@ -1451,14 +2033,14 @@
} ;
} /* uc2s_array */
-static
-void bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+static void
+bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
+ { value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
value = BE2H_INT (value) ;
ptr [index] = (short) (value >> 16) ;
index ++ ;
@@ -1466,14 +2048,14 @@
} ;
} /* bet2s_array */
-static
-void let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+static void
+let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+ { value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
value = LE2H_INT (value) ;
ptr [index] = (short) (value >> 16) ;
index ++ ;
@@ -1481,8 +2063,8 @@
} ;
} /* let2s_array */
-static
-void bei2s_array (int *buffer, unsigned int count, short *ptr, int index)
+static void
+bei2s_array (int *buffer, unsigned int count, short *ptr, int index)
{ int k ;
int value ;
for (k = 0 ; k < count ; k++)
@@ -1492,8 +2074,8 @@
} ;
} /* bei2s_array */
-static
-void lei2s_array (int *buffer, unsigned int count, short *ptr, int index)
+static void
+lei2s_array (int *buffer, unsigned int count, short *ptr, int index)
{ int k ;
int value ;
for (k = 0 ; k < count ; k++)
@@ -1503,21 +2085,12 @@
} ;
} /* lei2s_array */
-static
-void f2s_array (float *buffer, unsigned int count, short *ptr, int index)
-{ int k ;
- for (k = 0 ; k < count ; k++)
- { ptr [index] = ((double) buffer [k]) ;
- index ++ ;
- } ;
-} /* f2s_array */
-
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index)
+static void
+sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((int) buffer [k]) ;
@@ -1525,8 +2098,8 @@
} ;
} /* sc2i_array */
-static
-void uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index)
+static void
+uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((((int) buffer [k]) - 128) % 256) ;
@@ -1534,8 +2107,8 @@
} ;
} /* uc2i_array */
-static
-void bes2i_array (short *buffer, unsigned int count, int *ptr, int index)
+static void
+bes2i_array (short *buffer, unsigned int count, int *ptr, int index)
{ int k ;
short value ;
for (k = 0 ; k < count ; k++)
@@ -1545,8 +2118,8 @@
} ;
} /* bes2i_array */
-static
-void les2i_array (short *buffer, unsigned int count, int *ptr, int index)
+static void
+les2i_array (short *buffer, unsigned int count, int *ptr, int index)
{ int k ;
short value ;
for (k = 0 ; k < count ; k++)
@@ -1556,14 +2129,14 @@
} ;
} /* les2i_array */
-static
-void bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+static void
+bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
+ { value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
ptr [index] = value / 256 ;
index ++ ;
cptr += 3 ;
@@ -1570,14 +2143,14 @@
} ;
} /* bet2i_array */
-static
-void let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+static void
+let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+ { value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
ptr [index] = value / 256 ;
index ++ ;
cptr += 3 ;
@@ -1584,21 +2157,106 @@
} ;
} /* let2i_array */
-static
-void f2i_array (float *buffer, unsigned int count, int *ptr, int index)
+/*-----------------------------------------------------------------------------------------------
+*/
+
+
+static void
+sc2f_array (signed char *buffer, unsigned int count, float *ptr, int index, float normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { ptr [index] = (int) ((double) buffer [k]) ;
+ { ptr [index] = ((float) buffer [k]) * normfact ;
index ++ ;
} ;
-} /* f2i_array */
+} /* sc2f_array */
+static void
+uc2f_array (unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
+ index ++ ;
+ } ;
+} /* uc2f_array */
+static void
+bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ int k ;
+ short value ;
+ for (k = 0 ; k < count ; k++)
+ { value = BE2H_SHORT (buffer [k]) ;
+ ptr [index] = ((float) value) * normfact ;
+ index ++ ;
+ } ;
+} /* bes2f_array */
+
+static void
+les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ int k ;
+ short value ;
+ for (k = 0 ; k < count ; k++)
+ { value = LE2H_SHORT (buffer [k]) ;
+ ptr [index] = ((float) value) * normfact ;
+ index ++ ;
+ } ;
+} /* les2f_array */
+
+static void
+bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ unsigned char *cptr ;
+ int k ;
+ int value;
+ cptr = (unsigned char*) buffer ;
+ for (k = 0 ; k < count ; k++)
+ { value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+ ptr [index] = ((float) (value / 256)) * normfact ;
+ index ++ ;
+ cptr += 3 ;
+ } ;
+} /* bet2f_array */
+
+static void
+let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ unsigned char *cptr ;
+ int k ;
+ int value;
+ cptr = (unsigned char*) buffer ;
+ for (k = 0 ; k < count ; k++)
+ { value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+ ptr [index] = ((float) (value / 256)) * normfact ;
+ index ++ ;
+ cptr += 3 ;
+ } ;
+} /* let2f_array */
+
+static void
+lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ int k ;
+ int value ;
+ for (k = 0 ; k < count ; k++)
+ { value = LE2H_INT (buffer [k]) ;
+ ptr [index] = ((float) value) * normfact ;
+ index ++ ;
+ } ;
+} /* lei2f_array */
+
+static void
+bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
+{ int k ;
+ int value ;
+ for (k = 0 ; k < count ; k++)
+ { value = BE2H_INT (buffer [k]) ;
+ ptr [index] = ((float) value) * normfact ;
+ index ++ ;
+ } ;
+} /* bei2f_array */
+
+
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((double) buffer [k]) * normfact ;
@@ -1606,8 +2264,8 @@
} ;
} /* sc2d_array */
-static
-void uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
{ ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
@@ -1615,8 +2273,8 @@
} ;
} /* uc2d_array */
-static
-void bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
short value ;
for (k = 0 ; k < count ; k++)
@@ -1626,8 +2284,8 @@
} ;
} /* bes2d_array */
-static
-void les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
short value ;
for (k = 0 ; k < count ; k++)
@@ -1637,14 +2295,14 @@
} ;
} /* les2d_array */
-static
-void bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
+ { value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
ptr [index] = ((double) (value / 256)) * normfact ;
index ++ ;
cptr += 3 ;
@@ -1651,14 +2309,14 @@
} ;
} /* bet2d_array */
-static
-void let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
{ unsigned char *cptr ;
int k ;
int value;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+ { value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
ptr [index] = ((double) (value / 256)) * normfact ;
index ++ ;
cptr += 3 ;
@@ -1665,8 +2323,8 @@
} ;
} /* let2d_array */
-static
-void bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
int value ;
for (k = 0 ; k < count ; k++)
@@ -1676,8 +2334,8 @@
} ;
} /* bei2d_array */
-static
-void lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
+static void
+lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
{ int k ;
int value ;
for (k = 0 ; k < count ; k++)
@@ -1687,21 +2345,11 @@
} ;
} /* lei2d_array */
-static
-void f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact)
-{ int k ;
- for (k = 0 ; k < count ; k++)
- { ptr [index] = ((double) buffer [k]) * normfact ;
- index ++ ;
- } ;
-} /* f2d_array */
-
-
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count)
+static void
+s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = (signed char) (ptr [index]) ;
@@ -1709,8 +2357,8 @@
} ;
} /* s2sc_array */
-static
-void s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count)
+static void
+s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = (unsigned char) (ptr [index] + 128) ;
@@ -1718,8 +2366,8 @@
} ;
} /* s2uc_array */
-static
-void s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+static void
+s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
@@ -1733,8 +2381,8 @@
} ;
} /* s2bet_array */
-static
-void s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+static void
+s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
@@ -1748,8 +2396,8 @@
} ;
} /* s2let_array */
-static
-void s2bei_array (short *ptr, int index, int *buffer, unsigned int count)
+static void
+s2bei_array (short *ptr, int index, int *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = H2BE_INT (ptr [index] << 16) ;
@@ -1757,8 +2405,8 @@
} ;
} /* s2lei_array */
-static
-void s2lei_array (short *ptr, int index, int *buffer, unsigned int count)
+static void
+s2lei_array (short *ptr, int index, int *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = H2LE_INT (ptr [index] << 16) ;
@@ -1766,21 +2414,11 @@
} ;
} /* s2lei_array */
-static
-void s2f_array (short *ptr, int index, float *buffer, unsigned int count)
-{ int k ;
- for (k = 0 ; k < count ; k++)
- { buffer [k] = (float) (ptr [index]) ;
- index ++ ;
- } ;
-} /* s2f_array */
-
-
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count)
+static void
+i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = (signed char) (ptr [index]) ;
@@ -1788,8 +2426,8 @@
} ;
} /* i2sc_array */
-static
-void i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count)
+static void
+i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = (unsigned char) (ptr [index] + 128) ;
@@ -1797,8 +2435,8 @@
} ;
} /* i2uc_array */
-static
-void i2bes_array (int *ptr, int index, short *buffer, unsigned int count)
+static void
+i2bes_array (int *ptr, int index, short *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = H2BE_SHORT (ptr [index]) ;
@@ -1806,8 +2444,8 @@
} ;
} /* i2bes_array */
-static
-void i2les_array (int *ptr, int index, short *buffer, unsigned int count)
+static void
+i2les_array (int *ptr, int index, short *buffer, unsigned int count)
{ int k ;
for (k = 0 ; k < count ; k++)
{ buffer [k] = H2LE_SHORT (ptr [index]) ;
@@ -1815,8 +2453,8 @@
} ;
} /* i2les_array */
-static
-void i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+static void
+i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
@@ -1830,8 +2468,8 @@
} ;
} /* i2bet_array */
-static
-void i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+static void
+i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
@@ -1845,62 +2483,139 @@
} ;
} /* i2let_array */
-static
-void i2f_array (int *ptr, int index, float *buffer, unsigned int count)
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static void
+f2sc_array (float *ptr, int index, signed char *buffer, unsigned int count, float normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = (float) (ptr [index]) ;
+ { buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) ;
index ++ ;
} ;
-} /* i2f_array */
+} /* f2sc_array */
+static void
+f2uc_array (float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) + 128 ;
+ index ++ ;
+ } ;
+} /* f2uc_array */
+static void
+f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = H2BE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
+ index ++ ;
+ } ;
+} /* f2bes_array */
+
+static void
+f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = H2LE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
+ index ++ ;
+ } ;
+} /* f2les_array */
+
+static void
+f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+{ unsigned char *cptr ;
+ int k, value ;
+ cptr = (unsigned char*) buffer ;
+ for (k = 0 ; k < count ; k++)
+ { value = FLOAT_TO_INT (ptr [index] * normfact) ;
+ cptr [2] = (unsigned char) (value & 0xFF) ;
+ cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+ cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
+ index ++ ;
+ cptr += 3 ;
+ } ;
+} /* f2bet_array */
+
+static void
+f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+{ unsigned char *cptr ;
+ int k, value ;
+ cptr = (unsigned char*) buffer ;
+ for (k = 0 ; k < count ; k++)
+ { value = FLOAT_TO_INT (ptr [index] * normfact) ;
+ cptr [0] = (unsigned char) (value & 0xFF) ;
+ cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+ cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
+ index ++ ;
+ cptr += 3 ;
+ } ;
+} /* f2let_array */
+
+static void
+f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = H2BE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
+ index ++ ;
+ } ;
+} /* f2bei_array */
+
+static
+void f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { buffer [k] = H2LE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
+ index ++ ;
+ } ;
+} /* f2lei_array */
+
/*-----------------------------------------------------------------------------------------------
- */
+*/
-static
-void d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact)
+static void
+d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = (signed char) (ptr [index] * normfact) ;
+ { buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) ;
index ++ ;
} ;
} /* d2sc_array */
-static
-void d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact)
+static void
+d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = (unsigned char) ((ptr [index] * normfact) + 128) ;
+ { buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) + 128 ;
index ++ ;
} ;
} /* d2uc_array */
-static
-void d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
+static void
+d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = H2BE_SHORT ((int) (ptr [index] * normfact)) ;
+ { buffer [k] = H2BE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
index ++ ;
} ;
} /* d2bes_array */
-static
-void d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
+static void
+d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = H2LE_SHORT ((int) (ptr [index] * normfact)) ;
+ { buffer [k] = H2LE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
index ++ ;
} ;
} /* d2les_array */
-static
-void d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+static void
+d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (int) (ptr [index] * normfact) ;
+ { value = DOUBLE_TO_INT (ptr [index] * normfact) ;
cptr [2] = (unsigned char) (value & 0xFF) ;
cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
@@ -1909,13 +2624,13 @@
} ;
} /* d2bet_array */
-static
-void d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+static void
+d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
{ unsigned char *cptr ;
int k, value ;
cptr = (unsigned char*) buffer ;
for (k = 0 ; k < count ; k++)
- { value = (int) (ptr [index] * normfact) ;
+ { value = DOUBLE_TO_INT (ptr [index] * normfact) ;
cptr [0] = (unsigned char) (value & 0xFF) ;
cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
@@ -1924,11 +2639,11 @@
} ;
} /* d2let_array */
-static
-void d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
+static void
+d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = H2BE_INT ((int) (ptr [index] * normfact)) ;
+ { buffer [k] = H2BE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
index ++ ;
} ;
} /* d2bei_array */
@@ -1937,19 +2652,8 @@
void d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
- { buffer [k] = H2LE_INT ((int) (ptr [index] * normfact)) ;
+ { buffer [k] = H2LE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
index ++ ;
} ;
} /* d2lei_array */
-
-static
-void d2f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact)
-{ int k ;
- for (k = 0 ; k < count ; k++)
- { buffer [k] = (float) (ptr [index] * normfact) ;
- index ++ ;
- } ;
-} /* d2f_array */
-
-
--- a/common/libsndfile/src/pcm.h
+++ /dev/null
@@ -1,81 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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.
-*/
-
-
-int pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_read_f2s (SF_PRIVATE *psf, short *ptr, int len) ;
-
-int pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_read_f2i (SF_PRIVATE *psf, int *ptr, int len) ;
-
-int pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-
-
-int pcm_write_s2sc (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2uc (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len) ;
-int pcm_write_s2f (SF_PRIVATE *psf, short *ptr, int len) ;
-
-int pcm_write_i2sc (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2uc (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len) ;
-int pcm_write_i2f (SF_PRIVATE *psf, int *ptr, int len) ;
-
-int pcm_write_d2sc (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2uc (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-int pcm_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
--- a/common/libsndfile/src/raw.c
+++ b/common/libsndfile/src/raw.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -27,11 +27,8 @@
#include "config.h"
#include "sfendian.h"
#include "common.h"
-#include "pcm.h"
-/*------------------------------------------------------------------------------
-** Private static functions.
-*/
+static long raw_seek (SF_PRIVATE *psf, long offset, int whence) ;
/*------------------------------------------------------------------------------
** Public functions.
@@ -39,82 +36,38 @@
int raw_open_read (SF_PRIVATE *psf)
{ unsigned int subformat ;
-
+ int error ;
+
if(! psf->sf.channels || ! psf->sf.pcmbitwidth)
return SFE_RAW_READ_BAD_SPEC ;
subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+ psf->endian = 0 ;
+
if (subformat == SF_FORMAT_PCM_BE)
psf->endian = SF_ENDIAN_BIG ;
else if (subformat == SF_FORMAT_PCM_LE)
psf->endian = SF_ENDIAN_LITTLE ;
- else if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_U8)
- psf->endian = 0 ;
+ else if (subformat == SF_FORMAT_PCM_S8)
+ psf->chars = SF_CHARS_SIGNED ;
+ else if (subformat == SF_FORMAT_PCM_U8)
+ psf->chars = SF_CHARS_UNSIGNED ;
else
return SFE_RAW_READ_BAD_SPEC ;
+ psf->seek_func = (func_seek) raw_seek ;
+
psf->sf.seekable = SF_TRUE ;
-
psf->sf.sections = 1 ;
- switch (psf->sf.pcmbitwidth)
- { case 8 : if (subformat == SF_FORMAT_PCM_S8)
- { psf->read_short = (func_short) pcm_read_sc2s ;
- psf->read_int = (func_int) pcm_read_sc2i ;
- psf->read_double = (func_double) pcm_read_sc2d ;
- }
- else if (subformat == SF_FORMAT_PCM_U8)
- { psf->read_short = (func_short) pcm_read_uc2s ;
- psf->read_int = (func_int) pcm_read_uc2i ;
- psf->read_double = (func_double) pcm_read_uc2d ;
- }
- break ;
-
- case 16 : if (subformat == SF_FORMAT_PCM_BE)
- { psf->read_short = (func_short) pcm_read_bes2s ;
- psf->read_int = (func_int) pcm_read_bes2i ;
- psf->read_double = (func_double) pcm_read_bes2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_les2s ;
- psf->read_int = (func_int) pcm_read_les2i ;
- psf->read_double = (func_double) pcm_read_les2d ;
- } ;
- break ;
-
- case 24 : if (subformat == SF_FORMAT_PCM_BE)
- { psf->read_short = (func_short) pcm_read_bet2s ;
- psf->read_int = (func_int) pcm_read_bet2i ;
- psf->read_double = (func_double) pcm_read_bet2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_let2s ;
- psf->read_int = (func_int) pcm_read_let2i ;
- psf->read_double = (func_double) pcm_read_let2d ;
- } ;
- break ;
-
- case 32 : if (subformat == SF_FORMAT_PCM_BE)
- { psf->read_short = (func_short) pcm_read_bei2s ;
- psf->read_int = (func_int) pcm_read_bei2i ;
- psf->read_double = (func_double) pcm_read_bei2d ;
- }
- else
- { psf->read_short = (func_short) pcm_read_lei2s ;
- psf->read_int = (func_int) pcm_read_lei2i ;
- psf->read_double = (func_double) pcm_read_lei2d ;
- } ;
- break ;
-
- default : return SFE_RAW_BAD_BITWIDTH ;
- break ;
- } ;
-
psf->dataoffset = 0 ;
psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
+
if (psf->blockwidth)
psf->sf.samples = psf->filelength / psf->blockwidth ;
@@ -130,7 +83,8 @@
int raw_open_write (SF_PRIVATE *psf)
{ unsigned int subformat, big_endian_file ;
-
+ int error ;
+
subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
if (subformat == SF_FORMAT_PCM_BE)
@@ -152,57 +106,13 @@
psf->filelength = psf->datalength ;
psf->error = 0 ;
- switch (psf->sf.pcmbitwidth)
- { case 8 : if (subformat == SF_FORMAT_PCM_S8)
- { psf->write_short = (func_short) pcm_write_s2sc ;
- psf->write_int = (func_int) pcm_write_i2sc ;
- psf->write_double = (func_double) pcm_write_d2sc ;
- }
- else if (subformat == SF_FORMAT_PCM_U8)
- { psf->write_short = (func_short) pcm_write_s2uc ;
- psf->write_int = (func_int) pcm_write_i2uc ;
- psf->write_double = (func_double) pcm_write_d2uc ;
- }
- break ;
+ if (subformat == SF_FORMAT_PCM_S8)
+ psf->chars = SF_CHARS_SIGNED ;
+ else if (subformat == SF_FORMAT_PCM_U8)
+ psf->chars = SF_CHARS_UNSIGNED ;
- case 16 : if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bes ;
- psf->write_int = (func_int) pcm_write_i2bes ;
- psf->write_double = (func_double) pcm_write_d2bes ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2les ;
- psf->write_int = (func_int) pcm_write_i2les ;
- psf->write_double = (func_double) pcm_write_d2les ;
- } ;
- break ;
-
- case 24 : if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bet ;
- psf->write_int = (func_int) pcm_write_i2bet ;
- psf->write_double = (func_double) pcm_write_d2bet ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2let ;
- psf->write_int = (func_int) pcm_write_i2let ;
- psf->write_double = (func_double) pcm_write_d2let ;
- } ;
- break ;
-
- case 32 : if (big_endian_file)
- { psf->write_short = (func_short) pcm_write_s2bei ;
- psf->write_int = (func_int) pcm_write_i2bei ;
- psf->write_double = (func_double) pcm_write_d2bei ;
- }
- else
- { psf->write_short = (func_short) pcm_write_s2lei ;
- psf->write_int = (func_int) pcm_write_i2lei ;
- psf->write_double = (func_double) pcm_write_d2lei ;
- } ;
- break ;
-
- default : return SFE_BAD_OPEN_FORMAT ;
- } ;
+ if ((error = pcm_write_init (psf)))
+ return error ;
return 0 ;
} /* raw_open_write */
@@ -210,7 +120,57 @@
/*------------------------------------------------------------------------------
*/
+static long
+raw_seek (SF_PRIVATE *psf, long offset, int whence)
+{ long position ;
-/*==============================================================================
-*/
+ if (! (psf->blockwidth && psf->datalength))
+ { psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+
+ position = ftell (psf->file) ;
+ offset = offset * psf->blockwidth ;
+
+ switch (whence)
+ { case SEEK_SET :
+ if (offset < 0 || offset > psf->datalength)
+ { psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+ break ;
+
+ case SEEK_CUR :
+ if (psf->current + offset < 0 || psf->current + offset > psf->datalength)
+ { psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+ offset = position + offset ;
+ break ;
+
+ case SEEK_END :
+ if (offset > 0 || psf->datalength + offset < 0)
+ { psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+ offset = psf->datalength + offset ;
+ break ;
+
+ default :
+ psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+
+ if (psf->mode == SF_MODE_READ)
+ fseek (psf->file, offset, SEEK_SET) ;
+ else
+ { /* What to do about write??? */
+ psf->error = SFE_BAD_SEEK ;
+ return ((long) -1) ;
+ } ;
+
+ psf->current = offset / psf->blockwidth ;
+
+ return psf->current ;
+} /* raw_seek */
--- /dev/null
+++ b/common/libsndfile/src/samplitude.c
@@ -1,0 +1,125 @@
+/*
+** Copyright (C) 2000-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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 <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "sfendian.h"
+#include "common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+# error "Cannot determine endian-ness of processor."
+#endif
+
+#define SEKD_MARKER (MAKE_MARKER ('S', 'E', 'K', 'D'))
+#define SAMR_MARKER (MAKE_MARKER ('S', 'A', 'M', 'R'))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+typedef struct
+{ unsigned int sekd, samr ;
+ int unknown0 ;
+ int bitspersample ;
+ int unknown1, unknown2 ;
+ int poss_len ;
+ int samplerate ;
+ int channels ;
+} RAP_CHUNK ;
+
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static int smpltd_close (SF_PRIVATE *psf) ;
+
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int smpltd_open_read (SF_PRIVATE *psf)
+{ RAP_CHUNK rap ;
+
+ psf_binheader_readf (psf, "mm", &(rap.sekd), &(rap.samr)) ;
+ if (rap.sekd != SEKD_MARKER)
+ return SFE_SMTD_NO_SEKD ;
+ if (rap.samr != SAMR_MARKER)
+ return SFE_SMTD_NO_SAMR ;
+
+/*-
+ printf ("Here we are!\n") ;
+
+ printf ("unknown0 : %d\n", rap.unknown0) ;
+ printf ("bits per sample : %d\n", rap.bitspersample) ;
+ printf ("unknown1 : %d\n", rap.unknown1) ;
+ printf ("unknown2 : %d\n", rap.unknown2) ;
+ printf ("poss_len : %d\n", rap.poss_len) ;
+ printf ("sample rate : %d\n", rap.samplerate) ;
+ printf ("channels : %d\n", rap.channels) ;
+
+-*/
+ psf->close = (func_close) smpltd_close ;
+
+ return 0 ;
+} /* smpltd_open_read */
+
+int
+smpltd_open_write (SF_PRIVATE *psf)
+{
+
+ return 0 ;
+} /* smpltd_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+smpltd_close (SF_PRIVATE *psf)
+{
+ if (psf->mode == SF_MODE_WRITE)
+ { /* Now we know for certain the length of the file we can re-write
+ ** correct values for the FORM, 8SVX and BODY chunks.
+ */
+
+ } ;
+
+ if (psf->fdata)
+ free (psf->fdata) ;
+ psf->fdata = NULL ;
+
+ return 0 ;
+} /* smpltd_close */
+
--- a/common/libsndfile/src/sfendian.h
+++ b/common/libsndfile/src/sfendian.h
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -74,5 +74,13 @@
#else
#error "Cannot determine endian-ness of processor."
+#endif
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+# error "Cannot determine endian-ness of processor."
#endif
--- a/common/libsndfile/src/sndfile.c
+++ b/common/libsndfile/src/sndfile.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -21,6 +21,7 @@
#include <fcntl.h>
#include <string.h>
#include <ctype.h>
+#include <math.h>
/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
@@ -35,14 +36,6 @@
#include "sfendian.h"
#include "common.h"
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-# error "Cannot determine endian-ness of processor."
-#endif
-
#define SNDFILE_MAGICK 0x1234C0DE
typedef struct
@@ -76,6 +69,7 @@
{ SFE_SHORT_READ , "Short read error." },
{ SFE_SHORT_WRITE , "Short write error." },
{ SFE_INTERNAL , "Unspecified internal error." },
+ { SFE_BAD_CONTROL_CMD , "Bad command passed to function sf_command()." },
{ SFE_WAV_NO_RIFF , "Error in WAV file. No 'RIFF' chunk marker." },
{ SFE_WAV_NO_WAVE , "Error in WAV file. No 'WAVE' chunk marker." },
@@ -83,6 +77,9 @@
{ SFE_WAV_FMT_SHORT , "Error in WAV file. Short 'fmt ' chunk." },
{ SFE_WAV_FMT_TOO_BIG , "Error in WAV file. 'fmt ' chunk too large." },
+ { SFE_WAV_BAD_FACT , "Error in WAV file. 'fact' chunk out of place." },
+ { SFE_WAV_BAD_PEAK , "Error in WAV file. Bad 'PEAK' chunk." },
+ { SFE_WAV_PEAK_B4_FMT , "Error in WAV file. 'PEAK' chunk found before 'fmt ' chunk." },
{ SFE_WAV_BAD_FORMAT , "Error in WAV file. Errors in 'fmt ' chunk." },
{ SFE_WAV_BAD_BLOCKALIGN , "Error in WAV file. Block alignment in 'fmt ' chunk is incorrect." },
@@ -89,50 +86,78 @@
{ SFE_WAV_NO_DATA , "Error in WAV file. No 'data' chunk marker." },
{ SFE_WAV_UNKNOWN_CHUNK , "Error in WAV file. File contains an unknown chunk marker." },
- { 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_GSM610_FORMAT , "Error in GSM610 WAV file. Invalid format chunk."},
+ { 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_GSM610_FORMAT , "Error in GSM610 WAV file. Invalid format chunk." },
- { SFE_AIFF_NO_FORM , "Error in AIFF file, bad 'FORM' marker."},
- { SFE_AIFF_UNKNOWN_CHUNK , "Error in AIFF file, unknown chunk."},
- { SFE_COMM_CHUNK_SIZE , "Error in AIFF file, bad 'COMM' chunk size."},
- { SFE_AIFF_NO_SSND , "Error in AIFF file, bad 'SSND' chunk."},
- { SFE_AIFF_NO_DATA , "Error in AIFF file, no sound data."},
+ { SFE_AIFF_NO_FORM , "Error in AIFF file, bad 'FORM' marker." },
+ { SFE_AIFF_AIFF_NO_FORM , "Error in AIFF file, 'AIFF' marker without 'FORM'." },
+ { SFE_AIFF_COMM_NO_FORM , "Error in AIFF file, 'COMM' marker without 'FORM'." },
+ { SFE_AIFF_SSND_NO_COMM , "Error in AIFF file, 'SSND' marker without 'COMM'." },
+ { SFE_AIFF_UNKNOWN_CHUNK , "Error in AIFF file, unknown chunk." },
+ { SFE_AIFF_COMM_CHUNK_SIZE, "Error in AIFF file, bad 'COMM' chunk size." },
+ { SFE_AIFF_BAD_COMM_CHUNK , "Error in AIFF file, bad 'COMM' chunk." },
+ { SFE_AIFF_PEAK_B4_COMM , "Error in AIFF file. 'PEAK' chunk found before 'COMM' chunk." },
+ { SFE_AIFF_BAD_PEAK , "Error in AIFF file. Bad 'PEAK' chunk." },
+ { SFE_AIFF_NO_SSND , "Error in AIFF file, bad 'SSND' chunk." },
+ { SFE_AIFF_NO_DATA , "Error in AIFF file, no sound data." },
- { SFE_AU_UNKNOWN_FORMAT , "Error in AU file, unknown format."},
- { SFE_AU_NO_DOTSND , "Error in AU file, missing '.snd' or 'dns.' marker."},
+ { SFE_AU_UNKNOWN_FORMAT , "Error in AU file, unknown format." },
+ { SFE_AU_NO_DOTSND , "Error in AU file, missing '.snd' or 'dns.' marker." },
- { SFE_RAW_READ_BAD_SPEC , "Error while opening RAW file for read. Must specify format, pcmbitwidth and channels."},
- { SFE_RAW_BAD_BITWIDTH , "Error. RAW file bitwidth must be a multiple of 8."},
+ { SFE_RAW_READ_BAD_SPEC , "Error while opening RAW file for read. Must specify format, pcmbitwidth and channels." },
+ { SFE_RAW_BAD_BITWIDTH , "Error. RAW file bitwidth must be a multiple of 8." },
- { SFE_PAF_NO_MARKER , "Error in PAF file, no marker."},
- { SFE_PAF_VERSION , "Error in PAF file, bad version."},
- { SFE_PAF_UNKNOWN_FORMAT , "Error in PAF file, unknown format."},
- { SFE_PAF_SHORT_HEADER , "Error in PAF file. File shorter than minimal header."},
+ { SFE_PAF_NO_MARKER , "Error in PAF file, no marker." },
+ { SFE_PAF_VERSION , "Error in PAF file, bad version." },
+ { SFE_PAF_UNKNOWN_FORMAT , "Error in PAF file, unknown format." },
+ { SFE_PAF_SHORT_HEADER , "Error in PAF file. File shorter than minimal header." },
- { SFE_SVX_NO_FORM , "Error in 8SVX / 16SV file, no 'FORM' marker."},
- { SFE_SVX_NO_BODY , "Error in 8SVX / 16SV file, no 'BODY' marker."},
- { SFE_SVX_NO_DATA , "Error in 8SVX / 16SV file, no sound data."},
- { SFE_SVX_BAD_COMP , "Error in 8SVX / 16SV file, unsupported compression format."},
+ { SFE_SVX_NO_FORM , "Error in 8SVX / 16SV file, no 'FORM' marker." },
+ { SFE_SVX_NO_BODY , "Error in 8SVX / 16SV file, no 'BODY' marker." },
+ { SFE_SVX_NO_DATA , "Error in 8SVX / 16SV file, no sound data." },
+ { SFE_SVX_BAD_COMP , "Error in 8SVX / 16SV file, unsupported compression format." },
- { SFE_NIST_BAD_HEADER , "Error in NIST file, bad header."},
- { SFE_NIST_BAD_ENCODING , "Error in NIST file, unsupported compression format."},
+ { SFE_NIST_BAD_HEADER , "Error in NIST file, bad header." },
+ { SFE_NIST_BAD_ENCODING , "Error in NIST file, unsupported compression format." },
+ { SFE_SMTD_NO_SEKD , "Error in Samplitude file, no 'SEKD' marker." },
+ { SFE_SMTD_NO_SAMR , "Error in Samplitude file, no 'SAMR' marker." },
+
+ { SFE_VOC_NO_CREATIVE , "Error in VOC file, no 'Creative Voice File' marker." },
+ { SFE_VOC_BAD_VERSION , "Error in VOC file, bad version number." },
+ { SFE_VOC_BAD_MARKER , "Error in VOC file, bad marker in file." },
+
+ { SFE_IRCAM_NO_MARKER , "Error in IRCAM file, bad IRCAM marker." },
+ { SFE_IRCAM_BAD_CHANNELS , "Error in IRCAM file, bad channel count." },
+ { SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknow encoding format." },
+
{ SFE_MAX_ERROR , "Maximum error number." }
} ;
/*------------------------------------------------------------------------------
+*/
+
+static int does_extension_match (const char *ext, const char *test) ;
+static int is_au_snd_file (const char *filename) ;
+static int guess_file_type (SF_PRIVATE *psf, const char *filename) ;
+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 hash_command (const char *cmd) ;
+
+/*------------------------------------------------------------------------------
** Private (static) variables.
*/
static int sf_errno = 0 ;
-static char sf_strbuffer [SF_BUFFER_LEN] = { 0 } ;
+static char sf_logbuffer [SF_BUFFER_LEN] = { 0 } ;
/*------------------------------------------------------------------------------
-** Private static functions.
*/
-
#define VALIDATE_SNDFILE_AND_ASSIGN_PSF(a,b) \
{ if (! (a)) \
return SFE_BAD_SNDFILE_PTR ; \
@@ -139,154 +164,27 @@
(b) = (SF_PRIVATE*) (a) ; \
if (!((b)->file)) \
return SFE_BAD_INT_FD ; \
- if ((b)->Magick != SNDFILE_MAGICK) \
+ if ((b)->Magick != SNDFILE_MAGICK) \
return SFE_BAD_SNDFILE_PTR ; \
(b)->error = 0 ; \
}
-static
-int does_extension_match (const char *ext, const char *test)
-{ char c1, c2 ;
-
- if ((! ext) || (! test))
- return 0 ;
-
- if (strlen (ext) != strlen (test))
- return 0 ;
-
- while (*ext && *test)
- { c1 = tolower (*ext) ;
- c2 = tolower (*test) ;
- if (c1 > c2)
- return 0 ;
- if (c1 < c2)
- return 0 ;
- ext ++ ;
- test ++ ;
- }
-
- return 1 ;
-} /* does_extension_match */
-
-static
-int is_au_snd_file (const char *filename)
-{ const char *cptr ;
-
- if (! (cptr = strrchr (filename, '.')))
- return 0 ;
- cptr ++ ;
-
- if (does_extension_match (cptr, "au"))
- return 1 ;
-
- if (does_extension_match (cptr, "snd"))
- return 1 ;
-
- return 0 ;
-} /* is_au_snd_file */
-
-static
-int guess_file_type (FILE *file, const char *filename)
-{ unsigned int buffer [3] ;
-
- fread (buffer, sizeof(buffer), 1, file) ;
- fseek (file, 0, SEEK_SET) ;
-
- if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E'))
- return SF_FORMAT_WAV ;
-
- if (buffer [0] == MAKE_MARKER ('F','O','R','M'))
- { if (buffer [2] == MAKE_MARKER ('A','I','F','F') || buffer [2] == MAKE_MARKER ('A','I','F','C'))
- return SF_FORMAT_AIFF ;
- if (buffer [2] == MAKE_MARKER ('8','S','V','X') || buffer [2] == MAKE_MARKER ('1','6','S','V'))
- return SF_FORMAT_SVX ;
- return 0 ;
- } ;
-
- if ((buffer [0] == MAKE_MARKER ('.','s','n','d') || buffer [0] == MAKE_MARKER ('d','n','s','.')))
- return SF_FORMAT_AU ;
-
- if ((buffer [0] == MAKE_MARKER ('f','a','p',' ') || buffer [0] == MAKE_MARKER (' ','p','a','f')))
- return SF_FORMAT_PAF ;
-
- if (buffer [0] == MAKE_MARKER ('N','I','S','T'))
- return SF_FORMAT_NIST ;
-
- if (filename && is_au_snd_file (filename))
- return SF_FORMAT_AU | SF_FORMAT_ULAW ;
-
- /* Default to header-less RAW PCM file type. */
- return SF_FORMAT_RAW ;
-} /* guess_file_type */
-
-
-static
-int validate_sfinfo (SF_INFO *sfinfo)
-{ if (! sfinfo->samplerate)
- return 0 ;
- if (! sfinfo->samples)
- return 0 ;
- if (! sfinfo->channels)
- return 0 ;
- if (! sfinfo->pcmbitwidth)
- return 0 ;
- if (! sfinfo->format & SF_FORMAT_TYPEMASK)
- return 0 ;
- if (! sfinfo->format & SF_FORMAT_SUBMASK)
- return 0 ;
- if (! sfinfo->sections)
- return 0 ;
- return 1 ;
-} /* validate_sfinfo */
-
-static
-int validate_psf (SF_PRIVATE *psf)
-{ if (! psf->blockwidth)
- return 0 ;
- if (! psf->bytewidth)
- return 0 ;
- if (! psf->datalength)
- return 0 ;
- if (psf->blockwidth != psf->sf.channels * psf->bytewidth)
- return 0 ;
- return 1 ;
-} /* validate_psf */
-
-static
-void save_header_info (SF_PRIVATE *psf)
-{ memset (sf_strbuffer, 0, sizeof (sf_strbuffer)) ;
- strcpy (sf_strbuffer, psf->strbuffer) ;
-} /* validate_psf */
-
-static
-void copy_filename (SF_PRIVATE *psf, const char *path)
-{ const char *cptr ;
-
- if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\')))
- cptr ++ ;
- else
- cptr = path ;
-
- memset (psf->filename, 0, SF_FILENAME_LEN) ;
- strncpy (psf->filename, cptr, SF_FILENAME_LEN - 1) ;
- psf->filename [SF_FILENAME_LEN - 1] = 0 ;
-} /* copy_filename */
-
/*------------------------------------------------------------------------------
** Public functions.
*/
-SNDFILE* sf_open_read (const char *path, SF_INFO *sfinfo)
+SNDFILE*
+sf_open_read (const char *path, SF_INFO *sfinfo)
{ SF_PRIVATE *psf ;
- int filetype, seekable ;
+ int filetype ;
if (! sfinfo)
{ sf_errno = SFE_BAD_SF_INFO_PTR ;
return NULL ;
} ;
-
+
sf_errno = 0 ;
- sf_strbuffer [0] = 0 ;
+ sf_logbuffer [0] = 0 ;
psf = malloc (sizeof (SF_PRIVATE)) ;
if (! psf)
@@ -299,12 +197,15 @@
if (! strcmp (path, "-"))
{ psf->file = stdin ;
- seekable = SF_FALSE ;
+ psf->sf.seekable = SF_FALSE ;
}
else
{ /* fopen with 'b' means binary file mode for Win32 systems. */
- psf->file = fopen (path, "rb") ;
- seekable = SF_TRUE ;
+ if (! (psf->file = fopen (path, "rb")))
+ { sf_errno = SFE_OPEN_FAILED ;
+ return NULL ;
+ } ;
+ psf->sf.seekable = SF_TRUE ;
} ;
if (! psf->file)
@@ -315,20 +216,25 @@
psf->mode = SF_MODE_READ ;
- psf_sprintf (psf, "%s\n", path) ;
- if (seekable)
+ psf_log_printf (psf, "%s\n", path) ;
+ if (psf->sf.seekable)
{ fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
fseek (psf->file, 0, SEEK_SET) ;
- psf_sprintf (psf, "size : %d\n", psf->filelength) ;
+ psf_log_printf (psf, "size : %d\n", psf->filelength) ;
}
else
- psf->filelength = 2048 ;
+ psf->filelength = 0x7FFF0000 ; /* Stupidly big number. */
copy_filename (psf, path) ;
- filetype = guess_file_type (psf->file, psf->filename) ;
- fseek (psf->file, 0, SEEK_SET) ;
+ if ((sfinfo->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW && sfinfo->channels && sfinfo->pcmbitwidth)
+ filetype = SF_FORMAT_RAW ;
+ else
+ { memset (sfinfo, 0, sizeof (SF_INFO)) ;
+ filetype = guess_file_type (psf, psf->filename) ;
+ } ;
+
switch (filetype)
{ case SF_FORMAT_WAV :
sf_errno = wav_open_read (psf) ;
@@ -342,11 +248,6 @@
sf_errno = au_open_read (psf) ;
break ;
- case SF_FORMAT_AU | SF_FORMAT_ULAW :
- psf_sprintf (psf, "Headers-less u-law encoded file.\n") ;
- sf_errno = au_nh_open_read (psf) ;
- break ;
-
case SF_FORMAT_RAW :
/* For RAW files, need the sfinfo struct data to
** figure out the bitwidth, endian-ness etc.
@@ -363,12 +264,28 @@
sf_errno = svx_open_read (psf) ;
break ;
+ case SF_FORMAT_NIST :
+ sf_errno = nist_open_read (psf) ;
+ break ;
+
+ case SF_FORMAT_SMPLTD :
+ sf_errno = smpltd_open_read (psf) ;
+ break ;
+
+ case SF_FORMAT_VOC :
+ sf_errno = voc_open_read (psf) ;
+ break ;
+
+ case SF_FORMAT_IRCAM :
+ sf_errno = ircam_open_read (psf) ;
+ break ;
+
default :
sf_errno = SFE_UNKNOWN_FORMAT ;
} ;
/* Both the file format and the file must be seekable to enable sf_seek(). */
- psf->sf.seekable = (psf->sf.seekable && seekable) ? SF_TRUE : SF_FALSE ;
+ /*-psf->sf.seekable = (psf->sf.seekable && seekable) ? SF_TRUE : SF_FALSE ;-*/
if (sf_errno)
{ save_header_info (psf) ;
@@ -377,7 +294,8 @@
} ;
if (! validate_sfinfo (&(psf->sf)))
- { save_header_info (psf) ;
+ { psf_log_SF_INFO (psf) ;
+ save_header_info (psf) ;
sf_errno = SFE_BAD_SF_INFO ;
sf_close (psf) ;
return NULL ;
@@ -384,7 +302,8 @@
} ;
if (! validate_psf (psf))
- { save_header_info (psf) ;
+ { printf ("validate_psf\n") ;
+ save_header_info (psf) ;
sf_errno = SFE_INTERNAL ;
sf_close (psf) ;
return NULL ;
@@ -398,7 +317,8 @@
/*------------------------------------------------------------------------------
*/
-SNDFILE* sf_open_write (const char *path, const SF_INFO *sfinfo)
+SNDFILE*
+sf_open_write (const char *path, const SF_INFO *sfinfo)
{ SF_PRIVATE *psf ;
if (! sfinfo)
@@ -412,7 +332,7 @@
} ;
sf_errno = 0 ;
- sf_strbuffer [0] = 0 ;
+ sf_logbuffer [0] = 0 ;
psf = malloc (sizeof (SF_PRIVATE)) ;
if (! psf)
@@ -425,12 +345,17 @@
psf->Magick = SNDFILE_MAGICK ;
- /* fopen with 'b' means binary file mode for Win32 systems. */
-
- if (! (psf->file = fopen (path, "wb")))
- { sf_errno = SFE_OPEN_FAILED ;
- sf_close (psf) ;
- return NULL ;
+ if (! strcmp (path, "-"))
+ { psf->file = stdout ;
+ psf->sf.seekable = SF_FALSE ;
+ }
+ else
+ { /* fopen with 'b' means binary file mode for Win32 systems. */
+ if (! (psf->file = fopen (path, "wb")))
+ { sf_errno = SFE_OPEN_FAILED ;
+ sf_close (psf) ;
+ return NULL ;
+ } ;
} ;
psf->mode = SF_MODE_WRITE ;
@@ -484,6 +409,20 @@
} ;
break ;
+ case SF_FORMAT_NIST :
+ if ((sf_errno = nist_open_write (psf)))
+ { sf_close (psf) ;
+ return NULL ;
+ } ;
+ break ;
+
+ case SF_FORMAT_IRCAM :
+ if ((sf_errno = ircam_open_write (psf)))
+ { sf_close (psf) ;
+ return NULL ;
+ } ;
+ break ;
+
default :
sf_errno = SFE_UNKNOWN_FORMAT ;
sf_close (psf) ;
@@ -496,7 +435,8 @@
/*------------------------------------------------------------------------------
*/
-int sf_perror (SNDFILE *sndfile)
+int
+sf_perror (SNDFILE *sndfile)
{ SF_PRIVATE *psf ;
int k, errnum ;
@@ -508,15 +448,16 @@
errnum = psf->error ;
} ;
+ errnum = abs (errnum) ;
errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
for (k = 0 ; SndfileErrors[k].str ; k++)
if (errnum == SndfileErrors[k].error)
- { printf ("%s\n", SndfileErrors[k].str) ;
+ { fprintf (stderr, "%s\n", SndfileErrors[k].str) ;
return SFE_NO_ERROR ;
} ;
- printf ("No error string for error number %d.\n", errnum) ;
+ fprintf (stderr, "No error string for error number %d.\n", errnum) ;
return SFE_NO_ERROR ;
} /* sf_perror */
@@ -524,7 +465,8 @@
/*------------------------------------------------------------------------------
*/
-int sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen)
+int
+sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen)
{ SF_PRIVATE *psf ;
int errnum, k ;
@@ -536,17 +478,22 @@
errnum = psf->error ;
} ;
+ errnum = abs (errnum) ;
errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
for (k = 0 ; SndfileErrors[k].str ; k++)
if (errnum == SndfileErrors[k].error)
- { strncpy (str, SndfileErrors [errnum].str, maxlen) ;
- str [maxlen-1] = 0 ;
+ { if (str)
+ { strncpy (str, SndfileErrors [errnum].str, maxlen) ;
+ str [maxlen-1] = 0 ;
+ } ;
return SFE_NO_ERROR ;
} ;
- strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ;
- str [maxlen-1] = 0 ;
+ if (str)
+ { strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ;
+ str [maxlen-1] = 0 ;
+ } ;
return SFE_NO_ERROR ;
} /* sf_error_str */
@@ -554,9 +501,11 @@
/*------------------------------------------------------------------------------
*/
-int sf_error_number (int errnum, char *str, size_t maxlen)
+int
+sf_error_number (int errnum, char *str, size_t maxlen)
{ int k ;
+ errnum = abs (errnum) ;
errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
for (k = 0 ; SndfileErrors[k].str ; k++)
@@ -575,7 +524,8 @@
/*------------------------------------------------------------------------------
*/
-int sf_format_check (const SF_INFO *info)
+int
+sf_format_check (const SF_INFO *info)
{ int subformat = info->format & SF_FORMAT_SUBMASK ;
/* This is the place where each file format can check if the suppiled
@@ -590,8 +540,6 @@
{ case SF_FORMAT_WAV :
if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
return 1 ;
- if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32)
- return 1 ;
if (subformat == SF_FORMAT_IMA_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
return 1 ;
if (subformat == SF_FORMAT_MS_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
@@ -600,11 +548,19 @@
return 1 ;
if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
return 1 ;
+ if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32)
+ return 1 ;
break ;
case SF_FORMAT_AIFF :
if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
return 1 ;
+ if (subformat == SF_FORMAT_PCM_LE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+ return 1 ;
+ if (subformat == SF_FORMAT_PCM_BE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+ return 1 ;
+ if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
+ return 1 ;
break ;
case SF_FORMAT_AU :
@@ -611,14 +567,14 @@
case SF_FORMAT_AULE :
if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
return 1 ;
- if (subformat == SF_FORMAT_ULAW)
+ if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
return 1 ;
- if (subformat == SF_FORMAT_ALAW)
- return 1 ;
if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
return 1 ;
if (subformat == SF_FORMAT_G723_24 && info->channels == 1)
return 1 ;
+ if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
+ return 1 ;
break ;
case SF_FORMAT_RAW :
@@ -628,26 +584,41 @@
return 1 ;
if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)
break ;
- if (info->pcmbitwidth % 8 || info->pcmbitwidth > 32)
- break ;
- return 1 ;
+ if (! (info->pcmbitwidth % 8) && info->pcmbitwidth <= 32)
+ return 1 ;
break ;
-
+
case SF_FORMAT_PAF :
if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)
return 1 ;
- if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)
+ if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE && subformat != SF_FORMAT_PCM)
break ;
- if (info->pcmbitwidth % 8 || info->pcmbitwidth > 24)
- break ;
- return 1 ;
+ if ((info->pcmbitwidth % 8) == 0 && info->pcmbitwidth <= 24)
+ return 1 ;
break ;
-
+
case SF_FORMAT_SVX :
if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth == 8 || info->pcmbitwidth == 16))
return 1 ;
break ;
+
+ case SF_FORMAT_NIST :
+ if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
+ && info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+ return 1 ;
+ break ;
+ case SF_FORMAT_IRCAM :
+ if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
+ && info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+ return 1 ;
+ if ((subformat == SF_FORMAT_FLOAT_BE || subformat == SF_FORMAT_FLOAT_LE || subformat == SF_FORMAT_FLOAT)
+ && info->pcmbitwidth == 32)
+ return 1 ;
+ if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+ return 1 ;
+ break ;
+
default : break ;
} ;
@@ -657,39 +628,39 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_get_header_info (SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset)
+size_t
+sf_get_header_info (SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset)
{ SF_PRIVATE *psf ;
int len ;
if (! sndfile)
- { strncpy (buffer, sf_strbuffer, bufferlen - 1) ;
+ { strncpy (buffer, sf_logbuffer, bufferlen - 1) ;
buffer [bufferlen - 1] = 0 ;
- return strlen (sf_strbuffer) ;
+ return strlen (sf_logbuffer) ;
} ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
- len = strlen (psf->strbuffer) ;
+ len = strlen (psf->logbuffer) ;
if (offset < 0 || offset >= len)
return 0 ;
- strncpy (buffer, psf->strbuffer, bufferlen - 1) ;
+ strncpy (buffer, psf->logbuffer, bufferlen - 1) ;
buffer [bufferlen - 1] = 0 ;
- return strlen (psf->strbuffer) ;
+ return strlen (psf->logbuffer) ;
} /* sf_get_header_info */
/*------------------------------------------------------------------------------
*/
-size_t sf_get_lib_version (char *buffer, size_t bufferlen)
+size_t
+sf_get_lib_version (char *buffer, size_t bufferlen)
{ if (! buffer || ! bufferlen)
return 0 ;
- strncpy (buffer, PACKAGE, bufferlen - 1) ;
+ strncpy (buffer, PACKAGE "-" VERSION, bufferlen - 1) ;
buffer [bufferlen - 1] = 0 ;
- strncat (buffer, "-", bufferlen - strlen (buffer) - 1) ;
- strncat (buffer, VERSION, bufferlen - strlen (buffer) - 1) ;
return strlen (buffer) ;
} /* sf_get_lib_version */
@@ -697,25 +668,91 @@
/*------------------------------------------------------------------------------
*/
-double sf_signal_max (SNDFILE *sndfile)
+int
+sf_command (SNDFILE *sndfile, const char *cmd, void *data, int datasize)
{ SF_PRIVATE *psf ;
- off_t position ;
+ int command ;
+
+ command = hash_command (cmd) ;
+
+ if (command == SFC_LIB_VERSION)
+ { strncpy (data, PACKAGE "-" VERSION, datasize - 1) ;
+ ((char*) data) [datasize - 1] = 0 ;
+ return strlen ((char*) data) ;
+ } ;
+
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+ switch (command)
+ { case 0 :
+ return (psf->error = SFE_BAD_CONTROL_CMD) ;
+
+ case SFC_NORM_FLOAT :
+ if (! data)
+ return (psf->error = SFE_BAD_CONTROL_CMD) ;
+ if (! strcmp ("on", data))
+ psf->norm_float = SF_TRUE ;
+ else if (! strcmp ("off", data))
+ psf->norm_float = SF_FALSE ;
+ else
+ return (psf->error = SFE_BAD_CONTROL_CMD) ;
+ break ;
+
+ case SFC_NORM_DOUBLE :
+ if (! data)
+ return (psf->error = SFE_BAD_CONTROL_CMD) ;
+ if (! strcmp ("on", data))
+ psf->norm_double = SF_TRUE ;
+ else if (! strcmp ("off", data))
+ psf->norm_double = SF_FALSE ;
+ else
+ return (psf->error = SFE_BAD_CONTROL_CMD) ;
+ break ;
+
+ default :
+ /* Must be a file specific command. Pass it on. */
+ if (psf->command)
+ return psf->command (psf, command, data, datasize) ;
+
+ psf_log_printf (psf, "*** sf_command : cmd = %08X\n", command) ;
+ break ;
+ } ;
+
+ return 0 ;
+} /* sf_command */
+
+/*------------------------------------------------------------------------------
+*/
+
+double
+sf_signal_max (SNDFILE *sndfile)
+{ SF_PRIVATE *psf ;
+ long position ;
unsigned int k, len, readcount ;
double max = 0.0, *data, temp ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+ /* If the file has a PEAK chunk use that information. */
+ if (psf->has_peak)
+ { for (k = 0 ; k < psf->sf.channels ; k++)
+ if (max < fabs (psf->peak.peak [k].value))
+ max = fabs (psf->peak.peak [k].value);
+ return max ;
+ } ;
+
+ /* If the file is not seekable, there is nothing we can do. */
if (! psf->sf.seekable)
{ psf->error = SFE_NOT_SEEKABLE ;
return 0.0 ;
} ;
-
if (! psf->read_double)
{ psf->error = SFE_UNIMPLEMENTED ;
- return -1 ;
+ return 0.0 ;
} ;
+ /* Brute force. Read the whole file and find the biggest sample. */
position = sf_seek (sndfile, 0, SEEK_CUR) ; /* Get current position in file */
sf_seek (sndfile, 0, SEEK_SET) ; /* Go to start of file. */
@@ -724,7 +761,7 @@
data = malloc (len * sizeof (double)) ;
readcount = len ;
while (readcount == len)
- { readcount = psf->read_double (psf, data, len, 0) ;
+ { readcount = sf_read_double (sndfile, data, len, 0) ;
for (k = 0 ; k < len ; k++)
{ temp = data [k] ;
temp = temp < 0.0 ? -temp : temp ;
@@ -741,51 +778,54 @@
/*------------------------------------------------------------------------------
*/
-off_t sf_seek (SNDFILE *sndfile, off_t offset, int whence)
+long
+sf_seek (SNDFILE *sndfile, long offset, int whence)
{ SF_PRIVATE *psf ;
- off_t realseek, position ;
+ long realseek, position ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (! psf->sf.seekable)
{ psf->error = SFE_NOT_SEEKABLE ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
if (psf->seek_func)
- return psf->seek_func (psf, offset, whence) ;
+ { psf->seek_func (psf, offset, whence) ;
+ return psf->current ;
+ } ;
if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
-
+
switch (whence)
{ case SEEK_SET :
if (offset < 0 || offset * psf->blockwidth > psf->datalength)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
realseek = psf->dataoffset + offset * psf->blockwidth ;
fseek (psf->file, realseek, SEEK_SET) ;
position = ftell (psf->file) ;
break ;
-
+
case SEEK_CUR :
- realseek = offset * psf->blockwidth ;
- position = ftell (psf->file) - psf->dataoffset ;
- if (position + realseek > psf->datalength || position + realseek < 0)
+ position = (ftell (psf->file) - psf->dataoffset) / psf->blockwidth ;
+ if (psf->current + offset > psf->sf.samples)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
- fseek (psf->file, realseek, SEEK_CUR) ;
+ realseek = psf->dataoffset + (position + offset) * psf->blockwidth ;
+ fseek (psf->file, realseek, SEEK_SET) ;
position = ftell (psf->file) ;
break ;
-
+
case SEEK_END :
if (offset > 0 || psf->sf.samples + offset < 0)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
realseek = (psf->sf.samples + offset) * psf->blockwidth + psf->dataoffset ;
@@ -795,7 +835,7 @@
default :
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
psf->current = (position - psf->dataoffset) / psf->blockwidth ;
@@ -805,15 +845,16 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_read_raw (SNDFILE *sndfile, void *ptr, size_t bytes)
+size_t
+sf_read_raw (SNDFILE *sndfile, void *ptr, size_t bytes)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_READ)
{ psf->error = SFE_NOT_READMODE ;
- return ((size_t) -1) ;
+ return 0 ;
} ;
if (psf->current >= psf->datalength)
@@ -823,7 +864,7 @@
if (bytes % (psf->sf.channels * psf->bytewidth))
{ psf->error = SFE_BAD_READ_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = fread (ptr, 1, bytes, psf->file) ;
@@ -839,20 +880,21 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_read_short (SNDFILE *sndfile, short *ptr, size_t len)
+size_t
+sf_read_short (SNDFILE *sndfile, short *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count, extra ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_READ)
{ psf->error = SFE_NOT_READMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (len % psf->sf.channels)
{ psf->error = SFE_BAD_READ_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (psf->current >= psf->sf.samples)
@@ -862,7 +904,7 @@
if (! psf->read_short)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_short (psf, ptr, len) ;
@@ -879,15 +921,16 @@
return count ;
} /* sf_read_short */
-size_t sf_readf_short (SNDFILE *sndfile, short *ptr, size_t frames)
+size_t
+sf_readf_short (SNDFILE *sndfile, short *ptr, size_t frames)
{ SF_PRIVATE *psf ;
size_t count, extra ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_READ)
{ psf->error = SFE_NOT_READMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (psf->current >= psf->sf.samples)
@@ -897,7 +940,7 @@
if (! psf->read_short)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;
@@ -917,7 +960,8 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_read_int (SNDFILE *sndfile, int *ptr, size_t len)
+size_t
+sf_read_int (SNDFILE *sndfile, int *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count, extra ;
@@ -924,10 +968,14 @@
VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
if (psf->mode != SF_MODE_READ)
- return SFE_NOT_READMODE ;
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
if (len % psf->sf.channels)
- return (psf->error = SFE_BAD_READ_ALIGN) ;
+ { psf->error = SFE_BAD_READ_ALIGN ;
+ return 0 ;
+ } ;
if (psf->current >= psf->sf.samples)
{ memset (ptr, 0, len * sizeof (int)) ;
@@ -936,7 +984,7 @@
if (! psf->read_int)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_int (psf, ptr, len) ;
@@ -953,7 +1001,8 @@
return count ;
} /* sf_read_int */
-size_t sf_readf_int (SNDFILE *sndfile, int *ptr, size_t frames)
+size_t
+sf_readf_int (SNDFILE *sndfile, int *ptr, size_t frames)
{ SF_PRIVATE *psf ;
size_t count, extra ;
@@ -960,7 +1009,9 @@
VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
if (psf->mode != SF_MODE_READ)
- return SFE_NOT_READMODE ;
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
if (psf->current >= psf->sf.samples)
{ memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;
@@ -969,7 +1020,7 @@
if (! psf->read_int)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;
@@ -989,17 +1040,102 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_read_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+size_t
+sf_read_float (SNDFILE *sndfile, float *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count, extra ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+
+ if (psf->mode != SF_MODE_READ)
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
+
+ if (len % psf->sf.channels)
+ { psf->error = SFE_BAD_READ_ALIGN ;
+ return 0 ;
+ } ;
+
+ if (psf->current >= psf->sf.samples)
+ { memset (ptr, 0, len * sizeof (float)) ;
+ return 0 ;
+ } ;
+
+ if (! psf->read_float)
+ { psf->error = SFE_UNIMPLEMENTED ;
+ return 0 ;
+ } ;
+
+ count = psf->read_float (psf, ptr, len) ;
+
+ if (psf->current + count / psf->sf.channels > psf->sf.samples)
+ { count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+ extra = len - count ;
+ memset (ptr + count, 0, extra * sizeof (float)) ;
+ psf->current = psf->sf.samples ;
+ } ;
+
+ psf->current += count / psf->sf.channels ;
+
+ return count ;
+} /* sf_read_float */
+
+size_t
+sf_readf_float (SNDFILE *sndfile, float *ptr, size_t frames)
+{ SF_PRIVATE *psf ;
+ size_t count, extra ;
+
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+
+ if (psf->mode != SF_MODE_READ)
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
+
+ if (psf->current >= psf->sf.samples)
+ { memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;
+ return 0 ;
+ } ;
+
+ if (! psf->read_float)
+ { psf->error = SFE_UNIMPLEMENTED ;
+ return 0 ;
+ } ;
+
+ count = psf->read_float (psf, ptr, frames * psf->sf.channels) ;
+
+ if (psf->current + count / psf->sf.channels > psf->sf.samples)
+ { count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+ extra = frames * psf->sf.channels - count ;
+ memset (ptr + count, 0, extra * sizeof (float)) ;
+ psf->current = psf->sf.samples ;
+ } ;
+
+ psf->current += count / psf->sf.channels ;
+
+ return count / psf->sf.channels ;
+} /* sf_readf_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t
+sf_read_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+{ SF_PRIVATE *psf ;
+ size_t count, extra ;
+
VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_READ)
- return SFE_NOT_READMODE ;
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
if (len % psf->sf.channels)
- return (psf->error = SFE_BAD_READ_ALIGN) ;
+ { psf->error = SFE_BAD_READ_ALIGN ;
+ return 0 ;
+ } ;
if (psf->current >= psf->sf.samples)
{ memset (ptr, 0, len * sizeof (double)) ;
@@ -1008,7 +1144,7 @@
if (! psf->read_double)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_double (psf, ptr, len, normalize) ;
@@ -1025,7 +1161,8 @@
return count ;
} /* sf_read_double */
-size_t sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+size_t
+sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
{ SF_PRIVATE *psf ;
size_t count, extra ;
@@ -1032,7 +1169,9 @@
VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_READ)
- return SFE_NOT_READMODE ;
+ { psf->error = SFE_NOT_READMODE ;
+ return 0 ;
+ } ;
if (psf->current >= psf->sf.samples)
{ memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ;
@@ -1041,7 +1180,7 @@
if (! psf->read_double)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->read_double (psf, ptr, frames * psf->sf.channels, normalize) ;
@@ -1061,20 +1200,21 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_write_raw (SNDFILE *sndfile, void *ptr, size_t len)
+size_t
+sf_write_raw (SNDFILE *sndfile, void *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (len % (psf->sf.channels * psf->bytewidth))
{ psf->error = SFE_BAD_WRITE_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = fwrite (ptr, 1, len, psf->file) ;
@@ -1087,25 +1227,26 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_write_short (SNDFILE *sndfile, short *ptr, size_t len)
+size_t
+sf_write_short (SNDFILE *sndfile, short *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (len % psf->sf.channels)
{ psf->error = SFE_BAD_WRITE_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (! psf->write_short)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_short (sndfile, ptr, len) ;
@@ -1115,20 +1256,21 @@
return count ;
} /* sf_write_short */
-size_t sf_writef_short (SNDFILE *sndfile, short *ptr, size_t frames)
+size_t
+sf_writef_short (SNDFILE *sndfile, short *ptr, size_t frames)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (! psf->write_short)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_short (sndfile, ptr, frames * psf->sf.channels) ;
@@ -1141,52 +1283,54 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_write_int (SNDFILE *sndfile, int *ptr, size_t len)
+size_t
+sf_write_int (SNDFILE *sndfile, int *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (len % psf->sf.channels)
{ psf->error = SFE_BAD_WRITE_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (! psf->write_int)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_int (sndfile, ptr, len) ;
-
+
psf->current += count / psf->sf.channels ;
return count ;
} /* sf_write_int */
-size_t sf_writef_int (SNDFILE *sndfile, int *ptr, size_t frames)
+size_t
+sf_writef_int (SNDFILE *sndfile, int *ptr, size_t frames)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (! psf->write_int)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_int (sndfile, ptr, frames * psf->sf.channels) ;
-
+
psf->current += count / psf->sf.channels ;
return count / psf->sf.channels ;
@@ -1195,25 +1339,82 @@
/*------------------------------------------------------------------------------
*/
-size_t sf_write_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+size_t
+sf_write_float (SNDFILE *sndfile, float *ptr, size_t len)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (len % psf->sf.channels)
{ psf->error = SFE_BAD_WRITE_ALIGN ;
- return (size_t) -1 ;
+ return 0 ;
} ;
+
+ if (! psf->write_float)
+ { psf->error = SFE_UNIMPLEMENTED ;
+ return 0 ;
+ } ;
+ count = psf->write_float (sndfile, ptr, len) ;
+
+ psf->current += count / psf->sf.channels ;
+
+ return count ;
+} /* sf_write_float */
+
+size_t
+sf_writef_float (SNDFILE *sndfile, float *ptr, size_t frames)
+{ SF_PRIVATE *psf ;
+ size_t count ;
+
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+ if (psf->mode != SF_MODE_WRITE)
+ { psf->error = SFE_NOT_WRITEMODE ;
+ return 0 ;
+ } ;
+
+ if (! psf->write_float)
+ { psf->error = SFE_UNIMPLEMENTED ;
+ return 0 ;
+ } ;
+
+ count = psf->write_float (sndfile, ptr, frames * psf->sf.channels) ;
+
+ psf->current += count / psf->sf.channels ;
+
+ return count / psf->sf.channels ;
+} /* sf_writef_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t
+sf_write_double (SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+{ SF_PRIVATE *psf ;
+ size_t count ;
+
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+ if (psf->mode != SF_MODE_WRITE)
+ { psf->error = SFE_NOT_WRITEMODE ;
+ return 0 ;
+ } ;
+
+ if (len % psf->sf.channels)
+ { psf->error = SFE_BAD_WRITE_ALIGN ;
+ return 0 ;
+ } ;
+
if (! psf->write_double)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_double (sndfile, ptr, len, normalize) ;
@@ -1223,20 +1424,21 @@
return count ;
} /* sf_write_double */
-size_t sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+size_t
+sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
{ SF_PRIVATE *psf ;
size_t count ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->mode != SF_MODE_WRITE)
{ psf->error = SFE_NOT_WRITEMODE ;
- return (size_t) -1 ;
+ return 0 ;
} ;
if (! psf->write_double)
{ psf->error = SFE_UNIMPLEMENTED ;
- return (size_t) -1 ;
+ return 0 ;
} ;
count = psf->write_double (sndfile, ptr, frames * psf->sf.channels, normalize) ;
@@ -1249,11 +1451,12 @@
/*------------------------------------------------------------------------------
*/
-int sf_close (SNDFILE *sndfile)
+int
+sf_close (SNDFILE *sndfile)
{ SF_PRIVATE *psf ;
int error ;
- VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile,psf) ;
+ VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
if (psf->close)
error = psf->close (psf) ;
@@ -1271,4 +1474,162 @@
** Private functions.
*/
+static int
+does_extension_match (const char *ext, const char *test)
+{ char c1, c2 ;
+
+ if ((! ext) || (! test))
+ return 0 ;
+
+ if (strlen (ext) != strlen (test))
+ return 0 ;
+
+ while (*ext && *test)
+ { c1 = tolower (*ext) ;
+ c2 = tolower (*test) ;
+ if (c1 > c2)
+ return 0 ;
+ if (c1 < c2)
+ return 0 ;
+ ext ++ ;
+ test ++ ;
+ }
+
+ return 1 ;
+} /* does_extension_match */
+
+static int
+is_au_snd_file (const char *filename)
+{ const char *cptr ;
+
+ if (! (cptr = strrchr (filename, '.')))
+ return 0 ;
+ cptr ++ ;
+
+ if (does_extension_match (cptr, "au"))
+ return 1 ;
+
+ if (does_extension_match (cptr, "snd"))
+ return 1 ;
+
+ return 0 ;
+} /* is_au_snd_file */
+
+static int
+guess_file_type (SF_PRIVATE *psf, const char *filename)
+{ unsigned int buffer [3] ;
+
+ psf_binheader_readf (psf, "B", &buffer, sizeof (buffer)) ;
+
+ if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E'))
+ return SF_FORMAT_WAV ;
+
+ if (buffer [0] == MAKE_MARKER ('F','O','R','M'))
+ { if (buffer [2] == MAKE_MARKER ('A','I','F','F') || buffer [2] == MAKE_MARKER ('A','I','F','C'))
+ return SF_FORMAT_AIFF ;
+ if (buffer [2] == MAKE_MARKER ('8','S','V','X') || buffer [2] == MAKE_MARKER ('1','6','S','V'))
+ return SF_FORMAT_SVX ;
+ return 0 ;
+ } ;
+
+ if ((buffer [0] == MAKE_MARKER ('.','s','n','d') || buffer [0] == MAKE_MARKER ('d','n','s','.')))
+ return SF_FORMAT_AU ;
+
+ if ((buffer [0] == MAKE_MARKER ('f','a','p',' ') || buffer [0] == MAKE_MARKER (' ','p','a','f')))
+ return SF_FORMAT_PAF ;
+
+ if (buffer [0] == MAKE_MARKER ('N','I','S','T'))
+ return SF_FORMAT_NIST ;
+
+ if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R'))
+ return SF_FORMAT_SMPLTD ;
+
+ if (buffer [0] == MAKE_MARKER ('C','r','e','a') && buffer [1] == MAKE_MARKER ('t','i','v','e'))
+ return SF_FORMAT_VOC ;
+
+ if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) ||
+ (buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))
+ return SF_FORMAT_IRCAM ;
+
+ if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2'))
+ return SF_FORMAT_REX2 ;
+
+ if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11))
+ return SF_FORMAT_WMA ;
+
+ /* This must be the last one. */
+ if (filename && is_au_snd_file (filename))
+ return SF_FORMAT_AU | SF_FORMAT_ULAW ;
+
+ /* Default to header-less RAW PCM file type. */
+ return SF_FORMAT_RAW ;
+} /* guess_file_type */
+
+
+static int
+validate_sfinfo (SF_INFO *sfinfo)
+{ if (! sfinfo->samplerate)
+ return 0 ;
+ if (! sfinfo->samples)
+ return 0 ;
+ if (! sfinfo->channels)
+ return 0 ;
+ if (! sfinfo->pcmbitwidth)
+ return 0 ;
+ if (! sfinfo->format & SF_FORMAT_TYPEMASK)
+ return 0 ;
+ if (! sfinfo->format & SF_FORMAT_SUBMASK)
+ return 0 ;
+ if (! sfinfo->sections)
+ return 0 ;
+ return 1 ;
+} /* validate_sfinfo */
+
+static int
+validate_psf (SF_PRIVATE *psf)
+{ if (! psf->blockwidth)
+ return 0 ;
+ if (! psf->bytewidth)
+ return 0 ;
+ if (! psf->datalength)
+ return 0 ;
+ if (psf->blockwidth != psf->sf.channels * psf->bytewidth)
+ return 0 ;
+ return 1 ;
+} /* validate_psf */
+
+static void
+save_header_info (SF_PRIVATE *psf)
+{ memset (sf_logbuffer, 0, sizeof (sf_logbuffer)) ;
+ strncpy (sf_logbuffer, psf->logbuffer, sizeof (sf_logbuffer)) ;
+} /* save_header_info */
+
+static void
+copy_filename (SF_PRIVATE *psf, const char *path)
+{ const char *cptr ;
+
+ if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\')))
+ cptr ++ ;
+ else
+ cptr = path ;
+
+ memset (psf->filename, 0, SF_FILENAME_LEN) ;
+ strncpy (psf->filename, cptr, SF_FILENAME_LEN - 1) ;
+ psf->filename [SF_FILENAME_LEN - 1] = 0 ;
+} /* copy_filename */
+
+static int
+hash_command (const char *cmd)
+{ int hash = 0 ;
+
+ if (! cmd)
+ return 0 ;
+
+ while (*cmd)
+ { hash = (hash<<1) ^ *cmd ;
+ cmd ++ ;
+ } ;
+
+ return hash ;
+} /* hash_command */
--- a/common/libsndfile/src/sndfile.h
+++ b/common/libsndfile/src/sndfile.h
@@ -1,18 +1,18 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
** 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
+** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
@@ -32,7 +32,7 @@
#include <sys/types.h>
#endif
-#ifdef _WIN32
+#if defined (_WIN32)
#pragma pack(push,1)
#endif
@@ -48,8 +48,8 @@
*/
enum
-{ SF_FORMAT_WAV = 0x10000, /* Microsoft WAV format (big endian). */
- SF_FORMAT_AIFF = 0x20000, /* Apple/SGI AIFF format (little endian). */
+{ SF_FORMAT_WAV = 0x10000, /* Microsoft WAV format (little endian). */
+ SF_FORMAT_AIFF = 0x20000, /* Apple/SGI AIFF format (big endian). */
SF_FORMAT_AU = 0x30000, /* Sun/NeXT AU format (big endian). */
SF_FORMAT_AULE = 0x40000, /* DEC AU format (little endian). */
SF_FORMAT_RAW = 0x50000, /* RAW PCM data. */
@@ -56,7 +56,15 @@
SF_FORMAT_PAF = 0x60000, /* Ensoniq PARIS file format. */
SF_FORMAT_SVX = 0x70000, /* Amiga IFF / SVX8 / SV16 format. */
SF_FORMAT_NIST = 0x80000, /* Sphere NIST format. */
-
+ SF_FORMAT_WMA = 0x90000, /* Windows Media Audio. */
+ SF_FORMAT_SMPLTD = 0xA0000, /* Sekd Samplitude. */
+ SF_FORMAT_VOC = 0xB0000, /* VOC files. */
+ SF_FORMAT_SD2 = 0xC0000, /* Sound Designer 2 */
+ SF_FORMAT_REX2 = 0xD0000, /* Propellorheads Rex2 */
+ SF_FORMAT_IRCAM = 0xE0000, /* Berkeley/IRCAM/CARL */
+
+ /* Subtypes from here on. */
+
SF_FORMAT_PCM = 0x0001, /* PCM data in 8, 16, 24 or 32 bits. */
SF_FORMAT_FLOAT = 0x0002, /* 32 bit floats. */
SF_FORMAT_ULAW = 0x0003, /* U-Law encoded. */
@@ -68,7 +76,7 @@
SF_FORMAT_PCM_LE = 0x0008, /* Little endian PCM data. */
SF_FORMAT_PCM_S8 = 0x0009, /* Signed 8 bit PCM. */
SF_FORMAT_PCM_U8 = 0x000A, /* Unsigned 8 bit PCM. */
-
+
SF_FORMAT_SVX_FIB = 0x000B, /* SVX Fibonacci Delta encoding. */
SF_FORMAT_SVX_EXP = 0x000C, /* SVX Exponential Delta encoding. */
@@ -77,12 +85,15 @@
SF_FORMAT_G721_32 = 0x000E, /* 32kbs G721 ADPCM encoding. */
SF_FORMAT_G723_24 = 0x000F, /* 24kbs G723 ADPCM encoding. */
- SF_FORMAT_SUBMASK = 0xFFFF,
+ SF_FORMAT_FLOAT_BE = 0x0010, /* Big endian FLOAT data. */
+ SF_FORMAT_FLOAT_LE = 0x0011, /* Little endian FLOAT data. */
+
+ SF_FORMAT_SUBMASK = 0xFFFF,
SF_FORMAT_TYPEMASK = 0x7FFF0000
} ;
-/* Th following SF_FORMAT_RAW_* identifiers are deprecated. Use the
-** SF_FORMAT_PCM_* idetifiers instead.
+/* The following SF_FORMAT_RAW_* identifiers are deprecated. Use the
+** SF_FORMAT_PCM_* identifiers instead.
*/
#define SF_FORMAT_RAW_BE SF_FORMAT_PCM_BE
#define SF_FORMAT_RAW_LE SF_FORMAT_PCM_LE
@@ -93,8 +104,8 @@
typedef void SNDFILE ;
-/* A pointer to a SF_INFO structure is passed to sf_open_read () and filled in.
-** On write, the SF_INFO structure is filled in by the user and passed into
+/* A pointer to a SF_INFO structure is passed to sf_open_read () and filled in.
+** On write, the SF_INFO structure is filled in by the user and passed into
** sf_open_write ().
*/
@@ -108,18 +119,17 @@
unsigned int seekable ;
} SF_INFO ;
-
-/* Open the specified file for read or write. On error, this will return
+/* Open the specified file for read or write. On error, this will return
** a NULL pointer. To find the error number, pass a NULL SNDFILE to
** sf_perror () or sf_error_str ().
*/
-SNDFILE* sf_open_read (const char *path, SF_INFO *wfinfo) ;
-SNDFILE* sf_open_write (const char *path, const SF_INFO *wfinfo) ;
+SNDFILE* sf_open_read (const char *path, SF_INFO *sfinfo) ;
+SNDFILE* sf_open_write (const char *path, const SF_INFO *sfinfo) ;
/* sf_perror () prints out the current error state.
-** sf_error_str () returns the current error message to the caller in the
-** string buffer provided.
+** sf_error_str () returns the current error message to the caller in the
+** string buffer provided.
*/
int sf_perror (SNDFILE *sndfile) ;
@@ -136,6 +146,10 @@
/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+int sf_command (SNDFILE *sndfile, const char *cmd, void *data, int datasize) ;
+
+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+
int sf_format_check (const SF_INFO *info) ;
/* Return the maximum absolute sample value in the SNDFILE. */
@@ -142,17 +156,17 @@
double sf_signal_max (SNDFILE *sndfile) ;
-/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses
+/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses
** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as
** stdio.h functions lseek () and fseek ().
-** An offset of zero with whence set to SEEK_SET will position the
+** An offset of zero with whence set to SEEK_SET will position the
** read / write pointer to the first data sample.
-** On success sf_seek returns the current position in (multi-channel)
+** On success sf_seek returns the current position in (multi-channel)
** samples from the start of the file.
** On error sf_seek returns -1.
*/
-off_t sf_seek (SNDFILE *sndfile, off_t frames, int whence) ;
+long sf_seek (SNDFILE *sndfile, long frames, int whence) ;
/* Functions for reading/writing the waveform data of a sound file.
*/
@@ -160,7 +174,7 @@
size_t sf_read_raw (SNDFILE *sndfile, void *ptr, size_t bytes) ;
size_t sf_write_raw (SNDFILE *sndfile, void *ptr, size_t bytes) ;
-/* Functions for reading and writing the data chunk in terms of frames.
+/* Functions for reading and writing the data chunk in terms of frames.
** The number of items actually read/written = frames * number of channels.
** sf_xxxx_raw read/writes the raw data bytes from/to the file
** sf_xxxx_uchar passes data in the unsigned char format
@@ -169,8 +183,8 @@
** sf_xxxx_int passes data in the native int format
** sf_xxxx_float passes data in the native float format
** sf_xxxx_double passes data in the native double format
-** For the double format, if the normalize flag is TRUE, the read/write
-** operations will use floats/doubles in the rangs [-1.0 .. 1.0] to
+** For the double format, if the normalize flag is TRUE, the read/write
+** operations will use floats/doubles in the rangs [-1.0 .. 1.0] to
** represent the minimum and maximum values of the waveform irrespective
** of the bitwidth of the input/output file.
** All of these read/write function return number of frames read/written.
@@ -182,10 +196,13 @@
size_t sf_readf_int (SNDFILE *sndfile, int *ptr, size_t frames) ;
size_t sf_writef_int (SNDFILE *sndfile, int *ptr, size_t frames) ;
+size_t sf_readf_float (SNDFILE *sndfile, float *ptr, size_t frames) ;
+size_t sf_writef_float (SNDFILE *sndfile, float *ptr, size_t frames) ;
+
size_t sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
size_t sf_writef_double(SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-/* Functions for reading and writing the data chunk in terms of items.
+/* Functions for reading and writing the data chunk in terms of items.
** Otherwise similar to above.
** All of these read/write function return number of items read/written.
*/
@@ -196,6 +213,9 @@
size_t sf_read_int (SNDFILE *sndfile, int *ptr, size_t items) ;
size_t sf_write_int (SNDFILE *sndfile, int *ptr, size_t items) ;
+size_t sf_read_float (SNDFILE *sndfile, float *ptr, size_t items) ;
+size_t sf_write_float (SNDFILE *sndfile, float *ptr, size_t items) ;
+
size_t sf_read_double (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
size_t sf_write_double (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
@@ -208,7 +228,7 @@
#endif /* __cplusplus */
#ifdef _WIN32
-// #pragma pack(pop,1)
+ #pragma pack(pop,1)
#endif
#endif /* SNDFILE_H */
--- a/common/libsndfile/src/svx.c
+++ b/common/libsndfile/src/svx.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -27,7 +27,6 @@
#include "config.h"
#include "sfendian.h"
#include "common.h"
-#include "pcm.h"
/*------------------------------------------------------------------------------
@@ -34,14 +33,6 @@
* Macros to handle big/little endian issues.
*/
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-# error "Cannot determine endian-ness of processor."
-#endif
-
#define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M'))
#define SVX8_MARKER (MAKE_MARKER ('8', 'S', 'V', 'X'))
#define SV16_MARKER (MAKE_MARKER ('1', '6', 'S', 'V'))
@@ -57,7 +48,6 @@
#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O'))
#define CHAN_MARKER (MAKE_MARKER ('C', 'H', 'A', 'N'))
-
/*------------------------------------------------------------------------------
* Typedefs for file chunks.
*/
@@ -69,91 +59,99 @@
unsigned int volume ;
} VHDR_CHUNK ;
+enum {
+ HAVE_FORM = 0x01,
+
+ HAVE_SVX = 0x02,
+ HAVE_VHDR = 0x04,
+ HAVE_BODY = 0x08
+} ;
+
/*------------------------------------------------------------------------------
* Private static functions.
*/
-static int svx_close (SF_PRIVATE *psf) ;
+static int svx_close (SF_PRIVATE *psf) ;
+static int svx_write_header (SF_PRIVATE *psf) ;
-static
-void endswap_vhdr_chunk (VHDR_CHUNK *vhdr)
-{ vhdr->oneShotHiSamples = ENDSWAP_INT (vhdr->oneShotHiSamples) ;
- vhdr->repeatHiSamples = ENDSWAP_INT (vhdr->repeatHiSamples) ;
- vhdr->samplesPerHiCycle = ENDSWAP_INT (vhdr->samplesPerHiCycle) ;
- vhdr->samplesPerSec = ENDSWAP_SHORT (vhdr->samplesPerSec) ;
- vhdr->volume = ENDSWAP_INT (vhdr->volume) ;
-} /* endswap_vhdr_chunk */
+/*
+static void endswap_vhdr_chunk (VHDR_CHUNK *vhdr) ;
+*/
/*------------------------------------------------------------------------------
** Public functions.
*/
-int svx_open_read (SF_PRIVATE *psf)
+int
+svx_open_read (SF_PRIVATE *psf)
{ VHDR_CHUNK vhdr ;
unsigned int FORMsize, vhdrsize, dword, marker ;
- int filetype = 0, parsestage = 0, done = 0 ;
+ int filetype = 0, parsestage = 0, done = 0, error ;
+ int bytecount = 0, channels ;
+
+ psf_binheader_readf (psf, "p", 0) ;
/* Set default number of channels. */
psf->sf.channels = 1 ;
while (! done)
- { fread (&marker, sizeof (marker), 1, psf->file) ;
+ { psf_binheader_readf (psf, "m", &marker) ;
switch (marker)
{ case FORM_MARKER :
- if (parsestage != 0)
+ if (parsestage)
return SFE_SVX_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- FORMsize = BE2H_INT (dword) ;
+ psf_binheader_readf (psf, "L", &FORMsize) ;
+
if (FORMsize != psf->filelength - 2 * sizeof (dword))
{ dword = psf->filelength - 2 * sizeof (dword);
- psf_sprintf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+ psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
FORMsize = dword ;
}
else
- psf_sprintf (psf, "FORM : %d\n", FORMsize) ;
- parsestage = 1 ;
+ psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+ parsestage |= HAVE_FORM ;
break ;
case SVX8_MARKER :
case SV16_MARKER :
- if (parsestage != 1)
+ if (! (parsestage & HAVE_FORM))
return SFE_SVX_NO_FORM ;
filetype = marker ;
- psf_sprintf (psf, " %D\n", marker) ;
- parsestage = 2 ;
+ psf_log_printf (psf, " %D\n", marker) ;
+ parsestage |= HAVE_SVX ;
break ;
case VHDR_MARKER :
- if (parsestage != 2)
+ if (! (parsestage & (HAVE_FORM | HAVE_SVX)))
return SFE_SVX_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- vhdrsize = BE2H_INT (dword) ;
+
+ psf_binheader_readf (psf, "L", &vhdrsize) ;
- psf_sprintf (psf, " VHDR : %d\n", vhdrsize) ;
+ psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ;
- fread (&vhdr, sizeof (vhdr), 1, psf->file) ;
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_vhdr_chunk (&vhdr) ;
+ psf_binheader_readf (psf, "LLLWbbL", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples),
+ &(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression),
+ &(vhdr.volume)) ;
- psf_sprintf (psf, " OneShotHiSamples : %d\n", vhdr.oneShotHiSamples) ;
- psf_sprintf (psf, " RepeatHiSamples : %d\n", vhdr.repeatHiSamples) ;
- psf_sprintf (psf, " samplesPerHiCycle : %d\n", vhdr.samplesPerHiCycle) ;
- psf_sprintf (psf, " Sample Rate : %d\n", vhdr.samplesPerSec) ;
- psf_sprintf (psf, " Octave : %d\n", vhdr.octave) ;
+ psf_log_printf (psf, " OneShotHiSamples : %d\n", vhdr.oneShotHiSamples) ;
+ psf_log_printf (psf, " RepeatHiSamples : %d\n", vhdr.repeatHiSamples) ;
+ psf_log_printf (psf, " samplesPerHiCycle : %d\n", vhdr.samplesPerHiCycle) ;
+ psf_log_printf (psf, " Sample Rate : %d\n", vhdr.samplesPerSec) ;
+ psf_log_printf (psf, " Octave : %d\n", vhdr.octave) ;
- psf_sprintf (psf, " Compression : %d => ", vhdr.compression) ;
+ psf_log_printf (psf, " Compression : %d => ", vhdr.compression) ;
switch (vhdr.compression)
- { case 0 : psf_sprintf (psf, "None.\n") ;
+ { case 0 : psf_log_printf (psf, "None.\n") ;
break ;
- case 1 : psf_sprintf (psf, "Fibonacci delta\n") ;
+ case 1 : psf_log_printf (psf, "Fibonacci delta\n") ;
break ;
- case 2 : psf_sprintf (psf, "Exponential delta\n") ;
+ case 2 : psf_log_printf (psf, "Exponential delta\n") ;
break ;
} ;
- psf_sprintf (psf, " Volume : %d\n", vhdr.volume) ;
+ psf_log_printf (psf, " Volume : %d\n", vhdr.volume) ;
psf->sf.samplerate = vhdr.samplesPerSec ;
@@ -162,73 +160,101 @@
else if (filetype == SV16_MARKER)
psf->sf.pcmbitwidth = 16 ;
- parsestage = 3 ;
+ parsestage |= HAVE_VHDR ;
break ;
case BODY_MARKER :
- if (parsestage != 3)
+ if (! (parsestage & HAVE_VHDR))
return SFE_SVX_NO_BODY ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
-
- psf->datalength = BE2H_INT (dword) ;
+
+ psf_binheader_readf (psf, "L", &(psf->datalength)) ;
psf->dataoffset = ftell (psf->file) ;
if (psf->datalength > psf->filelength - psf->dataoffset)
- { psf_sprintf (psf, " BODY : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
+ { psf_log_printf (psf, " BODY : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
psf->datalength = psf->filelength - psf->dataoffset ;
}
else
- psf_sprintf (psf, " BODY : %d\n", psf->datalength) ;
+ psf_log_printf (psf, " BODY : %d\n", psf->datalength) ;
+
+ parsestage |= HAVE_BODY ;
+ if (! psf->sf.seekable)
+ break ;
+
fseek (psf->file, psf->datalength, SEEK_CUR) ;
- parsestage = 4 ;
break ;
case NAME_MARKER :
case ANNO_MARKER :
- if (parsestage < 2)
+ if (! (parsestage & HAVE_SVX))
return SFE_SVX_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = BE2H_INT (dword) ;
- psf_sprintf (psf, " %D : %d\n", marker, dword) ;
- fseek (psf->file, (int) dword, SEEK_CUR) ;
+
+ psf_binheader_readf (psf, "L", &dword) ;
+
+ psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
+ case CHAN_MARKER :
+ if (! (parsestage & HAVE_SVX))
+ return SFE_SVX_NO_FORM ;
+
+ psf_binheader_readf (psf, "L", &dword) ;
+
+ psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+ bytecount += psf_binheader_readf (psf, "L", &channels) ;
+
+ psf_log_printf (psf, " Channels : %d => %d\n", channels) ;
+
+ psf_binheader_readf (psf, "j", dword - bytecount) ;
+ break ;
+
+
case AUTH_MARKER :
case c_MARKER :
- case CHAN_MARKER :
- if (parsestage < 2)
+ if (! (parsestage & HAVE_SVX))
return SFE_SVX_NO_FORM ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = BE2H_INT (dword) ;
- psf_sprintf (psf, " %D : %d\n", marker, dword) ;
- fseek (psf->file, (int) dword, SEEK_CUR) ;
+
+ psf_binheader_readf (psf, "L", &dword) ;
+
+ psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
default :
if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
- { fread (&dword, sizeof (dword), 1, psf->file) ;
- psf_sprintf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
- fseek (psf->file, (int) dword, SEEK_CUR) ;
+ { psf_binheader_readf (psf, "L", &dword) ;
+
+ psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword) ;
break ;
} ;
if ((dword = ftell (psf->file)) & 0x03)
- { psf_sprintf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
- fseek (psf->file, -3, SEEK_CUR) ;
+ { psf_log_printf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+
+ psf_binheader_readf (psf, "j", -3) ;
break ;
} ;
- psf_sprintf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+ psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
done = 1 ;
} ; /* switch (marker) */
if (ferror (psf->file))
- { psf_sprintf (psf, "*** Error on file handle. ***\n", marker) ;
+ { psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
clearerr (psf->file) ;
break ;
} ;
+
+ if (! psf->sf.seekable && (parsestage & HAVE_BODY))
+ break ;
- if (ftell (psf->file) >= (off_t) (psf->filelength - (2 * sizeof (dword))))
+ if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
break ;
} ; /* while (1) */
@@ -238,8 +264,8 @@
if (! psf->dataoffset)
return SFE_SVX_NO_DATA ;
- psf->sf.format = (SF_FORMAT_SVX | SF_FORMAT_PCM);
- psf->sf.sections = 1 ;
+ psf->sf.format = (SF_FORMAT_SVX | SF_FORMAT_PCM);
+ psf->sf.sections = 1 ;
psf->current = 0 ;
psf->endian = SF_ENDIAN_BIG ; /* All SVX files are big endian. */
@@ -255,30 +281,17 @@
psf->close = (func_close) svx_close ;
- switch (psf->bytewidth)
- { case 1 :
- psf->read_short = (func_short) pcm_read_sc2s ;
- psf->read_int = (func_int) pcm_read_sc2i ;
- psf->read_double = (func_double) pcm_read_sc2d ;
- break ;
- case 2 :
- psf->read_short = (func_short) pcm_read_bes2s ;
- psf->read_int = (func_int) pcm_read_bes2i ;
- psf->read_double = (func_double) pcm_read_bes2d ;
- break ;
- default :
- /* printf ("Weird bytewidth (%d)\n", psf->bytewidth) ; */
- return SFE_UNIMPLEMENTED ;
- } ;
+ psf->chars = SF_CHARS_SIGNED ;
+ if ((error = pcm_read_init (psf)))
+ return error ;
return 0 ;
} /* svx_open_read */
-int svx_open_write (SF_PRIVATE *psf)
-{ static char annotation [] = "libsndfile by Erik de Castro Lopo\0\0\0" ;
- VHDR_CHUNK vhdr ;
- unsigned int FORMsize ;
-
+int
+svx_open_write (SF_PRIVATE *psf)
+{ int error ;
+
if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SVX)
return SFE_BAD_OPEN_FORMAT ;
if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
@@ -294,56 +307,17 @@
psf->filelength = psf->datalength + psf->dataoffset ;
psf->error = 0 ;
- FORMsize = 0x7FFFFFFF ; /* Correct this when closing file. */
-
- vhdr.oneShotHiSamples = psf->sf.samples ;
- vhdr.repeatHiSamples = 0 ;
- vhdr.samplesPerHiCycle = 0 ;
- vhdr.samplesPerSec = psf->sf.samplerate ;
- vhdr.octave = 1 ;
- vhdr.compression = 0 ;
- vhdr.volume = (psf->bytewidth == 1) ? 255 : 0xFFFF ;
+ error = svx_write_header (psf) ;
+ if (error)
+ return error ;
+
+ psf->close = (func_close) svx_close ;
+ psf->write_header = (func_wr_hdr) svx_write_header ;
- if (CPU_IS_LITTLE_ENDIAN)
- endswap_vhdr_chunk (&vhdr) ;
+ psf->chars = SF_CHARS_SIGNED ;
+ if ((error = pcm_write_init (psf)))
+ return error ;
- psf_hprintf (psf, "mL" , FORM_MARKER, FORMsize) ;
- psf_hprintf (psf, "m" , (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ;
- psf_hprintf (psf, "mLb" , VHDR_MARKER, sizeof (VHDR_CHUNK), &vhdr, sizeof (VHDR_CHUNK)) ;
- psf_hprintf (psf, "mSmS", NAME_MARKER, psf->filename, ANNO_MARKER, annotation) ;
- psf_hprintf (psf, "mL" , BODY_MARKER, psf->datalength) ;
-
-
- fwrite (psf->header, psf->headindex, 1, psf->file) ;
-
- psf->dataoffset = ftell (psf->file) ;
-
- psf->close = (func_close) svx_close ;
-
- switch (psf->bytewidth)
- { case 1 :
- psf->write_short = (func_short) pcm_write_s2sc ;
- psf->write_int = (func_int) pcm_write_i2sc ;
- psf->write_double = (func_double) pcm_write_d2sc ;
- break ;
- case 2 :
- psf->write_short = (func_short) pcm_write_s2bes ;
- psf->write_int = (func_int) pcm_write_i2bes ;
- psf->write_double = (func_double) pcm_write_d2bes ;
- break ;
- case 3 :
- psf->write_short = (func_short) pcm_write_s2bet ;
- psf->write_int = (func_int) pcm_write_i2bet ;
- psf->write_double = (func_double) pcm_write_d2bet ;
- break ;
- case 4 :
- psf->write_short = (func_short) pcm_write_s2bei ;
- psf->write_int = (func_int) pcm_write_i2bei ;
- psf->write_double = (func_double) pcm_write_d2bei ;
- break ;
- default : return SFE_UNIMPLEMENTED ;
- } ;
-
return 0 ;
} /* svx_open_write */
@@ -350,7 +324,8 @@
/*------------------------------------------------------------------------------
*/
-int svx_close (SF_PRIVATE *psf)
+static int
+svx_close (SF_PRIVATE *psf)
{
if (psf->mode == SF_MODE_WRITE)
{ /* Now we know for certain the length of the file we can re-write
@@ -359,12 +334,11 @@
fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
-
- psf_hsetf (psf, FORM_MARKER, "L", psf->filelength - 8) ;
- psf_hsetf (psf, BODY_MARKER, "L", psf->filelength - psf->dataoffset) ;
-
fseek (psf->file, 0, SEEK_SET) ;
- fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->datalength = psf->filelength - psf->dataoffset ;
+
+ svx_write_header (psf) ;
} ;
if (psf->fdata)
@@ -373,4 +347,49 @@
return 0 ;
} /* svx_close */
+
+static int
+svx_write_header (SF_PRIVATE *psf)
+{ static char annotation [] = "libsndfile by Erik de Castro Lopo\0\0\0" ;
+
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ /* FORM marker and FORM size. */
+ psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+ psf_binheader_writef (psf, "m", (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ;
+
+ /* VHDR chunk. */
+ psf_binheader_writef (psf, "mL", VHDR_MARKER, sizeof (VHDR_CHUNK)) ;
+ /* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */
+ psf_binheader_writef (psf, "LLL", psf->sf.samples, 0, 0) ;
+ /* VHDR : samplesPerSec, octave, compression */
+ psf_binheader_writef (psf, "Wbb", psf->sf.samplerate, 1, 0) ;
+ /* VHDR : volume */
+ psf_binheader_writef (psf, "L", (psf->bytewidth == 1) ? 255 : 0xFFFF) ;
+
+ /* Filename and annotation strings. */
+ psf_binheader_writef (psf, "mSmS", NAME_MARKER, psf->filename, ANNO_MARKER, annotation) ;
+
+ /* BODY marker and size. */
+ psf_binheader_writef (psf, "mL", BODY_MARKER, psf->datalength) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ return 0 ;
+} /* svx_write_header */
+
+/*-
+static void
+endswap_vhdr_chunk (VHDR_CHUNK *vhdr)
+{ vhdr->oneShotHiSamples = ENDSWAP_INT (vhdr->oneShotHiSamples) ;
+ vhdr->repeatHiSamples = ENDSWAP_INT (vhdr->repeatHiSamples) ;
+ vhdr->samplesPerHiCycle = ENDSWAP_INT (vhdr->samplesPerHiCycle) ;
+ vhdr->samplesPerSec = ENDSWAP_SHORT (vhdr->samplesPerSec) ;
+ vhdr->volume = ENDSWAP_INT (vhdr->volume) ;
+} /+* endswap_vhdr_chunk *+/
+-*/
--- a/common/libsndfile/src/ulaw.c
+++ b/common/libsndfile/src/ulaw.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -20,18 +20,54 @@
#include <unistd.h>
#include "sndfile.h"
+#include "floatcast.h"
#include "common.h"
+static int ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static int ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int ulaw_write_f2ulaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
static void ulaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
static void ulaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
+static void ulaw2f_array (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
static void ulaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
static void s2ulaw_array (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
static void i2ulaw_array (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static void f2ulaw_array (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
static void d2ulaw_array (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
-int ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
+int
+ulaw_read_init (SF_PRIVATE *psf)
+{
+ psf->read_short = (func_short) ulaw_read_ulaw2s ;
+ psf->read_int = (func_int) ulaw_read_ulaw2i ;
+ psf->read_float = (func_float) ulaw_read_ulaw2f ;
+ psf->read_double = (func_double) ulaw_read_ulaw2d ;
+
+ return 0 ;
+} /* ulaw_read_int */
+
+int
+ulaw_write_init (SF_PRIVATE *psf)
+{
+ psf->write_short = (func_short) ulaw_write_s2ulaw ;
+ psf->write_int = (func_int) ulaw_write_i2ulaw ;
+ psf->write_float = (func_float) ulaw_write_f2ulaw ;
+ psf->write_double = (func_double) ulaw_write_d2ulaw ;
+
+ return 0 ;
+} /* ulaw_write_int */
+
+static int
+ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -56,7 +92,8 @@
return total ;
} /* ulaw_read_ulaw2s */
-int ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
+static int
+ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -81,10 +118,40 @@
return total ;
} /* ulaw_read_ulaw2i */
-int ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+static int
+ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
{ unsigned int readcount, thisread, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+ ulaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+ total += thisread ;
+ if (thisread < readcount)
+ break ;
+ index += thisread / psf->bytewidth ;
+ bytecount -= thisread ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* ulaw_read_ulaw2f */
+
+static int
+ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{ unsigned int readcount, thisread, index = 0 ;
+ int bytecount, bufferlen ;
+ int total = 0 ;
double normfact ;
normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
@@ -111,7 +178,8 @@
/*=============================================================================================
*/
-int ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len)
+static int
+ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -136,7 +204,8 @@
return total ;
} /* ulaw_write_s2ulaw */
-int ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, unsigned int len)
+static int
+ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
@@ -161,10 +230,40 @@
return total ;
} /* ulaw_write_i2ulaw */
-int ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+static int
+ulaw_write_f2ulaw (SF_PRIVATE *psf, float *ptr, unsigned int len)
{ unsigned int writecount, thiswrite, index = 0 ;
int bytecount, bufferlen ;
int total = 0 ;
+ float normfact ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+ bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+ bytecount = len * psf->bytewidth ;
+ while (bytecount > 0)
+ { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+ f2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+ thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+ total += thiswrite ;
+ if (thiswrite < writecount)
+ break ;
+ index += thiswrite / psf->bytewidth ;
+ bytecount -= thiswrite ;
+ } ;
+
+ total /= psf->bytewidth ;
+ if (total < len)
+ psf->error = SFE_SHORT_READ ;
+
+ return total ;
+} /* ulaw_write_f2ulaw */
+
+static int
+ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{ unsigned int writecount, thiswrite, index = 0 ;
+ int bytecount, bufferlen ;
+ int total = 0 ;
double normfact ;
normfact = (normalize ? ((double) 0x8000) : 1.0) ;
@@ -189,9 +288,6 @@
return total ;
} /* ulaw_write_d2ulaw */
-
-
-
/*=============================================================================================
* Private static functions and data.
*/
@@ -902,44 +998,56 @@
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00
} ;
-static
-void ulaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
+static void
+ulaw2s_array (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -1 * ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
} /* ulaw2s_array */
-static
-void ulaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
+static void
+ulaw2i_array (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -1 * ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
} /* ulaw2i_array */
-static
-void ulaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+static void
+ulaw2f_array (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
{ int k ;
for (k = 0 ; k < count ; k++)
{ if (buffer [k] & 0x80)
- ptr [index] = -normfact * ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
else
- ptr [index] = normfact * ulaw_decode [((int)buffer [k]) & 0x7F] ;
+ ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
index ++ ;
} ;
+} /* ulaw2f_array */
+
+static void
+ulaw2d_array (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+{ int k ;
+ for (k = 0 ; k < count ; k++)
+ { if (buffer [k] & 0x80)
+ ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ else
+ ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ index ++ ;
+ } ;
} /* ulaw2d_array */
-static
-void s2ulaw_array (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+static void
+s2ulaw_array (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
@@ -951,8 +1059,8 @@
} ;
} /* s2ulaw_array */
-static
-void i2ulaw_array (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+static void
+i2ulaw_array (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
@@ -964,15 +1072,28 @@
} ;
} /* i2ulaw_array */
-static
-void d2ulaw_array (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+static void
+f2ulaw_array (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
{ unsigned int k ;
for (k = 0 ; k < count ; k++)
{ if (ptr [index] >= 0)
- buffer [k] = ulaw_encode [((int) (normfact * ptr [index])) / 4] ;
+ buffer [k] = ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 4] ;
else
- buffer [k] = 0x7F & ulaw_encode [((int) (normfact * ptr [index])) / -4] ;
+ buffer [k] = 0x7F & ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -4] ;
+ index ++ ;
+ } ;
+} /* f2ulaw_array */
+
+static void
+d2ulaw_array (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+{ unsigned int k ;
+
+ for (k = 0 ; k < count ; k++)
+ { if (ptr [index] >= 0)
+ buffer [k] = ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 4] ;
+ else
+ buffer [k] = 0x7F & ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -4] ;
index ++ ;
} ;
} /* d2ulaw_array */
--- a/common/libsndfile/src/ulaw.h
+++ /dev/null
@@ -1,27 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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.
-*/
-
-
-int ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int ulaw_read_ulaw2i (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int ulaw_read_ulaw2d (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-
-int ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int ulaw_write_i2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-int ulaw_write_d2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-
--- /dev/null
+++ b/common/libsndfile/src/voc.c
@@ -1,0 +1,376 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**
+** 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 <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "sfendian.h"
+#include "common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+# error "Cannot determine endian-ness of processor."
+#endif
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+enum
+{ VOC_TYPE_TERMINATOR = 0,
+ VOC_TYPE_SOUND_DATA = 1,
+ VOC_TYPE_SOUND_CONTINUE = 2,
+ VOC_TYPE_SILENCE = 3,
+ VOC_TYPE_MARKER = 4,
+ VOC_TYPE_ASCII = 5,
+ VOC_TYPE_REPEAT = 6,
+ VOC_TYPE_END_REPEAT = 7,
+ VOC_TYPE_EXTENDED = 8,
+ VOC_TYPE_9 = 9
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static int voc_close (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+voc_open_read (SF_PRIVATE *psf)
+{ char creative [20], type ;
+ short version ;
+
+ /* Set position to start of file to begin reading header. */
+ psf_binheader_readf (psf, "pB", 0, creative, sizeof (creative)) ;
+
+ if (creative [sizeof (creative) - 1] != 0x1A)
+ return SFE_VOC_NO_CREATIVE ;
+
+ /* Terminate the string. */
+ creative [sizeof (creative) - 1] = 0 ;
+
+ if (strcmp ("Creative Voice File", creative))
+ return SFE_VOC_NO_CREATIVE ;
+
+ psf_log_printf (psf, "%s\n", creative) ;
+
+ psf_binheader_readf (psf, "ww", &(psf->dataoffset), &version) ;
+
+ psf_log_printf (psf, "dataoffset : %d\n", psf->dataoffset) ;
+ psf_log_printf (psf, "version : %X\n", version) ;
+
+ if (version != 0x010A && version != 0x0114)
+ return SFE_VOC_BAD_VERSION ;
+
+ psf_binheader_readf (psf, "w", &version) ;
+ psf_log_printf (psf, "version 2 : %X\n", version) ;
+
+ while (1)
+ { psf_binheader_readf (psf, "b", &type) ;
+
+ switch (type)
+ { case VOC_TYPE_TERMINATOR :
+ psf_log_printf (psf, " Terminator\n") ;
+ break ;
+
+ case VOC_TYPE_SOUND_DATA :
+ { unsigned char rate_byte, compression ;
+ int size ;
+
+ psf_binheader_readf (psf, "tbb", &size, &rate_byte, &compression) ;
+
+ psf_log_printf (psf, " Sound Data : %d\n", size) ;
+ psf_log_printf (psf, " sr : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
+ psf_log_printf (psf, " comp : %d\n", compression) ;
+
+ psf_binheader_readf (psf, "j", size) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_SOUND_CONTINUE :
+ { int size ;
+
+ psf_binheader_readf (psf, "t", &size) ;
+
+ psf_log_printf (psf, " Sound Continue : %d\n", size) ;
+
+ psf_binheader_readf (psf, "j", size) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_SILENCE :
+ { unsigned char rate_byte ;
+ short length ;
+
+ psf_log_printf (psf, " Silence\n") ;
+ psf_binheader_readf (psf, "wb", &length, &rate_byte) ;
+ psf_log_printf (psf, " length : %d\n", length) ;
+ psf_log_printf (psf, " sr : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_MARKER :
+ { int size ;
+ short value ;
+
+ psf_log_printf (psf, " Marker\n") ;
+
+ psf_binheader_readf (psf, "tw", &size, &value) ;
+
+ psf_log_printf (psf, " size : %d\n", size) ;
+ psf_log_printf (psf, " value : %d\n", value) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_ASCII :
+ { int size ;
+
+ psf_binheader_readf (psf, "t", &size) ;
+
+ psf_log_printf (psf, " ASCII : %d\n", size) ;
+
+ psf_binheader_readf (psf, "B", psf->header, size) ;
+ psf->header [size] = 0 ;
+ psf_log_printf (psf, " text : %s\n", psf->header) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_REPEAT :
+ { int size ;
+ short count ;
+
+ psf_binheader_readf (psf, "tw", &size, &count) ;
+
+ psf_log_printf (psf, " Marker : %d\n", size) ;
+ psf_log_printf (psf, " value : %d\n", count) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_END_REPEAT :
+ psf_log_printf (psf, " End Repeat\n") ;
+ break ;
+
+ case VOC_TYPE_EXTENDED :
+ { unsigned char pack, mode ;
+ short rate_short ;
+ int size, sample_rate ;
+
+ psf_binheader_readf (psf, "t", &size) ;
+ psf_log_printf (psf, " Extended : %d\n", size) ;
+
+ psf_binheader_readf (psf, "wbb", &rate_short, &pack, &mode) ;
+ psf_log_printf (psf, " size : %d\n", size) ;
+ psf_log_printf (psf, " pack : %d\n", pack) ;
+ psf_log_printf (psf, " mode : %d\n", mode) ;
+
+ if (mode)
+ sample_rate = 128000000 / (65536 - rate_short) ;
+ else
+ sample_rate = 256000000 / (65536 - rate_short) ;
+
+ psf_log_printf (psf, " sr : %d => %dHz\n", (rate_short & 0xFFFF), sample_rate) ;
+ psf_binheader_readf (psf, "j", size) ;
+ } ;
+ break ;
+
+ case VOC_TYPE_9 :
+ { unsigned char bitwidth, channels, byte6 ;
+ int sample_rate, size, bytecount = 0 ;
+
+ psf_binheader_readf (psf, "t", &size) ;
+ psf_log_printf (psf, " Type 9 : %d\n", size) ;
+
+ bytecount = psf_binheader_readf (psf, "lbbb", &sample_rate, &bitwidth, &channels, &byte6) ;
+
+ psf_log_printf (psf, " sample rate : %d\n", sample_rate) ;
+ psf_log_printf (psf, " bit width : %d\n", bitwidth) ;
+ psf_log_printf (psf, " channels : %d\n", channels) ;
+
+ psf_binheader_readf (psf, "j", size - bytecount) ;
+ } ;
+ break ;
+
+ default :
+ psf_log_printf (psf, "Unknown type : %d\n", type & 0xFF) ;
+ return SFE_VOC_BAD_MARKER ;
+ } ;
+
+ if (ftell (psf->file) >= psf->filelength)
+ break ;
+ } ;
+
+
+
+ psf->sf.seekable = SF_TRUE ;
+
+ psf->close = (func_close) voc_close ;
+
+ return 0 ;
+} /* voc_open_read */
+
+int
+voc_open_write (SF_PRIVATE *psf)
+{
+
+ return 0 ;
+} /* voc_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+voc_close (SF_PRIVATE *psf)
+{
+ if (psf->mode == SF_MODE_WRITE)
+ { /* Now we know for certain the length of the file we can re-write
+ ** correct values for the FORM, 8SVX and BODY chunks.
+ */
+
+ } ;
+
+ if (psf->fdata)
+ free (psf->fdata) ;
+ psf->fdata = NULL ;
+
+ return 0 ;
+} /* voc_close */
+
+
+/*------------------------------------------------------------------------------------
+
+Creative Voice (VOC) file format
+--------------------------------
+
+~From: galt@dsd.es.com
+
+(byte numbers are hex!)
+
+ HEADER (bytes 00-19)
+ Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block]
+
+- ---------------------------------------------------------------
+
+HEADER:
+=======
+ byte # Description
+ ------ ------------------------------------------
+ 00-12 "Creative Voice File"
+ 13 1A (eof to abort printing of file)
+ 14-15 Offset of first datablock in .voc file (std 1A 00
+ in Intel Notation)
+ 16-17 Version number (minor,major) (VOC-HDR puts 0A 01)
+ 18-19 1's Comp of Ver. # + 1234h (VOC-HDR puts 29 11)
+
+- ---------------------------------------------------------------
+
+DATA BLOCK:
+===========
+
+ Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes)
+ NOTE: Terminator Block is an exception -- it has only the TYPE byte.
+
+ TYPE Description Size (3-byte int) Info
+ ---- ----------- ----------------- -----------------------
+ 00 Terminator (NONE) (NONE)
+ 01 Sound data 2+length of data *
+ 02 Sound continue length of data Voice Data
+ 03 Silence 3 **
+ 04 Marker 2 Marker# (2 bytes)
+ 05 ASCII length of string null terminated string
+ 06 Repeat 2 Count# (2 bytes)
+ 07 End repeat 0 (NONE)
+ 08 Extended 4 ***
+
+ *Sound Info Format:
+ ---------------------
+ 00 Sample Rate
+ 01 Compression Type
+ 02+ Voice Data
+
+ **Silence Info Format:
+ ----------------------------
+ 00-01 Length of silence - 1
+ 02 Sample Rate
+
+
+ ***Extended Info Format:
+ ---------------------
+ 00-01 Time Constant: Mono: 65536 - (256000000/sample_rate)
+ Stereo: 65536 - (25600000/(2*sample_rate))
+ 02 Pack
+ 03 Mode: 0 = mono
+ 1 = stereo
+
+
+ Marker# -- Driver keeps the most recent marker in a status byte
+ Count# -- Number of repetitions + 1
+ Count# may be 1 to FFFE for 0 - FFFD repetitions
+ or FFFF for endless repetitions
+ Sample Rate -- SR byte = 256-(1000000/sample_rate)
+ Length of silence -- in units of sampling cycle
+ Compression Type -- of voice data
+ 8-bits = 0
+ 4-bits = 1
+ 2.6-bits = 2
+ 2-bits = 3
+ Multi DAC = 3+(# of channels) [interesting--
+ this isn't in the developer's manual]
+
+
+---------------------------------------------------------------------------------
+Addendum submitted by Votis Kokavessis:
+
+After some experimenting with .VOC files I found out that there is a Data Block
+Type 9, which is not covered in the VOC.TXT file. Here is what I was able to discover
+about this block type:
+
+
+TYPE: 09
+SIZE: 12 + length of data
+INFO: 12 (twelve) bytes
+
+INFO STRUCTURE:
+
+Bytes 0-1: (Word) Sample Rate (e.g. 44100)
+Bytes 2-3: zero (could be that bytes 0-3 are a DWord for Sample Rate)
+Byte 4: Sample Size in bits (e.g. 16)
+Byte 5: Number of channels (e.g. 1 for mono, 2 for stereo)
+Byte 6: Unknown (equal to 4 in all files I examined)
+Bytes 7-11: zero
+
+
+-------------------------------------------------------------------------------------*/
+
--- a/common/libsndfile/src/wav.c
+++ b/common/libsndfile/src/wav.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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
@@ -21,14 +21,12 @@
#include <unistd.h>
#include <string.h>
#include <ctype.h>
+#include <time.h>
#include "sndfile.h"
#include "config.h"
#include "sfendian.h"
#include "common.h"
-#include "pcm.h"
-#include "ulaw.h"
-#include "alaw.h"
#include "wav.h"
/*------------------------------------------------------------------------------
@@ -97,22 +95,19 @@
WAVE_FORMAT_EXTENSIBLE = 0xFFFE
} ;
+#define FACT_CHUNK_SIZE sizeof (int)
+
/*------------------------------------------------------------------------------
* Macros to handle big/little endian issues.
*/
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-# error "Cannot determine endian-ness of processor."
-#endif
-
#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F'))
#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'))
@@ -122,139 +117,242 @@
#define adtl_MARKER (MAKE_MARKER ('a', 'd', 't', 'l'))
#define labl_MARKER (MAKE_MARKER ('l', 'a', 'b', 'l'))
#define note_MARKER (MAKE_MARKER ('n', 'o', 't', 'e'))
-#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't'))
#define smpl_MARKER (MAKE_MARKER ('s', 'm', 'p', 'l'))
#define bext_MARKER (MAKE_MARKER ('b', 'e', 'x', 't'))
#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 PAD_MARKER (MAKE_MARKER ('P', 'A', 'D', ' '))
+#define adtl_MARKER (MAKE_MARKER ('a', 'd', 't', 'l'))
+#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 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 IART_MARKER (MAKE_MARKER ('I', 'A', 'R', 'T'))
+#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'))
+
+
+
+enum {
+ HAVE_RIFF = 0x01,
+ HAVE_WAVE = 0x02,
+ HAVE_fmt = 0x04,
+ HAVE_fact = 0x08,
+ HAVE_PEAK = 0x10,
+ HAVE_data = 0x20
+} ;
+
/*------------------------------------------------------------------------------
* Private static functions.
*/
+static int wav_close (SF_PRIVATE *psf) ;
+
static int read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt) ;
-static int write_header (SF_PRIVATE *psf, WAV_FMT *wav_fmt, unsigned int size, int do_fact) ;
+static int wav_write_header (SF_PRIVATE *psf) ;
+static int wav_write_tailer (SF_PRIVATE *psf) ;
+static int wav_subchunk_parse (SF_PRIVATE *psf, int chunk) ;
+
static const char* wav_format_str (int k) ;
-static void le2h_wav_fmt (WAV_FMT *fmt) ;
-static void h2le_wav_fmt (WAV_FMT *fmt) ;
-
/*------------------------------------------------------------------------------
- * Public functions.
- */
+** Public functions.
+*/
-int wav_open_read (SF_PRIVATE *psf)
+int
+wav_open_read (SF_PRIVATE *psf)
{ WAV_FMT wav_fmt ;
FACT_CHUNK fact_chunk ;
unsigned int dword, marker, RIFFsize ;
int parsestage = 0, error, format = 0 ;
+ char *cptr ;
- psf->sf.seekable = SF_TRUE ;
-
+ /* Set position to start of file to begin reading header. */
+ psf_binheader_readf (psf, "p", 0) ;
+
while (1)
- { fread (&marker, sizeof (marker), 1, psf->file) ;
+ { psf_binheader_readf (psf, "m", &marker) ;
switch (marker)
{ case RIFF_MARKER :
- if (parsestage != 0)
+ if (parsestage)
return SFE_WAV_NO_RIFF ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- RIFFsize = LE2H_INT (dword) ;
+
+ psf_binheader_readf (psf, "l", &RIFFsize) ;
+
if (psf->filelength < RIFFsize + 2 * sizeof (dword))
{ dword = psf->filelength - 2 * sizeof (dword);
- psf_sprintf (psf, "RIFF : %d (should be %d)\n", RIFFsize, dword) ;
+ psf_log_printf (psf, "RIFF : %d (should be %d)\n", RIFFsize, dword) ;
RIFFsize = dword ;
}
else
- psf_sprintf (psf, "RIFF : %d\n", RIFFsize) ;
- parsestage = 1 ;
+ psf_log_printf (psf, "RIFF : %d\n", RIFFsize) ;
+ parsestage |= HAVE_RIFF ;
break ;
case WAVE_MARKER :
- if (parsestage != 1)
+ if ((parsestage & HAVE_RIFF) != HAVE_RIFF)
return SFE_WAV_NO_WAVE ;
- psf_sprintf (psf, "WAVE\n") ;
- parsestage = 2 ;
+ psf_log_printf (psf, "WAVE\n") ;
+ parsestage |= HAVE_WAVE ;
break ;
case fmt_MARKER :
- if (parsestage != 2)
+ if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE))
return SFE_WAV_NO_FMT ;
if ((error = read_fmt_chunk (psf, &wav_fmt)))
return error ;
format = wav_fmt.format ;
- parsestage = 3 ;
+ parsestage |= HAVE_fmt ;
break ;
case data_MARKER :
- if (parsestage < 3)
+ if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
return SFE_WAV_NO_DATA ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- psf->datalength = LE2H_INT (dword) ;
+
+ psf_binheader_readf (psf, "l", &(psf->datalength)) ;
+
psf->dataoffset = ftell (psf->file) ;
if (psf->filelength < psf->dataoffset + psf->datalength)
- { psf_sprintf (psf, "data : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
+ { psf_log_printf (psf, "data : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
psf->datalength = psf->filelength - psf->dataoffset ;
}
else
- psf_sprintf (psf, "data : %d\n", psf->datalength) ;
+ psf_log_printf (psf, "data : %d\n", psf->datalength) ;
if (format == WAVE_FORMAT_MS_ADPCM && psf->datalength % 2)
{ psf->datalength ++ ;
- psf_sprintf (psf, "*** Data length odd. Increasing it by 1.\n") ;
+ psf_log_printf (psf, "*** Data length odd. Increasing it by 1.\n") ;
} ;
+ parsestage |= HAVE_data ;
+
+ if (! psf->sf.seekable)
+ break ;
+
+ /* Seek past data and continue reading header. */
fseek (psf->file, psf->datalength, SEEK_CUR) ;
+
dword = ftell (psf->file) ;
- if (dword != (off_t) (psf->dataoffset + psf->datalength))
- psf_sprintf (psf, "*** fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
+ if (dword != (long) (psf->dataoffset + psf->datalength))
+ psf_log_printf (psf, "*** fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
break ;
case fact_MARKER :
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = LE2H_INT (dword) ;
- fread (&fact_chunk, sizeof (fact_chunk), 1, psf->file) ;
+ if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+ return SFE_WAV_BAD_FACT ;
+
+ psf_binheader_readf (psf, "ll", &dword, &(fact_chunk.samples)) ;
+
if (dword > sizeof (fact_chunk))
- fseek (psf->file, (int) (dword - sizeof (fact_chunk)), SEEK_CUR) ;
- fact_chunk.samples = LE2H_INT (fact_chunk.samples) ;
- psf_sprintf (psf, "%D : %d\n", marker, dword) ;
- psf_sprintf (psf, " samples : %d\n", fact_chunk.samples) ;
+ psf_binheader_readf (psf, "j", (int) (dword - sizeof (fact_chunk))) ;
+
+ psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+ psf_log_printf (psf, " samples : %d\n", fact_chunk.samples) ;
+ parsestage |= HAVE_fact ;
break ;
- case cue_MARKER :
- case LIST_MARKER :
+ case PEAK_MARKER :
+ if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+ return SFE_WAV_PEAK_B4_FMT ;
+
+ psf_binheader_readf (psf, "l", &dword) ;
+
+ psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+ if (dword > sizeof (psf->peak))
+ { psf_binheader_readf (psf, "j", dword) ;
+ psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
+ return SFE_WAV_BAD_PEAK ;
+ } ;
+ if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+ { psf_binheader_readf (psf, "j", dword) ;
+ psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
+ return SFE_WAV_BAD_PEAK ;
+ } ;
+
+ psf_binheader_readf (psf, "ll", &(psf->peak.version), &(psf->peak.timestamp)) ;
+
+ if (psf->peak.version != 1)
+ psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak.version) ;
+ else
+ psf_log_printf (psf, " version : %d\n", psf->peak.version) ;
+
+ psf_log_printf (psf, " time stamp : %d\n", psf->peak.timestamp) ;
+ psf_log_printf (psf, " Ch Position Value\n") ;
+
+ cptr = (char *) psf->buffer ;
+ for (dword = 0 ; dword < psf->sf.channels ; dword++)
+ { psf_binheader_readf (psf, "fl", &(psf->peak.peak[dword].value),
+ &(psf->peak.peak[dword].position)) ;
+
+ snprintf (cptr, sizeof (psf->buffer), " %2d %-12d %g\n",
+ dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
+ cptr [sizeof (psf->buffer) - 1] = 0 ;
+ psf_log_printf (psf, cptr) ;
+ };
+
+ psf->has_peak = SF_TRUE ;
+ break ;
+
case INFO_MARKER :
- case smpl_MARKER :
+ case LIST_MARKER :
+ psf_log_printf (psf, "%D\n", marker) ;
+ if ((error = wav_subchunk_parse (psf, marker)))
+ return error ;
+ break ;
+
case bext_MARKER :
- case MEXT_MARKER :
+ case cue_MARKER :
case DISP_MARKER :
- fread (&dword, sizeof (dword), 1, psf->file) ;
- dword = LE2H_INT (dword) ;
- psf_sprintf (psf, "%D : %d\n", marker, dword) ;
- fseek (psf->file, (int) dword, SEEK_CUR) ;
+ case MEXT_MARKER :
+ psf_binheader_readf (psf, "l", &dword);
+ psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+ dword += (dword & 1) ;
+ psf_binheader_readf (psf, "j", dword) ;
break ;
+ case smpl_MARKER :
+ case acid_MARKER :
+ case PAD_MARKER :
+ psf_binheader_readf (psf, "l", &dword);
+ psf_log_printf (psf, " *** %D : %d\n", marker, dword) ;
+ dword += (dword & 1) ;
+ psf_binheader_readf (psf, "j", dword) ;
+ break ;
+
+
default :
if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
- { fread (&dword, sizeof (dword), 1, psf->file) ;
- psf_sprintf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
- fseek (psf->file, (int) dword, SEEK_CUR) ;
+ { psf_binheader_readf (psf, "l", &dword);
+ psf_log_printf (psf, "*** %D : %d (unknown marker)\n", marker, dword) ;
+
+ psf_binheader_readf (psf, "j", dword);
break ;
} ;
- if ((dword = ftell (psf->file)) & 0x03)
- { psf_sprintf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
- fseek (psf->file, -3, SEEK_CUR) ;
+ if (ftell (psf->file) & 0x03)
+ { psf_log_printf (psf, " Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+ psf_binheader_readf (psf, "j", -3) ;
break ;
} ;
- psf_sprintf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+ psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
break ;
} ; /* switch (dword) */
+ if (! psf->sf.seekable && (parsestage & HAVE_data))
+ break ;
+
if (ferror (psf->file))
- { psf_sprintf (psf, "*** Error on file handle. ***\n", marker) ;
+ { psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
clearerr (psf->file) ;
break ;
} ;
@@ -284,94 +382,22 @@
switch (format)
{ case WAVE_FORMAT_PCM :
case WAVE_FORMAT_EXTENSIBLE :
- break ;
-
- case WAVE_FORMAT_MULAW :
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
- psf->read_short = (func_short) ulaw_read_ulaw2s ;
- psf->read_int = (func_int) ulaw_read_ulaw2i ;
- psf->read_double = (func_double) ulaw_read_ulaw2d ;
- return 0 ;
+ psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
+ if (psf->bytewidth == 1)
+ psf->chars = SF_CHARS_UNSIGNED ;
- case WAVE_FORMAT_ALAW :
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
- psf->read_short = (func_short) alaw_read_alaw2s ;
- psf->read_int = (func_int) alaw_read_alaw2i ;
- psf->read_double = (func_double) alaw_read_alaw2d ;
- return 0 ;
-
- case WAVE_FORMAT_MS_ADPCM :
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
- if ((error = msadpcm_reader_init (psf, &wav_fmt)))
+ if ((error = pcm_read_init (psf)))
return error ;
- psf->read_short = (func_short) msadpcm_read_s ;
- psf->read_int = (func_int) msadpcm_read_i ;
- psf->read_double = (func_double) msadpcm_read_d ;
- psf->seek_func = (func_seek) msadpcm_seek ;
return 0 ;
-
- case WAVE_FORMAT_IMA_ADPCM :
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
- if ((error = wav_ima_reader_init (psf, &wav_fmt)))
- return error ;
- psf->read_short = (func_short) ima_read_s ;
- psf->read_int = (func_int) ima_read_i ;
- psf->read_double = (func_double) ima_read_d ;
- psf->seek_func = (func_seek) ima_seek ;
- return 0 ;
-
- case WAVE_FORMAT_GSM610 :
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
- if ((error = wav_gsm610_reader_init (psf, &wav_fmt)))
- return error ;
- psf->read_short = (func_short) wav_gsm610_read_s ;
- psf->read_int = (func_int) wav_gsm610_read_i ;
- psf->read_double = (func_double) wav_gsm610_read_d ;
- psf->seek_func = NULL ; /* Not seekable */
- return 0 ;
-
+
case WAVE_FORMAT_IEEE_FLOAT :
psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
- if (CAN_READ_WRITE_x86_IEEE)
- { psf->read_short = (func_short) pcm_read_f2s ;
- psf->read_int = (func_int) pcm_read_f2i ;
- psf->read_double = (func_double) pcm_read_f2d ;
- }
- else
- { psf->read_short = (func_short) wav_read_x86f2s ;
- psf->read_int = (func_int) wav_read_x86f2i ;
- psf->read_double = (func_double) wav_read_x86f2d ;
- } ;
+ float32_read_init (psf) ;
return 0 ;
default : return SFE_UNIMPLEMENTED ;
} ;
- psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
- switch (psf->bytewidth)
- { case 1 :
- psf->read_short = (func_short) pcm_read_uc2s ;
- psf->read_int = (func_int) pcm_read_uc2i ;
- psf->read_double = (func_double) pcm_read_uc2d ;
- break ;
- case 2 :
- psf->read_short = (func_short) pcm_read_les2s ;
- psf->read_int = (func_int) pcm_read_les2i ;
- psf->read_double = (func_double) pcm_read_les2d ;
- break ;
- case 3 :
- psf->read_short = (func_short) pcm_read_let2s ;
- psf->read_int = (func_int) pcm_read_let2i ;
- psf->read_double = (func_double) pcm_read_let2d ;
- break ;
- case 4 :
- psf->read_short = (func_short) pcm_read_lei2s ;
- psf->read_int = (func_int) pcm_read_lei2i ;
- psf->read_double = (func_double) pcm_read_lei2d ;
- break ;
- default : return SFE_UNIMPLEMENTED ;
- } ;
-
return 0 ;
} /* wav_open_read */
@@ -378,9 +404,9 @@
/*------------------------------------------------------------------------------
*/
-int wav_open_write (SF_PRIVATE *psf)
-{ WAV_FMT wav_fmt ;
- unsigned int dword, subformat ;
+int
+wav_open_write (SF_PRIVATE *psf)
+{ unsigned int subformat ;
int error ;
if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV)
@@ -398,207 +424,18 @@
psf->blockwidth = psf->bytewidth * psf->sf.channels ;
- wav_fmt.min.channels = psf->sf.channels ;
- wav_fmt.min.samplerate = psf->sf.samplerate ;
- wav_fmt.min.bytespersec = psf->sf.samplerate * psf->bytewidth * psf->sf.channels ;
- wav_fmt.min.blockalign = psf->bytewidth * psf->sf.channels ;
- wav_fmt.min.bitwidth = psf->sf.pcmbitwidth ;
+ /* Set sample count artifically high and fix later. */
+ psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ;
+ psf->datalength = psf->blockwidth * psf->sf.samples ;
+ psf->filelength = 0x7FFFFFFF ;
+ /* Set standard wav_close and write_header now, may be overridden in wav_write_header. */
+ psf->close = (func_close) wav_close ;
+ psf->write_header = (func_wr_hdr) wav_write_header ;
- switch (psf->sf.format & SF_FORMAT_SUBMASK)
- { case SF_FORMAT_PCM :
- wav_fmt.format = WAVE_FORMAT_PCM ;
+ if ((error = wav_write_header (psf)))
+ return error ;
- psf->dataoffset = 7 * sizeof (dword) + sizeof (MIN_WAV_FMT) ;
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (MIN_WAV_FMT), 0) ;
- break ;
-
- case SF_FORMAT_FLOAT :
- wav_fmt.format = WAVE_FORMAT_IEEE_FLOAT ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (MIN_WAV_FMT) + sizeof (FACT_CHUNK) ;
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (MIN_WAV_FMT), 1) ;
- break ;
-
- case SF_FORMAT_ULAW :
- wav_fmt.format = WAVE_FORMAT_MULAW ;
-
- wav_fmt.size20.bitwidth = 8 ;
- wav_fmt.size20.extrabytes = 2 ;
- wav_fmt.size20.dummy = 0 ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (WAV_FMT_SIZE20) + sizeof (FACT_CHUNK) ;
-
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (WAV_FMT_SIZE20), 1) ;
- break ;
-
- case SF_FORMAT_ALAW :
- wav_fmt.format = WAVE_FORMAT_ALAW ;
-
- wav_fmt.size20.bitwidth = 8 ;
- wav_fmt.size20.extrabytes = 2 ;
- wav_fmt.size20.dummy = 0 ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (WAV_FMT_SIZE20) + sizeof (FACT_CHUNK) ;
-
- psf->datalength = psf->blockwidth * psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (WAV_FMT_SIZE20), 1) ;
- break ;
-
- case SF_FORMAT_IMA_ADPCM :
- wav_fmt.format = WAVE_FORMAT_IMA_ADPCM ;
- if ((error = wav_ima_writer_init (psf, &wav_fmt)))
- return error ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (IMA_ADPCM_WAV_FMT) + sizeof (FACT_CHUNK) ;
- if (psf->sf.samples % wav_fmt.ima.samplesperblock)
- psf->datalength = ((psf->sf.samples / wav_fmt.ima.samplesperblock) + 1) * wav_fmt.ima.samplesperblock ;
- else
- psf->datalength = psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (IMA_ADPCM_WAV_FMT), 1) ;
- break ;
-
- case SF_FORMAT_MS_ADPCM :
- wav_fmt.format = WAVE_FORMAT_MS_ADPCM ;
- msadpcm_writer_init (psf, &wav_fmt) ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (MS_ADPCM_WAV_FMT) + sizeof (FACT_CHUNK) ;
- if (psf->sf.samples % wav_fmt.msadpcm.samplesperblock)
- psf->datalength = ((psf->sf.samples / wav_fmt.msadpcm.samplesperblock) + 1) * wav_fmt.msadpcm.samplesperblock ;
- else
- psf->datalength = psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (MS_ADPCM_WAV_FMT), 1) ;
- break ;
-
- case SF_FORMAT_GSM610 :
- wav_fmt.format = WAVE_FORMAT_GSM610 ;
- wav_gsm610_writer_init (psf, &wav_fmt) ;
-
- psf->dataoffset = 9 * sizeof (dword) + sizeof (GSM610_WAV_FMT) + sizeof (FACT_CHUNK) ;
- if (psf->sf.samples % wav_fmt.gsm610.samplesperblock)
- psf->datalength = ((psf->sf.samples / wav_fmt.gsm610.samplesperblock) + 1) * wav_fmt.gsm610.samplesperblock ;
- else
- psf->datalength = psf->sf.samples ;
- psf->filelength = psf->datalength + psf->dataoffset ;
-
- write_header (psf, &wav_fmt, sizeof (GSM610_WAV_FMT), 1) ;
- break ;
-
- default : return SFE_UNIMPLEMENTED ;
- } ;
-
-
- dword = data_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- dword = H2LE_INT (psf->datalength) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- psf->close = (func_close) wav_close ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
- if (CAN_READ_WRITE_x86_IEEE)
- { psf->write_short = (func_short) pcm_write_s2f ;
- psf->write_int = (func_int) pcm_write_i2f ;
- psf->write_double = (func_double) pcm_write_d2f ;
- }
- else
- { psf->write_short = (func_short) wav_write_s2x86f ;
- psf->write_int = (func_int) wav_write_i2x86f ;
- psf->write_double = (func_double) wav_write_d2x86f ;
- } ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_IMA_ADPCM)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
- psf->write_short = (func_short) ima_write_s ;
- psf->write_int = (func_int) ima_write_i ;
- psf->write_double = (func_double) ima_write_d ;
- psf->seek_func = (func_seek) ima_seek ;
- psf->close = (func_close) wav_ima_close ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_MS_ADPCM)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
- psf->write_short = (func_short) msadpcm_write_s ;
- psf->write_int = (func_int) msadpcm_write_i ;
- psf->write_double = (func_double) msadpcm_write_d ;
- psf->seek_func = (func_seek) msadpcm_seek ;
- psf->close = (func_close) msadpcm_close ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
- psf->write_short = (func_short) wav_gsm610_write_s ;
- psf->write_int = (func_int) wav_gsm610_write_i ;
- psf->write_double = (func_double) wav_gsm610_write_d ;
- psf->seek_func = NULL ; /* Not seekable */
- psf->close = (func_close) wav_gsm610_close ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_ULAW)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
- psf->write_short = (func_short) ulaw_write_s2ulaw ;
- psf->write_int = (func_int) ulaw_write_i2ulaw ;
- psf->write_double = (func_double) ulaw_write_d2ulaw ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_ALAW)
- { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
- psf->write_short = (func_short) alaw_write_s2alaw ;
- psf->write_int = (func_int) alaw_write_i2alaw ;
- psf->write_double = (func_double) alaw_write_d2alaw ;
- return 0 ;
- } ;
-
- if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
- return SFE_UNIMPLEMENTED ;
-
- switch (psf->bytewidth)
- { case 1 :
- psf->write_short = (func_short) pcm_write_s2uc ;
- psf->write_int = (func_int) pcm_write_i2uc ;
- psf->write_double = (func_double) pcm_write_d2uc ;
- break ;
- case 2 :
- psf->write_short = (func_short) pcm_write_s2les ;
- psf->write_int = (func_int) pcm_write_i2les ;
- psf->write_double = (func_double) pcm_write_d2les ;
- break ;
- case 3 :
- psf->write_short = (func_short) pcm_write_s2let ;
- psf->write_int = (func_int) pcm_write_i2let ;
- psf->write_double = (func_double) pcm_write_d2let ;
- break ;
- case 4 :
- psf->write_short = (func_short) pcm_write_s2lei ;
- psf->write_int = (func_int) pcm_write_i2lei ;
- psf->write_double = (func_double) pcm_write_d2lei ;
- break ;
- default : return SFE_UNIMPLEMENTED ;
- } ;
-
return 0 ;
} /* wav_open_write */
@@ -605,9 +442,9 @@
/*------------------------------------------------------------------------------
*/
-int wav_close (SF_PRIVATE *psf)
-{ unsigned int dword ;
-
+static int
+wav_close (SF_PRIVATE *psf)
+{
if (psf->mode == SF_MODE_WRITE)
{ /* Now we know for certain the length of the file we can
* re-write correct values for the RIFF and data chunks.
@@ -614,18 +451,17 @@
*/
fseek (psf->file, 0, SEEK_END) ;
- psf->filelength = ftell (psf->file) ;
+ psf->tailstart = ftell (psf->file) ;
+ wav_write_tailer (psf) ;
- /* Fix RIFF size. */
- dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
- fseek (psf->file, sizeof (dword), SEEK_SET) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+ fseek (psf->file, 0, SEEK_END) ;
+ psf->filelength = ftell (psf->file) ;
+ fseek (psf->file, 0, SEEK_SET) ;
- psf->datalength = psf->filelength - psf->dataoffset ;
- psf->sf.samples = psf->datalength / (psf->sf.channels * psf->bytewidth) ;
- fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
- dword = H2LE_INT (psf->datalength) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+ psf->datalength = psf->filelength - psf->dataoffset - (psf->filelength - psf->tailstart) ;
+ psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+
+ wav_write_header (psf) ;
} ;
if (psf->fdata)
@@ -635,40 +471,41 @@
return 0 ;
} /* wav_close */
-
/*=========================================================================
- * Private functions.
- */
+** Private functions.
+*/
-static
-int read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt)
-{ unsigned int dword, bytesread, k, structsize, bytespersec = 0 ;
+static int
+read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt)
+{ unsigned int bytesread, k, structsize, bytespersec = 0 ;
memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
- bytesread = 0 ;
- fread (&dword, sizeof (dword), 1, psf->file) ;
- structsize = LE2H_INT (dword) ;
+ psf_binheader_readf (psf, "l", &structsize) ;
- psf_sprintf (psf, "fmt : %d\n", structsize) ;
+ psf_log_printf (psf, "fmt : %d\n", structsize) ;
if (structsize < 16)
return SFE_WAV_FMT_SHORT ;
if (structsize > sizeof (WAV_FMT))
return SFE_WAV_FMT_TOO_BIG ;
-
- fread (wav_fmt, structsize, 1, psf->file) ;
- bytesread += structsize ;
- if (CPU_IS_BIG_ENDIAN)
- le2h_wav_fmt (wav_fmt) ;
- psf_sprintf (psf, " Format : 0x%X => %s\n", wav_fmt->format, wav_format_str (wav_fmt->format)) ;
- psf_sprintf (psf, " Channels : %d\n", wav_fmt->min.channels) ;
- psf_sprintf (psf, " Sample Rate : %d\n", wav_fmt->min.samplerate) ;
- psf_sprintf (psf, " Block Align : %d\n", wav_fmt->min.blockalign) ;
- psf_sprintf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ;
-
+ /* Read the minimal WAV file header here. */
+ bytesread =
+ psf_binheader_readf (psf, "wwllww", &(wav_fmt->format), &(wav_fmt->min.channels),
+ &(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec),
+ &(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth)) ;
+ psf_log_printf (psf, " Format : 0x%X => %s\n", wav_fmt->format, wav_format_str (wav_fmt->format)) ;
+ psf_log_printf (psf, " Channels : %d\n", wav_fmt->min.channels) ;
+ psf_log_printf (psf, " Sample Rate : %d\n", wav_fmt->min.samplerate) ;
+ psf_log_printf (psf, " Block Align : %d\n", wav_fmt->min.blockalign) ;
+
+ if (wav_fmt->format == WAVE_FORMAT_GSM610 && wav_fmt->min.bitwidth != 0)
+ psf_log_printf (psf, " Bit Width : %d (should be 0)\n", wav_fmt->min.bitwidth) ;
+ else
+ psf_log_printf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ;
+
psf->sf.samplerate = wav_fmt->min.samplerate ;
psf->sf.samples = 0 ; /* Correct this when reading data chunk. */
psf->sf.channels = wav_fmt->min.channels ;
@@ -678,247 +515,220 @@
case WAVE_FORMAT_IEEE_FLOAT :
bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
if (wav_fmt->min.bytespersec != bytespersec)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+ psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
else
- psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ;
+ psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ;
psf->sf.pcmbitwidth = wav_fmt->min.bitwidth ;
psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
break ;
- case WAVE_FORMAT_ALAW :
- case WAVE_FORMAT_MULAW :
- if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
+ case WAVE_FORMAT_EXTENSIBLE :
+ if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
+ 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_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ;
+ psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ;
- psf->sf.pcmbitwidth = 16 ;
- psf->bytewidth = 1 ;
- if (structsize >= 18)
- psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->size20.extrabytes) ;
- break ;
+ bytesread +=
+ psf_binheader_readf (psf, "wwl", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
+ &(wav_fmt->ext.channelmask)) ;
- case WAVE_FORMAT_MS_ADPCM :
- if (wav_fmt->msadpcm.bitwidth != 4)
- return SFE_WAV_ADPCM_NOT4BIT ;
- if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2)
- return SFE_WAV_ADPCM_CHANNELS ;
+ psf_log_printf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ;
+ psf_log_printf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ;
- bytespersec = (wav_fmt->msadpcm.samplerate * wav_fmt->msadpcm.blockalign) / wav_fmt->msadpcm.samplesperblock ;
- if (wav_fmt->min.bytespersec == bytespersec)
- psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ;
- else if (wav_fmt->min.bytespersec == (wav_fmt->msadpcm.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->msadpcm.blockalign)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ;
- else
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+ bytesread +=
+ psf_binheader_readf (psf, "lww", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2),
+ &(wav_fmt->ext.esf.esf_field3)) ;
- psf->sf.pcmbitwidth = 16 ;
- psf->bytewidth = 2 ;
- psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->msadpcm.extrabytes) ;
- psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ;
- if (wav_fmt->msadpcm.numcoeffs > sizeof (MS_ADPCM_WAV_FMT) / sizeof (int))
- { psf_sprintf (psf, " No. of Coeffs : %d ****\n", wav_fmt->msadpcm.numcoeffs) ;
- wav_fmt->msadpcm.numcoeffs = sizeof (MS_ADPCM_WAV_FMT) / sizeof (int) ;
- }
- else
- psf_sprintf (psf, " No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ;
- psf_sprintf (psf, " Coeff 1 : ") ;
- for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
- psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff1) ;
- psf_sprintf (psf, "\n Coeff 2 : ") ;
- for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
- psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff2) ;
- psf_sprintf (psf, "\n") ;
- break ;
-
- case WAVE_FORMAT_IMA_ADPCM :
- if (wav_fmt->ima.bitwidth != 4)
- return SFE_WAV_ADPCM_NOT4BIT ;
- if (wav_fmt->ima.channels < 1 || wav_fmt->ima.channels > 2)
- return SFE_WAV_ADPCM_CHANNELS ;
-
- bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
- if (wav_fmt->ima.bytespersec != bytespersec)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ;
- else
- psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->ima.bytespersec) ;
-
- psf->sf.pcmbitwidth = 16 ;
- psf->bytewidth = 2 ;
- psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->ima.extrabytes) ;
- psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
- break ;
-
- case WAVE_FORMAT_EXTENSIBLE :
- if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
- else
- psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ;
-
- psf_sprintf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ;
- psf_sprintf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ;
- psf_sprintf (psf, " Subformat\n") ;
- psf_sprintf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ;
- psf_sprintf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ;
- psf_sprintf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ;
- psf_sprintf (psf, " esf_field4 : ") ;
+ psf_log_printf (psf, " Subformat\n") ;
+ psf_log_printf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ;
+ psf_log_printf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ;
+ psf_log_printf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ;
+ psf_log_printf (psf, " esf_field4 : ") ;
for (k = 0 ; k < 8 ; k++)
- psf_sprintf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
- psf_sprintf (psf, "\n") ;
+ { bytesread += psf_binheader_readf (psf, "b", &(wav_fmt->ext.esf.esf_field4 [k])) ;
+ psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
+ } ;
+ psf_log_printf (psf, "\n") ;
psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ;
psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
break ;
- case WAVE_FORMAT_GSM610 :
- if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65)
- return SFE_WAV_GSM610_FORMAT ;
-
- if (wav_fmt->gsm610.samplesperblock != 320)
- return SFE_WAV_GSM610_FORMAT ;
-
- bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ;
- if (wav_fmt->gsm610.bytespersec != bytespersec)
- psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ;
- else
- psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->gsm610.bytespersec) ;
-
- psf->sf.pcmbitwidth = 16 ;
- psf->bytewidth = 2 ;
- psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->gsm610.extrabytes) ;
- psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ;
- break ;
default : break ;
} ;
-
+
+ if (bytesread > structsize)
+ { psf_log_printf (psf, "*** read_fmt_chunk (bytesread > structsize)\n") ;
+ return SFE_WAV_FMT_SHORT ;
+ }
+ else
+ fread (psf->buffer, 1, structsize - bytesread, psf->file) ;
+
psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
return 0 ;
} /* read_fmt_chunk */
-static
-int write_header (SF_PRIVATE *psf, WAV_FMT *wav_fmt, unsigned int size, int do_fact)
-{ FACT_CHUNK fact_chunk ;
- unsigned int dword, RIFFsize ;
+static int
+wav_write_header (SF_PRIVATE *psf)
+{ unsigned int fmt_size ;
+ int k, error, subformat ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
- RIFFsize = psf->filelength - 2 * sizeof (dword) ;
+ /* RIFF marker, length, WAVE and 'fmt ' markers. */
+ psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
- dword = RIFF_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = H2LE_INT (RIFFsize) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+ subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+ switch (subformat)
+ { case SF_FORMAT_PCM :
+ psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
+
+ if (psf->bytewidth == 1)
+ psf->chars = SF_CHARS_UNSIGNED ;
- dword = WAVE_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = fmt_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
- dword = H2LE_INT (size) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- if (CPU_IS_BIG_ENDIAN)
- h2le_wav_fmt (wav_fmt) ;
- fwrite (wav_fmt, size, 1, psf->file) ;
-
- if (do_fact)
- { dword = fact_MARKER ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- dword = H2LE_INT (sizeof (FACT_CHUNK)) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
- fact_chunk.samples = H2LE_INT (psf->sf.samples) ;
- fwrite (&fact_chunk, sizeof (fact_chunk), 1, psf->file) ;
+ if ((error = pcm_write_init (psf)))
+ return error ;
+
+ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+ /* fmt : format, channels, samplerate */
+ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+ /* fmt : bytespersec */
+ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+ /* fmt : blockalign, bitwidth */
+ psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+ break ;
+
+ case SF_FORMAT_FLOAT :
+ psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
+
+ /* Add the peak chunk to floating point files. */
+ psf->has_peak = SF_TRUE ;
+ psf->peak_loc = SF_PEAK_START ;
+ float32_write_init (psf) ;
+
+ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+ /* fmt : format, channels, samplerate */
+ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+ /* fmt : bytespersec */
+ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+ /* fmt : blockalign, bitwidth */
+ psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+
+ /* Write 'fact' chunk. */
+ psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ;
+ break ;
+
+ default : return SFE_UNIMPLEMENTED ;
} ;
+ if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
+ { psf_binheader_writef (psf, "ml", PEAK_MARKER,
+ sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+ psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+ for (k = 0 ; k < psf->sf.channels ; k++)
+ psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ;
+ } ;
+
+ psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
return 0 ;
-} /* write_header */
+} /* wav_write_header */
-static
-void le2h_wav_fmt (WAV_FMT *fmt)
+static int
+wav_write_tailer (SF_PRIVATE *psf)
{ int k ;
- fmt->min.format = ENDSWAP_SHORT (fmt->min.format) ;
- fmt->min.channels = ENDSWAP_SHORT (fmt->min.channels) ;
- fmt->min.samplerate = ENDSWAP_INT (fmt->min.samplerate) ;
- fmt->min.bytespersec = ENDSWAP_INT (fmt->min.bytespersec) ;
- fmt->min.blockalign = ENDSWAP_SHORT (fmt->min.blockalign) ;
- fmt->min.bitwidth = ENDSWAP_SHORT (fmt->min.bitwidth) ;
+ /* Reset the current header buffer length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_END) ;
- switch (fmt->format)
- { case WAVE_FORMAT_MS_ADPCM :
- fmt->msadpcm.extrabytes = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ;
- fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ;
- fmt->msadpcm.numcoeffs = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ;
- for (k = 0 ; k < fmt->msadpcm.numcoeffs ; k++)
- { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ;
- fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ;
- } ;
- break ;
-
- case WAVE_FORMAT_IMA_ADPCM :
- fmt->ima.extrabytes = ENDSWAP_SHORT (fmt->ima.extrabytes) ;
- fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ;
- break ;
-
- case WAVE_FORMAT_ALAW :
- case WAVE_FORMAT_MULAW :
- fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ;
- fmt->size20.dummy = ENDSWAP_SHORT (fmt->size20.dummy) ;
- break ;
-
- case WAVE_FORMAT_GSM610 :
- fmt->gsm610.extrabytes = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ;
- fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ;
- break ;
-
- default : break ;
+ if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
+ { psf_binheader_writef (psf, "ml", PEAK_MARKER,
+ sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+ psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+ for (k = 0 ; k < psf->sf.channels ; k++)
+ psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
} ;
-} /* le2h_wav_fmt */
+ if (psf->headindex > 0)
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
-static
-void h2le_wav_fmt (WAV_FMT *fmt)
-{ int k ;
+ return 0 ;
+} /* wav_write_tailer */
- switch (fmt->format)
- { case WAVE_FORMAT_MS_ADPCM :
- for (k = 0 ; k < fmt->msadpcm.numcoeffs ; k++)
- { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ;
- fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ;
- } ;
- fmt->msadpcm.numcoeffs = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ;
- fmt->msadpcm.extrabytes = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ;
- fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ;
- break ;
-
- case WAVE_FORMAT_IMA_ADPCM :
- fmt->ima.extrabytes = ENDSWAP_SHORT (fmt->ima.extrabytes) ;
- fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ;
- break ;
-
- case WAVE_FORMAT_ALAW :
- case WAVE_FORMAT_MULAW :
- fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ;
- fmt->size20.dummy = ENDSWAP_SHORT (fmt->size20.dummy) ;
- break ;
-
- case WAVE_FORMAT_GSM610 :
- fmt->gsm610.extrabytes = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ;
- fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ;
- break ;
-
- default : break ;
- } ;
+static int
+wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
+{ unsigned int dword, bytesread, length ;
- fmt->min.format = ENDSWAP_SHORT (fmt->min.format) ;
- fmt->min.channels = ENDSWAP_SHORT (fmt->min.channels) ;
- fmt->min.samplerate = ENDSWAP_INT (fmt->min.samplerate) ;
- fmt->min.bytespersec = ENDSWAP_INT (fmt->min.bytespersec) ;
- fmt->min.blockalign = ENDSWAP_SHORT (fmt->min.blockalign) ;
- fmt->min.bitwidth = ENDSWAP_SHORT (fmt->min.bitwidth) ;
+ bytesread = psf_binheader_readf (psf, "l", &length);
-} /* h2le_wav_fmt */
+ while (bytesread < length)
+ { bytesread += psf_binheader_readf (psf, "m", &chunk);
-static
-const char* wav_format_str (int k)
+ switch (chunk)
+ { case adtl_MARKER :
+ case INFO_MARKER :
+ /* These markers don't contain anything. */
+ psf_log_printf (psf, " %D\n", chunk) ;
+ break ;
+
+
+ case IART_MARKER :
+ case ICMT_MARKER :
+ case ICOP_MARKER :
+ case ICRD_MARKER :
+ case IENG_MARKER :
+
+ case INAM_MARKER :
+ case IPRD_MARKER :
+ case ISBJ_MARKER :
+ case ISFT_MARKER :
+ case ISRC_MARKER :
+ bytesread += psf_binheader_readf (psf, "l", &dword);
+ dword += (dword & 1) ;
+ if (dword > sizeof (psf->buffer))
+ { psf_log_printf (psf, " *** %D : %d (too big)\n", chunk, dword) ;
+ return SFE_INTERNAL ;
+ } ;
+ bytesread += psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+ psf->buffer [dword - 1] = 0 ;
+ psf_log_printf (psf, " %D : %s\n", chunk, psf->buffer) ;
+ break ;
+
+ case labl_MARKER :
+ case note_MARKER :
+ bytesread += psf_binheader_readf (psf, "l", &dword);
+ dword += (dword & 1) ;
+ psf_binheader_readf (psf, "j", dword) ;
+ bytesread += dword ;
+ psf_log_printf (psf, " %D : %d\n", chunk, dword) ;
+ break ;
+
+ default :
+ bytesread += psf_binheader_readf (psf, "l", &dword);
+ dword += (dword & 1) ;
+ bytesread += psf_binheader_readf (psf, "j", dword) ;
+ psf_log_printf (psf, " *** %D : %d\n", chunk, dword) ;
+ break ;
+ } ;
+ } ;
+
+ return 0 ;
+} /* wav_subchunk_parse */
+
+static char const*
+wav_format_str (int k)
{ switch (k)
{ case WAVE_FORMAT_UNKNOWN :
return "WAVE_FORMAT_UNKNOWN" ;
--- a/common/libsndfile/src/wav.h
+++ b/common/libsndfile/src/wav.h
@@ -14,7 +14,7 @@
unsigned short bitwidth ;
} MIN_WAV_FMT ;
-typedef struct
+typedef struct
{ unsigned short format ;
unsigned short channels ;
unsigned int samplerate ;
@@ -52,6 +52,17 @@
unsigned short samplesperblock ;
} IMA_ADPCM_WAV_FMT ;
+typedef struct
+{ unsigned short format ;
+ unsigned short channels ;
+ unsigned int samplerate ;
+ unsigned int bytespersec ;
+ unsigned short blockalign ;
+ unsigned short bitwidth ;
+ unsigned short extrabytes ;
+ unsigned short samplesperblock ;
+} GSM610_WAV_FMT ;
+
typedef struct
{ unsigned int esf_field1 ;
unsigned short esf_field2 ;
@@ -72,17 +83,6 @@
EXT_SUBFORMAT esf ;
} EXTENSIBLE_WAV_FMT ;
-typedef struct
-{ unsigned short format ;
- unsigned short channels ;
- unsigned int samplerate ;
- unsigned int bytespersec ;
- unsigned short blockalign ;
- unsigned short bitwidth ;
- unsigned short extrabytes ;
- unsigned short samplesperblock ;
-} GSM610_WAV_FMT ;
-
typedef union
{ unsigned short format ;
MIN_WAV_FMT min ;
@@ -98,81 +98,29 @@
{ unsigned int samples ;
} FACT_CHUNK ;
-/*------------------------------------------------------------------------------------
-** Functions defined in wav.c
-*/
-
-int wav_close (SF_PRIVATE *psf) ;
-
-/*------------------------------------------------------------------------------------
-** Functions defined in wav_float.c
-*/
-
-int wav_read_x86f2s (SF_PRIVATE *psf, short *ptr, int len) ;
-int wav_read_x86f2i (SF_PRIVATE *psf, int *ptr, int len) ;
-int wav_read_x86f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-int wav_write_s2x86f (SF_PRIVATE *psf, short *ptr, int len) ;
-int wav_write_i2x86f (SF_PRIVATE *psf, int *ptr, int len) ;
-int wav_write_d2x86f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-/*------------------------------------------------------------------------------------
+/*------------------------------------------------------------------------------------
** Functions defined in wav_ima_adpcm.c
*/
-off_t ima_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
-int wav_ima_close (SF_PRIVATE *psf) ;
-
int wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int ima_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int ima_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+int wav_ima_writer_init (SF_PRIVATE *psf) ;
-int wav_ima_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int ima_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int ima_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-/*------------------------------------------------------------------------------------
+/*------------------------------------------------------------------------------------
** Functions defined in wav_ms_adpcm.c
*/
-off_t msadpcm_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
-int msadpcm_close (SF_PRIVATE *psf) ;
+int wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
+int wav_msadpcm_writer_init (SF_PRIVATE *psf) ;
-int msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-int msadpcm_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int msadpcm_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int msadpcm_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-
-/*------------------------------------------------------------------------------------
+/*------------------------------------------------------------------------------------
** Functions defined in wav_gsm610.c
*/
-/*
-** off_t wav_gsm610_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
-*/
-int wav_gsm610_close (SF_PRIVATE *psf) ;
-
int wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+int wav_gsm610_writer_init (SF_PRIVATE *psf) ;
-int wav_gsm610_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-int wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-int wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-
#ifdef _WIN32
-// #pragma pack(pop,1)
+ #pragma pack(pop,1)
#endif
#endif
--- a/common/libsndfile/src/wav_float.c
+++ /dev/null
@@ -1,326 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <math.h>
-
-#include "sndfile.h"
-#include "config.h"
-#include "sfendian.h"
-#include "common.h"
-#include "wav.h"
-
-/*--------------------------------------------------------------------------------------------
-** Prototypes for private functions.
-*/
-
-static void x86f2s_array (float *buffer, unsigned int count, short *ptr, int index) ;
-static void x86f2i_array (float *buffer, unsigned int count, int *ptr, int index) ;
-static void x86f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-
-static void s2x86f_array (short *ptr, int index, float *buffer, unsigned int count) ;
-static void i2x86f_array (int *ptr, int index, float *buffer, unsigned int count) ;
-static void d2x86f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact) ;
-
-/*--------------------------------------------------------------------------------------------
-** Exported functions.
-*/
-
-int wav_read_x86f2s (SF_PRIVATE *psf, short *ptr, int len)
-{ unsigned int bytecount, readcount, bufferlen, thisread ;
- int index = 0, total = 0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- x86f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
- total += thisread ;
- if (thisread < readcount)
- break ;
- index += thisread / psf->bytewidth ;
- bytecount -= thisread ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_READ ;
-
- return total ;
-} /* wav_read_x86f2s */
-
-int wav_read_x86f2i (SF_PRIVATE *psf, int *ptr, int len)
-{ unsigned int bytecount, readcount, bufferlen, thisread ;
- int index = 0, total = 0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- x86f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
- total += thisread ;
- if (thisread < readcount)
- break ;
- index += thisread / psf->bytewidth ;
- bytecount -= thisread ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_READ ;
-
- return total ;
-} /* wav_read_x86f2i */
-
-
-int wav_read_x86f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{ unsigned int bytecount, readcount, bufferlen, thisread ;
- int index = 0, total = 0 ;
- double normfact ;
-
- normfact = normalize ? 1.0 : 1.0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- thisread = fread (psf->buffer, 1, readcount, psf->file) ;
- x86f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
- total += thisread ;
- if (thisread < readcount)
- break ;
- index += thisread / psf->bytewidth ;
- bytecount -= thisread ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_READ ;
-
- return total ;
-} /* wav_read_x86f2d */
-
-int wav_write_s2x86f (SF_PRIVATE *psf, short *ptr, int len)
-{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
- int index = 0, total = 0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- s2x86f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
- thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
- total += thiswrite ;
- if (thiswrite < writecount)
- break ;
- index += thiswrite / psf->bytewidth ;
- bytecount -= thiswrite ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_WRITE ;
-
- return total ;
-} /* wav_write_s2x86f */
-
-int wav_write_i2x86f (SF_PRIVATE *psf, int *ptr, int len)
-{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
- int index = 0, total = 0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- i2x86f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
- thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
- total += thiswrite ;
- if (thiswrite < writecount)
- break ;
- index += thiswrite / psf->bytewidth ;
- bytecount -= thiswrite ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_WRITE ;
-
- return total ;
-} /* wav_write_i2x86f */
-
-int wav_write_d2x86f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{ unsigned int bytecount, writecount, bufferlen, thiswrite ;
- int index = 0, total = 0 ;
- double normfact ;
-
- normfact = (normalize) ? 1.0 : 1.0 ;
-
- bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
- bytecount = len * psf->bytewidth ;
- while (bytecount > 0)
- { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
- d2x86f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
- thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
- total += thiswrite ;
- if (thiswrite < writecount)
- break ;
- index += thiswrite / psf->bytewidth ;
- bytecount -= thiswrite ;
- } ;
-
- total /= psf->bytewidth ;
- if (total < len)
- psf->error = SFE_SHORT_WRITE ;
-
- return total ;
-} /* wav_write_d2x86f */
-
-/*==============================================================================================
-** Private functions.
-*/
-
-static
-float read_x86float (unsigned char *cptr)
-{ int exponent, mantissa ;
- float fvalue ;
-
- exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0);
- mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
-
- if (! (exponent || mantissa))
- return 0.0 ;
-
- mantissa |= 0x800000 ;
- exponent = exponent ? exponent - 127 : 0 ;
-
- fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
-
- if (cptr [3] & 0x80)
- fvalue *= -1 ;
-
- if (exponent > 0)
- fvalue *= (1 << exponent) ;
- else if (exponent < 0)
- fvalue /= (1 << abs (exponent)) ;
-
- return fvalue ;
-} /* read_x86float */
-
-static
-void write_x86float (double in, unsigned char *out)
-{ int exponent, mantissa ;
-
- *((int*) out) = 0 ;
-
- if (in == 0.0)
- return ;
-
- if (in < 0.0)
- { in *= -1.0 ;
- out [3] |= 0x80 ;
- } ;
-
- in = frexp (in, &exponent) ;
-
- exponent += 126 ;
-
- if (exponent & 0x01)
- out [2] |= 0x80 ;
- out [3] |= (exponent >> 1) & 0x7F ;
-
- in *= (float) 0x1000000 ;
- mantissa = (((int) in) & 0x7FFFFF) ;
-
- out [0] = mantissa & 0xFF ;
- out [1] = (mantissa >> 8) & 0xFF ;
- out [2] |= (mantissa >> 16) & 0x7F ;
-
- return ;
-} /* write_x86float */
-
-/*----------------------------------------------------------------------------------------------
-*/
-
-static
-void x86f2s_array (float *buffer, unsigned int count, short *ptr, int index)
-{ int k ;
-
- for (k = 0 ; k < count ; k++)
- { ptr [index] = ((short) read_x86float ((unsigned char *) (buffer +k))) ;
- index ++ ;
- } ;
-} /* x86f2s_array */
-
-static
-void x86f2i_array (float *buffer, unsigned int count, int *ptr, int index)
-{ int k ;
-
- for (k = 0 ; k < count ; k++)
- { ptr [index] = ((int) read_x86float ((unsigned char *) (buffer +k))) ;
- index ++ ;
- } ;
-} /* x86f2i_array */
-
-static
-void x86f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact)
-{ int k ;
-
- for (k = 0 ; k < count ; k++)
- { ptr [index] = ((double) read_x86float ((unsigned char *) (buffer +k))) * normfact ;
- index ++ ;
- } ;
-} /* x86f2d_array */
-
-static
-void s2x86f_array (short *ptr, int index, float *buffer, unsigned int count)
-{ int k ;
- float value ;
- for (k = 0 ; k < count ; k++)
- { value = (float) (ptr [index]) ;
- write_x86float (value, (unsigned char*) (buffer + k)) ;
- index ++ ;
- } ;
-} /* s2x86f_array */
-
-static
-void i2x86f_array (int *ptr, int index, float *buffer, unsigned int count)
-{ int k ;
- float value ;
- for (k = 0 ; k < count ; k++)
- { value = (float) (ptr [index]) ;
- write_x86float (value, (unsigned char*) (buffer + k)) ;
- index ++ ;
- } ;
-} /* i2x86f_array */
-
-static
-void d2x86f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact)
-{ int k ;
- float value ;
- for (k = 0 ; k < count ; k++)
- { value = (float) (ptr [index] * normfact) ;
- write_x86float (value, (unsigned char*) (buffer + k)) ;
- index ++ ;
- } ;
-} /* d2x86f_array */
-
--- a/common/libsndfile/src/wav_gsm610.c
+++ b/common/libsndfile/src/wav_gsm610.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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,10 +25,27 @@
#include "sndfile.h"
#include "config.h"
#include "sfendian.h"
+#include "floatcast.h"
#include "common.h"
#include "wav.h"
#include "GSM610/gsm.h"
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+# define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+# error "Cannot determine endian-ness of processor."
+#endif
+
+#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F'))
+#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E'))
+#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' '))
+#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't'))
+#define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a'))
+
+#define WAVE_FORMAT_GSM610 0x0031
+
#define GSM610_BLOCKSIZE 65
#define GSM610_SAMPLES 320
@@ -47,18 +64,39 @@
static int wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
static int wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
+static long wav_gsm610_seek (SF_PRIVATE *psf, long offset, int whence) ;
+static int wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int wav_gsm610_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int wav_gsm610_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int wav_gsm610_close (SF_PRIVATE *psf) ;
+static int wav_gsm610_write_header (SF_PRIVATE *psf) ;
+
/*============================================================================================
** WAV GSM610 Reader initialisation function.
*/
-int wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+int
+wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
{ GSM610_PRIVATE *pgsm610 ;
int true = 1 ;
psf->sf.seekable = SF_FALSE ;
-
+ /*-psf->sf.seekable = SF_TRUE ; -*/
+ psf->seek_func = (func_seek) wav_gsm610_seek ;
+
+ psf->read_short = (func_short) wav_gsm610_read_s ;
+ psf->read_int = (func_int) wav_gsm610_read_i ;
+ psf->read_float = (func_float) wav_gsm610_read_f ;
+ psf->read_double = (func_double) wav_gsm610_read_d ;
+
if (psf->mode != SF_MODE_READ)
return SFE_BAD_MODE_RW ;
@@ -74,7 +112,7 @@
gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true) ;
if (psf->datalength % GSM610_BLOCKSIZE)
- { psf_sprintf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+ { psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
pgsm610->blocks = psf->datalength / GSM610_BLOCKSIZE + 1 ;
}
else
@@ -91,13 +129,11 @@
** WAV GSM610 writer initialisation function.
*/
-int wav_gsm610_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+int
+wav_gsm610_writer_init (SF_PRIVATE *psf)
{ GSM610_PRIVATE *pgsm610 ;
- int true = 1 ;
+ int true = 1, samplesperblock, bytespersec ;
- if (fmt->format != 0x0031)
- psf_sprintf (psf, "*** Warning : format tag != WAVE_FORMAT_GSM610.\n") ;
-
if (psf->mode != SF_MODE_WRITE)
return SFE_BAD_MODE_RW ;
@@ -115,15 +151,27 @@
pgsm610->blockcount = 0 ;
pgsm610->samplecount = 0 ;
- fmt->gsm610.blockalign = GSM610_BLOCKSIZE ;
- fmt->gsm610.bitwidth = 0 ;
- fmt->gsm610.extrabytes = 2 ;
- fmt->gsm610.samplesperblock = GSM610_SAMPLES ;
- fmt->gsm610.bytespersec = fmt->gsm610.samplerate * GSM610_BLOCKSIZE / GSM610_SAMPLES ;
+ samplesperblock = GSM610_SAMPLES ;
+ bytespersec = psf->sf.samplerate * GSM610_BLOCKSIZE / GSM610_SAMPLES ;
- if (fmt->gsm610.bytespersec * GSM610_SAMPLES / GSM610_BLOCKSIZE < fmt->gsm610.samplerate)
- fmt->gsm610.bytespersec ++ ;
+ if (bytespersec * GSM610_SAMPLES / GSM610_BLOCKSIZE < psf->sf.samplerate)
+ bytespersec ++ ;
+ psf->datalength = (psf->sf.samples / samplesperblock) * samplesperblock ;
+ if (psf->sf.samples % samplesperblock)
+ psf->datalength += samplesperblock ;
+
+ wav_gsm610_write_header (psf) ;
+
+ psf->write_short = (func_short) wav_gsm610_write_s ;
+ psf->write_int = (func_int) wav_gsm610_write_i ;
+ psf->write_float = (func_float) wav_gsm610_write_f ;
+ psf->write_double = (func_double) wav_gsm610_write_d ;
+
+ psf->seek_func = NULL ; /* Not seekable */
+ psf->close = (func_close) wav_gsm610_close ;
+ psf->write_header = (func_wr_hdr) wav_gsm610_write_header ;
+
return 0 ;
} /* wav_gsm610_writer_init */
@@ -131,8 +179,8 @@
** GSM 6.10 Read Functions.
*/
-static
-int wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+static int
+wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
{ int k ;
pgsm610->blockcount ++ ;
@@ -144,15 +192,15 @@
} ;
if ((k = fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
- psf_sprintf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
+ psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0)
- { psf_sprintf (psf, "Error from gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
+ { psf_log_printf (psf, "Error from gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
return 0 ;
} ;
if (gsm_decode (pgsm610->gsm_data, pgsm610->block+(GSM610_BLOCKSIZE+1)/2, pgsm610->samples+GSM610_SAMPLES/2) < 0)
- { psf_sprintf (psf, "Error from gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
+ { psf_log_printf (psf, "Error from gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
return 0 ;
} ;
@@ -159,8 +207,8 @@
return 1 ;
} /* wav_gsm610_read_block */
-static
-int wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
+static int
+wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -184,7 +232,8 @@
return total ;
} /* wav_gsm610_read */
-int wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
int total ;
@@ -197,7 +246,8 @@
return total ;
} /* wav_gsm610_read_s */
-int wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
@@ -221,11 +271,40 @@
return total ;
} /* wav_gsm610_read_i */
-int wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+wav_gsm610_read_f (SF_PRIVATE *psf, float *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { readcount = (len >= bufferlen) ? bufferlen : len ;
+ count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
+ for (k = 0 ; k < readcount ; k++)
+ ptr [index+k] = normfact * (sptr [k]) ;
+ index += readcount ;
+ total += count ;
+ len -= readcount ;
+ } ;
+ return total ;
+} /* wav_gsm610_read_d */
+
+static int
+wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ GSM610_PRIVATE *pgsm610 ;
+ short *sptr ;
+ int k, bufferlen, readcount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
@@ -248,8 +327,8 @@
return total ;
} /* wav_gsm610_read_d */
-
-off_t wav_gsm610_seek (SF_PRIVATE *psf, off_t offset, int whence)
+static long
+wav_gsm610_seek (SF_PRIVATE *psf, long offset, int whence)
{ GSM610_PRIVATE *pgsm610 ;
int newblock, newsample ;
@@ -259,7 +338,7 @@
if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
switch (whence)
@@ -266,7 +345,7 @@
{ case SEEK_SET :
if (offset < 0 || offset > pgsm610->blocks * GSM610_SAMPLES)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = offset / GSM610_SAMPLES ;
newsample = offset % GSM610_SAMPLES ;
@@ -275,7 +354,7 @@
case SEEK_CUR :
if (psf->current + offset < 0 || psf->current + offset > pgsm610->blocks * GSM610_SAMPLES)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (psf->current + offset) / GSM610_SAMPLES ;
newsample = (psf->current + offset) % GSM610_SAMPLES ;
@@ -284,7 +363,7 @@
case SEEK_END :
if (offset > 0 || GSM610_SAMPLES * pgsm610->blocks + offset < 0)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (GSM610_SAMPLES * pgsm610->blocks + offset) / GSM610_SAMPLES ;
newsample = (GSM610_SAMPLES * pgsm610->blocks + offset) % GSM610_SAMPLES ;
@@ -292,7 +371,7 @@
default :
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
if (psf->mode == SF_MODE_READ)
@@ -304,7 +383,7 @@
else
{ /* What to do about write??? */
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
psf->current = newblock * GSM610_SAMPLES + newsample ;
@@ -320,8 +399,8 @@
/*==========================================================================================
*/
-static
-int wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+static int
+wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
{ int k ;
/* Encode the samples. */
@@ -330,7 +409,7 @@
/* Write the block to disk. */
if ((k = fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
- psf_sprintf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
+ psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
pgsm610->samplecount = 0 ;
pgsm610->blockcount ++ ;
@@ -337,12 +416,12 @@
/* Set samples to zero for next block. */
memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
-
+
return 1 ;
} /* wav_gsm610_write_block */
-static
-int wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
+static int
+wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -363,7 +442,8 @@
return total ;
} /* wav_gsm610_write */
-int wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
int total ;
@@ -376,7 +456,8 @@
return total ;
} /* wav_gsm610_write_s */
-int wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
@@ -400,11 +481,40 @@
return total ;
} /* wav_gsm610_write_i */
-int wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+wav_gsm610_write_f (SF_PRIVATE *psf, float *ptr, int len)
{ GSM610_PRIVATE *pgsm610 ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { writecount = (len >= bufferlen) ? bufferlen : len ;
+ for (k = 0 ; k < writecount ; k++)
+ sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
+ count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
+ index += writecount ;
+ total += count ;
+ len -= writecount ;
+ } ;
+ return total ;
+} /* wav_gsm610_write_f */
+
+static int
+wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ GSM610_PRIVATE *pgsm610 ;
+ short *sptr ;
+ int k, bufferlen, writecount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? (double) 0x8000 : 1.0) ;
@@ -418,7 +528,7 @@
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- sptr [k] = (short) (normfact * ptr [index+k]) ;
+ sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
index += writecount ;
total += count ;
@@ -427,12 +537,57 @@
return total ;
} /* wav_gsm610_write_d */
-int wav_gsm610_close (SF_PRIVATE *psf)
+static int
+wav_gsm610_write_header (SF_PRIVATE *psf)
+{ int fmt_size, blockalign, samplesperblock, bytespersec ;
+
+ blockalign = GSM610_BLOCKSIZE ;
+ samplesperblock = GSM610_SAMPLES ;
+ bytespersec = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ /* RIFF marker, length, WAVE and 'fmt ' markers. */
+ psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+ /* fmt chunk. */
+ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+ /* fmt : size, WAV format type, channels. */
+ psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+
+ /* fmt : samplerate, bytespersec. */
+ psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+ /* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+ psf_binheader_writef (psf, "wwww", blockalign, 0, 2, samplesperblock) ;
+
+ /* Fact chunk : marker, chunk size, samples */
+ psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+ /* DATA chunk : marker, datalength. */
+ psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ psf->datalength = (psf->sf.samples / samplesperblock) * samplesperblock ;
+ if (psf->sf.samples % samplesperblock)
+ psf->datalength += samplesperblock ;
+
+ return 0 ;
+} /* wav_gsm610_write_header */
+
+int
+wav_gsm610_close (SF_PRIVATE *psf)
{ GSM610_PRIVATE *pgsm610 ;
- unsigned int dword ;
if (! psf->fdata)
- return wav_close (psf) ;
+ return 0 ;
pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
@@ -451,15 +606,10 @@
fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
- /* Fix RIFF size. */
- dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
- fseek (psf->file, sizeof (dword), SEEK_SET) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
+ psf->sf.samples = GSM610_SAMPLES * pgsm610->blockcount ;
psf->datalength = psf->filelength - psf->dataoffset ;
- fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
- dword = H2LE_INT (psf->datalength) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+
+ wav_gsm610_write_header (psf) ;
} ;
if (pgsm610->gsm_data)
--- a/common/libsndfile/src/wav_ima_adpcm.c
+++ b/common/libsndfile/src/wav_ima_adpcm.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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,9 +25,18 @@
#include "sndfile.h"
#include "config.h"
#include "sfendian.h"
+#include "floatcast.h"
#include "common.h"
#include "wav.h"
+#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F'))
+#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E'))
+#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' '))
+#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't'))
+#define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a'))
+
+#define WAVE_FORMAT_IMA_ADPCM 0x0011 /* Intel Corporation */
+
typedef struct
{ unsigned int channels ;
unsigned int blocksize ;
@@ -65,21 +74,76 @@
32767
} ;
-static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
-static int ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+static int ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
+static int ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
-static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
-static int ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
-static unsigned int wav_srate2blocksize (unsigned int srate) ;
+static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+static int ima_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int ima_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int ima_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int ima_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int ima_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int ima_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static long ima_seek (SF_PRIVATE *psf, long offset, int whence) ;
+static int wav_ima_close (SF_PRIVATE *psf) ;
+static int wav_ima_write_header (SF_PRIVATE *psf) ;
+
+static unsigned int wav_srate2blocksize (unsigned int srate) ;
+
/*============================================================================================
** IMA ADPCM Reader initialisation function.
*/
-int ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
+int
+wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+{ IMA_ADPCM_PUBLIC public ;
+
+ public.blocksize = fmt->ima.blockalign ;
+ public.channels = fmt->ima.channels ;
+ public.samplesperblock = fmt->ima.samplesperblock ;
+ return ima_reader_init (psf, &public) ;
+} /* wav_ima_reader_init */
+
+int
+wav_ima_writer_init (SF_PRIVATE *psf)
+{ IMA_ADPCM_PUBLIC public ;
+ int error ;
+
+ public.blocksize = wav_srate2blocksize (psf->sf.samplerate) ;
+ public.channels = psf->sf.channels ;
+ public.samplesperblock = 2 * (public.blocksize - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+
+ if ((error = ima_writer_init (psf, &public)))
+ return error ;
+
+ wav_ima_write_header (psf) ;
+
+ psf->write_short = (func_short) ima_write_s ;
+ psf->write_int = (func_int) ima_write_i ;
+ psf->write_float = (func_float) ima_write_f ;
+ psf->write_double = (func_double) ima_write_d ;
+ psf->seek_func = (func_seek) ima_seek ;
+ psf->close = (func_close) wav_ima_close ;
+ psf->write_header = (func_wr_hdr) wav_ima_write_header ;
+
+ return 0 ;
+} /* wav_ima_writer_init */
+
+/*============================================================================================
+** IMA ADPCM Read Functions.
+*/
+
+static int
+ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
{ IMA_ADPCM_PRIVATE *pima ;
unsigned int pimasize, count ;
@@ -103,7 +167,7 @@
pima->samplesperblock = public->samplesperblock ;
if (psf->datalength % pima->blocksize)
- { psf_sprintf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+ { psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
pima->blocks = psf->datalength / pima->blocksize + 1 ;
}
else
@@ -111,63 +175,24 @@
count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
if (pima->samplesperblock != count)
- psf_sprintf (psf, "*** Warning : samplesperblock should be %d.\n", count) ;
+ psf_log_printf (psf, "*** Warning : samplesperblock should be %d.\n", count) ;
psf->sf.samples = pima->samplesperblock * pima->blocks ;
ima_read_block (psf, pima) ; /* Read first block. */
+ psf->read_short = (func_short) ima_read_s ;
+ psf->read_int = (func_int) ima_read_i ;
+ psf->read_float = (func_float) ima_read_f ;
+ psf->read_double = (func_double) ima_read_d ;
+
+ psf->seek_func = (func_seek) ima_seek ;
+
return 0 ;
} /* ima_reader_init */
-int ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
-{ IMA_ADPCM_PRIVATE *pima ;
- unsigned int pimasize ;
-
- if (psf->mode != SF_MODE_WRITE)
- return SFE_BAD_MODE_RW ;
-
- public->blocksize = wav_srate2blocksize (psf->sf.samplerate) ;
- public->samplesperblock = 2 * (public->blocksize - 4 * public->channels) / public->channels + 1 ;
-
- pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
-
- if (! (pima = malloc (pimasize)))
- return SFE_MALLOC_FAILED ;
-
- psf->fdata = (void*) pima ;
-
- memset (pima, 0, pimasize) ;
-
- pima->channels = public->channels ;
- pima->blocksize = public->blocksize ;
- pima->samplesperblock = public->samplesperblock ;
-
- pima->block = (unsigned char*) pima->data ;
- pima->samples = (short*) (pima->data + public->blocksize) ;
-
- pima->samplecount = 0 ;
-
- return 0 ;
-} /* ima_writer_init */
-
-
-
-/*============================================================================================
-** IMA ADPCM Read Functions.
-*/
-
-int wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
-{ IMA_ADPCM_PUBLIC public ;
-
- public.blocksize = fmt->ima.blockalign ;
- public.channels = fmt->ima.channels ;
- public.samplesperblock = fmt->ima.samplesperblock ;
- return ima_reader_init (psf, &public) ;
-} /* wav_ima_reader_init */
-
-static
-int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+static int
+ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
{ int chan, k, current, blockindex, index, indexstart ;
short step, diff, bytecode, stepindex [2] ;
@@ -180,7 +205,7 @@
} ;
if ((k = fread (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
- psf_sprintf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
/* Read and check the block header. */
@@ -196,11 +221,11 @@
stepindex [chan] = 88 ;
if (pima->block [chan*4+3] != 0)
- psf_sprintf (psf, "IMA ADPCM synchronisation error.\n") ;
+ psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ;
pima->samples [chan] = current ;
- /* psf_sprintf (psf, "block %d : channel %d (current, index) : (%d, %d)\n",
+ /* psf_log_printf (psf, "block %d : channel %d (current, index) : (%d, %d)\n",
** pima->blockcount, chan, current, stepindex [chan]) ;
*/
} ;
@@ -266,8 +291,8 @@
return 1 ;
} /* ima_read_block */
-static
-int ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
+static int
+ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -291,7 +316,8 @@
return total ;
} /* ima_read */
-int ima_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+ima_read_s (SF_PRIVATE *psf, short *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
int total ;
@@ -304,7 +330,8 @@
return total ;
} /* ima_read_s */
-int ima_read_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+ima_read_i (SF_PRIVATE *psf, int *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
@@ -328,11 +355,40 @@
return total ;
} /* ima_read_i */
-int ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+ima_read_f (SF_PRIVATE *psf, float *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { readcount = (len >= bufferlen) ? bufferlen : len ;
+ count = ima_read (psf, pima, sptr, readcount) ;
+ for (k = 0 ; k < readcount ; k++)
+ ptr [index+k] = normfact * (float) (sptr [k]) ;
+ index += readcount ;
+ total += count ;
+ len -= readcount ;
+ } ;
+ return total ;
+} /* ima_read_f */
+
+static int
+ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ IMA_ADPCM_PRIVATE *pima ;
+ short *sptr ;
+ int k, bufferlen, readcount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
@@ -355,8 +411,8 @@
return total ;
} /* ima_read_d */
-
-off_t ima_seek (SF_PRIVATE *psf, off_t offset, int whence)
+static long
+ima_seek (SF_PRIVATE *psf, long offset, int whence)
{ IMA_ADPCM_PRIVATE *pima ;
int newblock, newsample ;
@@ -366,7 +422,7 @@
if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
switch (whence)
@@ -373,7 +429,7 @@
{ case SEEK_SET :
if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = offset / pima->samplesperblock ;
newsample = offset % pima->samplesperblock ;
@@ -382,7 +438,7 @@
case SEEK_CUR :
if (psf->current + offset < 0 || psf->current + offset > pima->blocks * pima->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (psf->current + offset) / pima->samplesperblock ;
newsample = (psf->current + offset) % pima->samplesperblock ;
@@ -391,7 +447,7 @@
case SEEK_END :
if (offset > 0 || pima->samplesperblock * pima->blocks + offset < 0)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (pima->samplesperblock * pima->blocks + offset) / pima->samplesperblock ;
newsample = (pima->samplesperblock * pima->blocks + offset) % pima->samplesperblock ;
@@ -399,7 +455,7 @@
default :
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
if (psf->mode == SF_MODE_READ)
@@ -411,7 +467,7 @@
else
{ /* What to do about write??? */
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
psf->current = newblock * pima->samplesperblock + newsample ;
@@ -422,35 +478,45 @@
** IMA ADPCM Write Functions.
*/
-int wav_ima_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt)
-{ IMA_ADPCM_PUBLIC public ;
- int error ;
+static int
+ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
+{ IMA_ADPCM_PRIVATE *pima ;
+ unsigned int pimasize ;
- if (fmt->format != 0x0011)
- psf_sprintf (psf, "*** Warning : format tag != WAVE_FORMAT_IMA_ADPCM.\n") ;
+ if (psf->mode != SF_MODE_WRITE)
+ return SFE_BAD_MODE_RW ;
+
+ public->blocksize = wav_srate2blocksize (psf->sf.samplerate) ;
+ public->samplesperblock = 2 * (public->blocksize - 4 * public->channels) / public->channels + 1 ;
+
+ pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
+
+ if (! (pima = malloc (pimasize)))
+ return SFE_MALLOC_FAILED ;
- public.blocksize = wav_srate2blocksize (fmt->ima.samplerate) ;
- public.channels = psf->sf.channels ;
- public.samplesperblock = 2 * (public.blocksize - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+ psf->fdata = (void*) pima ;
+
+ memset (pima, 0, pimasize) ;
- if ((error = ima_writer_init (psf, &public)))
- return error ;
+ pima->channels = public->channels ;
+ pima->blocksize = public->blocksize ;
+ pima->samplesperblock = public->samplesperblock ;
- fmt->ima.blockalign = public.blocksize ;
- fmt->ima.bitwidth = 4 ;
- fmt->ima.extrabytes = 2 ;
- fmt->ima.samplesperblock = public.samplesperblock ;
- fmt->ima.bytespersec = (fmt->ima.samplerate * fmt->ima.blockalign) / fmt->ima.samplesperblock ;
+ pima->block = (unsigned char*) pima->data ;
+ pima->samples = (short*) (pima->data + public->blocksize) ;
+ pima->samplecount = 0 ;
+
return 0 ;
-} /* wav_ima_writer_init */
+} /* ima_writer_init */
+
/*==========================================================================================
*/
-static
-int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+static int
+ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
{ int chan, k, step, diff, vpdiff, blockindex, index, indexstart ;
short bytecode, mask ;
@@ -533,7 +599,7 @@
/* Write the block to disk. */
if ((k = fwrite (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
- psf_sprintf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ;
pima->samplecount = 0 ;
@@ -541,8 +607,8 @@
return 1 ;
} /* ima_write_block */
-static
-int ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
+static int
+ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -563,7 +629,8 @@
return total ;
} /* ima_write */
-int ima_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+ima_write_s (SF_PRIVATE *psf, short *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
int total ;
@@ -576,7 +643,8 @@
return total ;
} /* ima_write_s */
-int ima_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+ima_write_i (SF_PRIVATE *psf, int *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
@@ -600,11 +668,40 @@
return total ;
} /* ima_write_i */
-int ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+ima_write_f (SF_PRIVATE *psf, float *ptr, int len)
{ IMA_ADPCM_PRIVATE *pima ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { writecount = (len >= bufferlen) ? bufferlen : len ;
+ for (k = 0 ; k < writecount ; k++)
+ sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
+ count = ima_write (psf, pima, sptr, writecount) ;
+ index += writecount ;
+ total += count ;
+ len -= writecount ;
+ } ;
+ return total ;
+} /* ima_write_f */
+
+static int
+ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ IMA_ADPCM_PRIVATE *pima ;
+ short *sptr ;
+ int k, bufferlen, writecount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? ((double) 0x8000) : 1.0) ;
@@ -618,7 +715,7 @@
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- sptr [k] = (short) (normfact * ptr [index+k]) ;
+ sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
count = ima_write (psf, pima, sptr, writecount) ;
index += writecount ;
total += count ;
@@ -627,12 +724,57 @@
return total ;
} /* ima_write_d */
-int wav_ima_close (SF_PRIVATE *psf)
+static int
+wav_ima_write_header (SF_PRIVATE *psf)
+{ int fmt_size, blockalign, samplesperblock, bytespersec ;
+
+ blockalign = wav_srate2blocksize (psf->sf.samplerate) ;
+ samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+ bytespersec = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ /* RIFF marker, length, WAVE and 'fmt ' markers. */
+ psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+ /* fmt chunk. */
+ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+ /* fmt : size, WAV format type, channels. */
+ psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;
+
+ /* fmt : samplerate, bytespersec. */
+ psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+ /* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+ psf_binheader_writef (psf, "wwww", blockalign, 4, 2, samplesperblock) ;
+
+ /* Fact chunk. */
+ psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+ /* DATA chunk. */
+ psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ psf->datalength = (psf->sf.samples / samplesperblock) * samplesperblock ;
+ if (psf->sf.samples % samplesperblock)
+ psf->datalength += samplesperblock ;
+
+ return 0 ;
+} /* wav_ima_write_header */
+
+static int
+wav_ima_close (SF_PRIVATE *psf)
{ IMA_ADPCM_PRIVATE *pima ;
- unsigned int dword ;
if (! psf->fdata)
- return wav_close (psf) ;
+ return 0 ;
pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
@@ -645,21 +787,16 @@
ima_write_block (psf, pima) ;
/* Now we know for certain the length of the file we can
- ** re-write correct values for the RIFF and data chunks.
+ ** re-write the header.
*/
fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
- /* Fix RIFF size. */
- dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
- fseek (psf->file, sizeof (dword), SEEK_SET) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
+ psf->sf.samples = pima->samplesperblock * pima->blockcount ;
psf->datalength = psf->filelength - psf->dataoffset ;
- fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
- dword = H2LE_INT (psf->datalength) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+
+ wav_ima_write_header (psf) ;
} ;
if (psf->fdata)
@@ -669,8 +806,8 @@
return 0 ;
} /* wav_ima_close */
-static
-unsigned int wav_srate2blocksize (unsigned int srate)
+static unsigned
+int wav_srate2blocksize (unsigned int srate)
{ if (srate < 12000)
return 256 ;
if (srate < 23000)
--- a/common/libsndfile/src/wav_ms_adpcm.c
+++ b/common/libsndfile/src/wav_ms_adpcm.c
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
**
** 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,10 +25,20 @@
#include "sndfile.h"
#include "config.h"
#include "sfendian.h"
+#include "floatcast.h"
#include "common.h"
#include "wav.h"
+/* These required here because we write the header in this file. */
+#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F'))
+#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E'))
+#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' '))
+#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't'))
+#define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a'))
+
+#define WAVE_FORMAT_MS_ADPCM 0x0002
+
typedef struct
{ unsigned int channels, blocksize, samplesperblock, blocks, dataremaining ;
int blockcount, samplecount ;
@@ -87,13 +97,28 @@
** Static functions.
*/
-static int msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static int msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
static int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
-static int msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static int msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
static int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
-static unsigned int srate2blocksize (unsigned int srate) ;
+static int msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int msadpcm_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int msadpcm_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int msadpcm_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int msadpcm_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static long msadpcm_seek (SF_PRIVATE *psf, long offset, int whence) ;
+static int msadpcm_close (SF_PRIVATE *psf) ;
+
+static int msadpcm_write_header (SF_PRIVATE *psf) ;
+
+static unsigned int srate2blocksize (unsigned int srate_chan_product) ;
static void choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
/*============================================================================================
@@ -100,7 +125,8 @@
** MS ADPCM Read Functions.
*/
-int msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+int
+wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
{ MSADPCM_PRIVATE *pms ;
unsigned int pmssize ;
int count ;
@@ -128,19 +154,26 @@
count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
if (pms->samplesperblock != count)
- psf_sprintf (psf, "*** Warning : samplesperblock shoud be %d.\n", count) ;
+ psf_log_printf (psf, "*** Warning : samplesperblock shoud be %d.\n", count) ;
psf->sf.samples = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
- psf_sprintf (psf, " bpred idelta\n") ;
+ psf_log_printf (psf, " bpred idelta\n") ;
- msadpcm_read_block (psf, pms) ;
+ msadpcm_decode_block (psf, pms) ;
+ psf->read_short = (func_short) msadpcm_read_s ;
+ psf->read_int = (func_int) msadpcm_read_i ;
+ psf->read_float = (func_float) msadpcm_read_f ;
+ psf->read_double = (func_double) msadpcm_read_d ;
+
+ psf->seek_func = (func_seek) msadpcm_seek ;
+
return 0 ;
-} /* msadpcm_reader_init */
+} /* wav_msadpcm_reader_init */
-static
-int msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+static int
+msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
{ int chan, k, blockindex, sampleindex ;
short bytecode, bpred [2], chan_idelta [2] ;
@@ -157,7 +190,7 @@
} ;
if ((k = fread (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
- psf_sprintf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
/* Read and check the block header. */
@@ -165,12 +198,12 @@
{ bpred [0] = pms->block [0] ;
if (bpred [0] >= 7)
- psf_sprintf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
+ psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
chan_idelta [1] = 0 ;
- psf_sprintf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [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) ;
@@ -181,12 +214,12 @@
bpred [1] = pms->block [1] ;
if (bpred [0] >= 7 || bpred [1] >= 7)
- psf_sprintf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
+ psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
- psf_sprintf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
+ 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) ;
@@ -241,10 +274,10 @@
} ;
return 1 ;
-} /* msadpcm_read_block */
+} /* msadpcm_decode_block */
-static
-int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
+static int
+msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -254,7 +287,7 @@
} ;
if (pms->samplecount >= pms->samplesperblock)
- msadpcm_read_block (psf, pms) ;
+ msadpcm_decode_block (psf, pms) ;
count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
count = (len - index > count) ? count : len - index ;
@@ -268,7 +301,8 @@
return total ;
} /* msadpcm_read */
-int msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
int total ;
@@ -281,7 +315,8 @@
return total ;
} /* msadpcm_read_s */
-int msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
@@ -305,11 +340,39 @@
return total ;
} /* msadpcm_read_i */
-int msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+msadpcm_read_f (SF_PRIVATE *psf, float *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
short *sptr ;
int k, bufferlen, readcount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { readcount = (len >= bufferlen) ? bufferlen : len ;
+ count = msadpcm_read (psf, pms, sptr, readcount) ;
+ for (k = 0 ; k < readcount ; k++)
+ ptr [index+k] = normfact * (float) (sptr [k]) ;
+ index += readcount ;
+ total += count ;
+ len -= readcount ;
+ } ;
+ return total ;
+} /* msadpcm_read_f */
+
+static int
+msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ MSADPCM_PRIVATE *pms ;
+ short *sptr ;
+ int k, bufferlen, readcount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
@@ -332,8 +395,8 @@
return total ;
} /* msadpcm_read_d */
-
-off_t msadpcm_seek (SF_PRIVATE *psf, off_t offset, int whence)
+static long
+msadpcm_seek (SF_PRIVATE *psf, long offset, int whence)
{ MSADPCM_PRIVATE *pms ;
int newblock, newsample ;
@@ -343,7 +406,7 @@
if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
switch (whence)
@@ -350,7 +413,7 @@
{ case SEEK_SET :
if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = offset / pms->samplesperblock ;
newsample = offset % pms->samplesperblock ;
@@ -359,7 +422,7 @@
case SEEK_CUR :
if (psf->current + offset < 0 || psf->current + offset > pms->blocks * pms->samplesperblock)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (psf->current + offset) / pms->samplesperblock ;
newsample = (psf->current + offset) % pms->samplesperblock ;
@@ -368,7 +431,7 @@
case SEEK_END :
if (offset > 0 || pms->samplesperblock * pms->blocks + offset < 0)
{ psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
newblock = (pms->samplesperblock * pms->blocks + offset) / pms->samplesperblock ;
newsample = (pms->samplesperblock * pms->blocks + offset) % pms->samplesperblock ;
@@ -376,19 +439,19 @@
default :
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
if (psf->mode == SF_MODE_READ)
{ fseek (psf->file, (int) (psf->dataoffset + newblock * pms->blocksize), SEEK_SET) ;
pms->blockcount = newblock ;
- msadpcm_read_block (psf, pms) ;
+ msadpcm_decode_block (psf, pms) ;
pms->samplecount = newsample ;
}
else
{ /* What to do about write??? */
psf->error = SFE_BAD_SEEK ;
- return ((off_t) -1) ;
+ return ((long) -1) ;
} ;
psf->current = newblock * pms->samplesperblock + newsample ;
@@ -399,50 +462,49 @@
** MS ADPCM Write Functions.
*/
-int msadpcm_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+int
+wav_msadpcm_writer_init (SF_PRIVATE *psf)
{ MSADPCM_PRIVATE *pms ;
- unsigned int k, pmssize ;
+ unsigned int pmssize, blockalign, samplesperblock ;
- if (fmt->format != 0x0002)
- psf_sprintf (psf, "*** Warning : format tag != WAVE_FORMAT_MS_ADPCM.\n") ;
+ blockalign = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+ samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
- fmt->msadpcm.blockalign = srate2blocksize (fmt->msadpcm.samplerate) ;
- fmt->msadpcm.bitwidth = 4 ;
- fmt->msadpcm.extrabytes = 32 ;
- fmt->msadpcm.samplesperblock = 2 + 2 * (fmt->msadpcm.blockalign - 7 * fmt->msadpcm.channels) / fmt->msadpcm.channels ;
+ pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
- fmt->msadpcm.bytespersec = (fmt->msadpcm.samplerate * fmt->msadpcm.blockalign) / fmt->msadpcm.samplesperblock ;
-
- fmt->msadpcm.numcoeffs = 7 ;
- for (k = 0 ; k < 7 ; k++)
- { fmt->msadpcm.coeffs[k].coeff1 = AdaptCoeff1 [k] ;
- fmt->msadpcm.coeffs[k].coeff2 = AdaptCoeff2 [k] ;
- } ;
-
- pmssize = sizeof (MSADPCM_PRIVATE) + fmt->msadpcm.blockalign + 3 * fmt->msadpcm.channels * fmt->msadpcm.samplesperblock ;
-
if (! (psf->fdata = malloc (pmssize)))
return SFE_MALLOC_FAILED ;
pms = (MSADPCM_PRIVATE*) psf->fdata ;
memset (pms, 0, pmssize) ;
- pms->channels = fmt->msadpcm.channels ;
- pms->blocksize = fmt->msadpcm.blockalign ;
- pms->samplesperblock = fmt->msadpcm.samplesperblock ;
+ pms->channels = psf->sf.channels ;
+ pms->blocksize = blockalign ;
+ pms->samplesperblock = samplesperblock ;
pms->block = (unsigned char*) pms->dummydata ;
- pms->samples = (short*) (pms->dummydata + fmt->msadpcm.blockalign) ;
+ pms->samples = (short*) (pms->dummydata + blockalign) ;
pms->samplecount = 0 ;
+ msadpcm_write_header (psf) ;
+
+ psf->write_short = (func_short) msadpcm_write_s ;
+ psf->write_int = (func_int) msadpcm_write_i ;
+ psf->write_float = (func_float) msadpcm_write_f ;
+ psf->write_double = (func_double) msadpcm_write_d ;
+
+ psf->seek_func = (func_seek) msadpcm_seek ;
+ psf->close = (func_close) msadpcm_close ;
+ psf->write_header = (func_wr_hdr) msadpcm_write_header ;
+
return 0 ;
-} /* msadpcm_writer_init */
+} /* wav_msadpcm_writer_init */
/*==========================================================================================
*/
-static
-int msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+static int
+msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
{ unsigned int blockindex ;
unsigned char byte ;
int chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
@@ -494,7 +556,6 @@
}
else
{ /* Stereo file. */
-
pms->block [0] = bpred [0] ;
pms->block [1] = bpred [1] ;
@@ -517,10 +578,13 @@
byte = 0 ;
chan = 1 ;
- for (k = 4 ; k < pms->samplesperblock ; k+=2)
- { chan = chan ? 0 : 1 ;
+ for (k = 4 ; k < 2 * pms->samplesperblock ; k++)
+ { chan = k & 1 ;
+
predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
errordelta = (pms->samples [k] - predict) / idelta [chan] ;
+
+
if (errordelta < -8)
errordelta = -8 ;
else if (errordelta > 7)
@@ -534,7 +598,8 @@
errordelta += 0x10 ;
byte = (byte << 4) | (errordelta & 0xF) ;
- if (k % 2)
+
+ if (chan)
{ pms->block [blockindex++] = byte ;
byte = 0 ;
} ;
@@ -542,7 +607,7 @@
idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
if (idelta [chan] < 16)
idelta [chan] = 16 ;
- pms->samples [k-2] = newsamp ;
+ pms->samples [k] = newsamp ;
} ;
} ;
@@ -549,7 +614,7 @@
/* Write the block to disk. */
if ((k = fwrite (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
- psf_sprintf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
+ psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
@@ -557,10 +622,10 @@
pms->samplecount = 0 ;
return 1 ;
-} /* msadpcm_write_block */
+} /* msadpcm_encode_block */
-static
-int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
+static int
+msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
{ int count, total = 0, index = 0 ;
while (index < len)
@@ -575,13 +640,14 @@
total = index ;
if (pms->samplecount >= pms->samplesperblock)
- msadpcm_write_block (psf, pms) ;
+ msadpcm_encode_block (psf, pms) ;
} ;
return total ;
} /* msadpcm_write */
-int msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static int
+msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
int total ;
@@ -594,7 +660,8 @@
return total ;
} /* msadpcm_write_s */
-int msadpcm_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static int
+msadpcm_write_i (SF_PRIVATE *psf, int *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
@@ -618,11 +685,40 @@
return total ;
} /* msadpcm_write_i */
-int msadpcm_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static int
+msadpcm_write_f (SF_PRIVATE *psf, float *ptr, int len)
{ MSADPCM_PRIVATE *pms ;
short *sptr ;
int k, bufferlen, writecount = 0, count ;
int index = 0, total = 0 ;
+ float normfact ;
+
+ if (! psf->fdata)
+ return 0 ;
+ pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+ normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+ sptr = (short*) psf->buffer ;
+ bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+ while (len > 0)
+ { writecount = (len >= bufferlen) ? bufferlen : len ;
+ for (k = 0 ; k < writecount ; k++)
+ sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
+ count = msadpcm_write (psf, pms, sptr, writecount) ;
+ index += writecount ;
+ total += count ;
+ len -= writecount ;
+ } ;
+ return total ;
+} /* msadpcm_write_f */
+
+static int
+msadpcm_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{ MSADPCM_PRIVATE *pms ;
+ short *sptr ;
+ int k, bufferlen, writecount = 0, count ;
+ int index = 0, total = 0 ;
double normfact ;
normfact = (normalize ? ((double) 0x8000) : 1.0) ;
@@ -636,7 +732,7 @@
while (len > 0)
{ writecount = (len >= bufferlen) ? bufferlen : len ;
for (k = 0 ; k < writecount ; k++)
- sptr [k] = (short) (normfact * ptr [index+k]) ;
+ sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
count = msadpcm_write (psf, pms, sptr, writecount) ;
index += writecount ;
total += count ;
@@ -648,35 +744,79 @@
/*========================================================================================
*/
-int msadpcm_close (SF_PRIVATE *psf)
+static int
+msadpcm_write_header (SF_PRIVATE *psf)
+{ int k, fmt_size, blockalign, samplesperblock, bytespersec, extrabytes ;
+
+ blockalign = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+ samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+ bytespersec = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+ /* Reset the current header length to zero. */
+ psf->header [0] = 0 ;
+ psf->headindex = 0 ;
+ fseek (psf->file, 0, SEEK_SET) ;
+
+ /* RIFF marker, length, WAVE and 'fmt ' markers. */
+ psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+ /* fmt chunk. */
+ extrabytes = 2 + 2 + 7 * (2 + 2) ;
+ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+
+ /* fmt : size, WAV format type, channels. */
+ psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+ /* fmt : samplerate, bytespersec. */
+ psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+ /* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+ psf_binheader_writef (psf, "wwwww", blockalign, 4, extrabytes, samplesperblock, 7) ;
+
+ for (k = 0 ; k < 7 ; k++)
+ psf_binheader_writef (psf, "ww", AdaptCoeff1 [k], AdaptCoeff2 [k]) ;
+
+ /* Fact chunk. */
+ psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+ /* DATA chunk. */
+ psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+ fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+ psf->dataoffset = psf->headindex ;
+
+ psf->datalength = (psf->sf.samples / samplesperblock) * samplesperblock ;
+ if (psf->sf.samples % samplesperblock)
+ psf->datalength += samplesperblock ;
+
+ return 0 ;
+} /* msadpcm_write_header */
+
+static int
+msadpcm_close (SF_PRIVATE *psf)
{ MSADPCM_PRIVATE *pms ;
- unsigned int dword ;
if (! psf->fdata)
- return wav_close (psf) ;
+ return 0 ;
pms = (MSADPCM_PRIVATE*) psf->fdata ;
if (psf->mode == SF_MODE_WRITE)
- { /* Now we know for certain the length of the file we can
- ** re-write correct values for the RIFF and data chunks.
+ { /* Now we know static int for certain the length of the file we can
+ ** re-write the header.
*/
if (pms->samplecount && pms->samplecount < pms->samplesperblock)
- msadpcm_write_block (psf, pms) ;
+ msadpcm_encode_block (psf, pms) ;
fseek (psf->file, 0, SEEK_END) ;
psf->filelength = ftell (psf->file) ;
- /* Fix RIFF size. */
- dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
- fseek (psf->file, sizeof (dword), SEEK_SET) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
-
+ psf->sf.samples = pms->samplesperblock * pms->blockcount ;
psf->datalength = psf->filelength - psf->dataoffset ;
- fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
- dword = H2LE_INT (psf->datalength) ;
- fwrite (&dword, sizeof (dword), 1, psf->file) ;
+
+ msadpcm_write_header (psf) ;
} ;
if (psf->fdata)
@@ -690,17 +830,17 @@
** Static functions.
*/
-static
-unsigned int srate2blocksize (unsigned int srate)
-{ if (srate < 12000)
+static unsigned int
+srate2blocksize (unsigned int srate_chan_product)
+{ if (srate_chan_product < 12000)
return 256 ;
- if (srate < 23000)
+ if (srate_chan_product < 23000)
return 512 ;
- return 1024 ;
+ if (srate_chan_product < 44000)
+ return 1024 ;
+ return 2048 ;
} /* srate2blocksize */
-
-
/*----------------------------------------------------------------------------------------
** Choosing the block predictor.
** Each block requires a predictor and an idelta for each channel.
@@ -719,8 +859,8 @@
#define IDELTA_COUNT 3
-static
-void choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
+static void
+choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
{ unsigned int chan, k, bpred, idelta_sum, best_bpred, best_idelta ;
for (chan = 0 ; chan < channels; chan++)
--- a/common/libsndfile/tests/Makefile.am
+++ /dev/null
@@ -1,103 +1,0 @@
-noinst_PROGRAMS = sfversion read_seek_test double_test write_read_test \
- lossy_comp_test error_test ulaw_test alaw_test sftest
-
-SNDFILEDIR =../src
-INCLUDES = -I$(srcdir)/$(SNDFILEDIR)
-
-sfversion_SOURCES = sfversion.c
-sfversion_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-read_seek_test_SOURCES = read_seek_test.c
-read_seek_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-write_read_test_SOURCES = write_read_test.c
-write_read_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-lossy_comp_test_SOURCES = lossy_comp_test.c
-lossy_comp_test_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-error_test_SOURCES = error_test.c
-error_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-ulaw_test_SOURCES = ulaw_test.c
-ulaw_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-alaw_test_SOURCES = alaw_test.c
-alaw_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-double_test_SOURCES = double_test.c
-double_test_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-sftest_SOURCES = sftest.c
-sftest_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-check: generic-test ulaw_test alaw_test double_test first-test \
- wav-tests aiff-tests au-tests raw-tests paf-tests svx-tests
-
-generic-test : error_test
- ./error_test
- ./ulaw_test
- ./alaw_test
- ./double_test
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed common tests."
- @echo "--------------------------------------------------------------------"
-
-first-test: read_seek_test
- ./read_seek_test wav
- ./read_seek_test aiff
- ./read_seek_test au
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed first set of tests."
- @echo "--------------------------------------------------------------------"
-
-wav-tests: write_read_test
- ./write_read_test wav
- ./lossy_comp_test wav_ima
- ./lossy_comp_test wav_msadpcm
- ./lossy_comp_test wav_ulaw
- ./lossy_comp_test wav_alaw
- ./lossy_comp_test wav_gsm610
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on WAV files."
- @echo "--------------------------------------------------------------------"
-
-aiff-tests: write_read_test
- ./write_read_test aiff
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on AIFF files."
- @echo "--------------------------------------------------------------------"
-
-au-tests: write_read_test
- ./write_read_test au
- ./write_read_test aule
- ./lossy_comp_test au_ulaw
- ./lossy_comp_test au_alaw
- ./lossy_comp_test aule_ulaw
- ./lossy_comp_test aule_alaw
- ./lossy_comp_test au_g721
- ./lossy_comp_test au_g723
- ./lossy_comp_test aule_g721
- ./lossy_comp_test aule_g723
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on AU files."
- @echo "--------------------------------------------------------------------"
-
-raw-tests: write_read_test
- ./write_read_test raw
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on RAW (header-less PCM) files."
- @echo "--------------------------------------------------------------------"
-
-paf-tests: write_read_test
- ./write_read_test paf
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on PAF files."
- @echo "--------------------------------------------------------------------"
-
-svx-tests: write_read_test
- ./write_read_test svx
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on SVX files."
- @echo "--------------------------------------------------------------------"
-
--- a/common/libsndfile/tests/Makefile.in
+++ /dev/null
@@ -1,460 +1,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 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.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_alias = @build_alias@
-build_triplet = @build@
-host_alias = @host_alias@
-host_triplet = @host@
-target_alias = @target_alias@
-target_triplet = @target@
-AS = @AS@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LD = @LD@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-NM = @NM@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
-VERSION = @VERSION@
-subdirs = @subdirs@
-
-noinst_PROGRAMS = sfversion read_seek_test double_test write_read_test lossy_comp_test error_test ulaw_test alaw_test sftest
-
-
-SNDFILEDIR = ../src
-INCLUDES = -I$(srcdir)/$(SNDFILEDIR)
-
-sfversion_SOURCES = sfversion.c
-sfversion_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-read_seek_test_SOURCES = read_seek_test.c
-read_seek_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-write_read_test_SOURCES = write_read_test.c
-write_read_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-lossy_comp_test_SOURCES = lossy_comp_test.c
-lossy_comp_test_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-error_test_SOURCES = error_test.c
-error_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-ulaw_test_SOURCES = ulaw_test.c
-ulaw_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-alaw_test_SOURCES = alaw_test.c
-alaw_test_LDADD = $(SNDFILEDIR)/libsndfile.la
-
-double_test_SOURCES = double_test.c
-double_test_LDADD = $(SNDFILEDIR)/libsndfile.la -lm
-
-sftest_SOURCES = sftest.c
-sftest_LDADD = $(SNDFILEDIR)/libsndfile.la
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../src/config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../src
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-sfversion_OBJECTS = sfversion.o
-sfversion_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sfversion_LDFLAGS =
-read_seek_test_OBJECTS = read_seek_test.o
-read_seek_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-read_seek_test_LDFLAGS =
-double_test_OBJECTS = double_test.o
-double_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-double_test_LDFLAGS =
-write_read_test_OBJECTS = write_read_test.o
-write_read_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-write_read_test_LDFLAGS =
-lossy_comp_test_OBJECTS = lossy_comp_test.o
-lossy_comp_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-lossy_comp_test_LDFLAGS =
-error_test_OBJECTS = error_test.o
-error_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-error_test_LDFLAGS =
-ulaw_test_OBJECTS = ulaw_test.o
-ulaw_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-ulaw_test_LDFLAGS =
-alaw_test_OBJECTS = alaw_test.o
-alaw_test_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-alaw_test_LDFLAGS =
-sftest_OBJECTS = sftest.o
-sftest_DEPENDENCIES = $(SNDFILEDIR)/libsndfile.la
-sftest_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-SOURCES = $(sfversion_SOURCES) $(read_seek_test_SOURCES) $(double_test_SOURCES) $(write_read_test_SOURCES) $(lossy_comp_test_SOURCES) $(error_test_SOURCES) $(ulaw_test_SOURCES) $(alaw_test_SOURCES) $(sftest_SOURCES)
-OBJECTS = $(sfversion_OBJECTS) $(read_seek_test_OBJECTS) $(double_test_OBJECTS) $(write_read_test_OBJECTS) $(lossy_comp_test_OBJECTS) $(error_test_OBJECTS) $(ulaw_test_OBJECTS) $(alaw_test_OBJECTS) $(sftest_OBJECTS)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps tests/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-noinstPROGRAMS:
-
-clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.c.o:
- $(COMPILE) -c $<
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-sfversion: $(sfversion_OBJECTS) $(sfversion_DEPENDENCIES)
- @rm -f sfversion
- $(LINK) $(sfversion_LDFLAGS) $(sfversion_OBJECTS) $(sfversion_LDADD) $(LIBS)
-
-read_seek_test: $(read_seek_test_OBJECTS) $(read_seek_test_DEPENDENCIES)
- @rm -f read_seek_test
- $(LINK) $(read_seek_test_LDFLAGS) $(read_seek_test_OBJECTS) $(read_seek_test_LDADD) $(LIBS)
-
-double_test: $(double_test_OBJECTS) $(double_test_DEPENDENCIES)
- @rm -f double_test
- $(LINK) $(double_test_LDFLAGS) $(double_test_OBJECTS) $(double_test_LDADD) $(LIBS)
-
-write_read_test: $(write_read_test_OBJECTS) $(write_read_test_DEPENDENCIES)
- @rm -f write_read_test
- $(LINK) $(write_read_test_LDFLAGS) $(write_read_test_OBJECTS) $(write_read_test_LDADD) $(LIBS)
-
-lossy_comp_test: $(lossy_comp_test_OBJECTS) $(lossy_comp_test_DEPENDENCIES)
- @rm -f lossy_comp_test
- $(LINK) $(lossy_comp_test_LDFLAGS) $(lossy_comp_test_OBJECTS) $(lossy_comp_test_LDADD) $(LIBS)
-
-error_test: $(error_test_OBJECTS) $(error_test_DEPENDENCIES)
- @rm -f error_test
- $(LINK) $(error_test_LDFLAGS) $(error_test_OBJECTS) $(error_test_LDADD) $(LIBS)
-
-ulaw_test: $(ulaw_test_OBJECTS) $(ulaw_test_DEPENDENCIES)
- @rm -f ulaw_test
- $(LINK) $(ulaw_test_LDFLAGS) $(ulaw_test_OBJECTS) $(ulaw_test_LDADD) $(LIBS)
-
-alaw_test: $(alaw_test_OBJECTS) $(alaw_test_DEPENDENCIES)
- @rm -f alaw_test
- $(LINK) $(alaw_test_LDFLAGS) $(alaw_test_OBJECTS) $(alaw_test_LDADD) $(LIBS)
-
-sftest: $(sftest_OBJECTS) $(sftest_DEPENDENCIES)
- @rm -f sftest
- $(LINK) $(sftest_LDFLAGS) $(sftest_OBJECTS) $(sftest_LDADD) $(LIBS)
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = tests
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-alaw_test.o: alaw_test.c ../src/sndfile.h
-double_test.o: double_test.c ../src/sndfile.h
-error_test.o: error_test.c ../src/sndfile.h
-lossy_comp_test.o: lossy_comp_test.c ../src/sndfile.h
-read_seek_test.o: read_seek_test.c ../src/sndfile.h
-sftest.o: sftest.c ../src/sndfile.h
-sfversion.o: sfversion.c ../src/sndfile.h
-ulaw_test.o: ulaw_test.c ../src/sndfile.h
-write_read_test.o: write_read_test.c ../src/sndfile.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-check: generic-test ulaw_test alaw_test double_test first-test \
- wav-tests aiff-tests au-tests raw-tests paf-tests svx-tests
-
-generic-test : error_test
- ./error_test
- ./ulaw_test
- ./alaw_test
- ./double_test
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed common tests."
- @echo "--------------------------------------------------------------------"
-
-first-test: read_seek_test
- ./read_seek_test wav
- ./read_seek_test aiff
- ./read_seek_test au
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed first set of tests."
- @echo "--------------------------------------------------------------------"
-
-wav-tests: write_read_test
- ./write_read_test wav
- ./lossy_comp_test wav_ima
- ./lossy_comp_test wav_msadpcm
- ./lossy_comp_test wav_ulaw
- ./lossy_comp_test wav_alaw
- ./lossy_comp_test wav_gsm610
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on WAV files."
- @echo "--------------------------------------------------------------------"
-
-aiff-tests: write_read_test
- ./write_read_test aiff
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on AIFF files."
- @echo "--------------------------------------------------------------------"
-
-au-tests: write_read_test
- ./write_read_test au
- ./write_read_test aule
- ./lossy_comp_test au_ulaw
- ./lossy_comp_test au_alaw
- ./lossy_comp_test aule_ulaw
- ./lossy_comp_test aule_alaw
- ./lossy_comp_test au_g721
- ./lossy_comp_test au_g723
- ./lossy_comp_test aule_g721
- ./lossy_comp_test aule_g723
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on AU files."
- @echo "--------------------------------------------------------------------"
-
-raw-tests: write_read_test
- ./write_read_test raw
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on RAW (header-less PCM) files."
- @echo "--------------------------------------------------------------------"
-
-paf-tests: write_read_test
- ./write_read_test paf
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on PAF files."
- @echo "--------------------------------------------------------------------"
-
-svx-tests: write_read_test
- ./write_read_test svx
- @echo "--------------------------------------------------------------------"
- @echo " `./sfversion` passed tests on SVX files."
- @echo "--------------------------------------------------------------------"
-
-# 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.
-.NOEXPORT:
--- a/common/libsndfile/tests/alaw_test.c
+++ /dev/null
@@ -1,243 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <unistd.h>
-
-#include <sndfile.h>
-
-#define BUFFER_SIZE (65536)
-
-static unsigned char alaw_encode (int sample) ;
-static int alaw_decode (unsigned int alawbyte) ;
-
-static short short_buffer [BUFFER_SIZE] ;
-static unsigned char alaw_buffer [BUFFER_SIZE] ;
-
-int main (int argc, char *argv[])
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- char *filename ;
- int k ;
-
- filename = "test.au" ;
-
- sfinfo.format = SF_FORMAT_AU | SF_FORMAT_ALAW ;
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- /* Generate a file containing all possible 16 bit sample values
- ** and write it to disk as alaw encoded samples.
- */
-
- for (k = 0 ; k < 0x10000 ; k++)
- short_buffer [k] = k & 0xFFFF ;
-
- sf_write_short (file, short_buffer, BUFFER_SIZE) ;
- sf_close (file) ;
-
- /* Now open that file and compare the alaw encoded sample values
- ** with what they should be.
- */
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_read_raw (file, alaw_buffer, BUFFER_SIZE) != BUFFER_SIZE)
- { printf ("sf_read_raw : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < 0x10000 ; k++)
- if (alaw_encode (short_buffer [k]) != alaw_buffer [k])
- { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, alaw_buffer [k], alaw_encode (short_buffer [k])) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf (" alaw_test : encoder ... ok\n") ;
-
- /* Now generate a file containing all possible 8 bit encoded
- ** sample values and write it to disk as alaw encoded samples.
- */
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < 256 ; k++)
- alaw_buffer [k] = k & 0xFF ;
-
- sf_write_raw (file, alaw_buffer, 256) ;
- sf_close (file) ;
-
- /* Now open that file and compare the alaw decoded sample values
- ** with what they should be.
- */
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_read_short (file, short_buffer, 256) != 256)
- { printf ("sf_read_short : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
-
- for (k = 0 ; k < 256 ; k++)
- if (short_buffer [k] != alaw_decode (alaw_buffer [k]))
- { printf ("Decoder error : sample #%d (0x%02X should be 0x%02X)\n", k, short_buffer [k], alaw_decode (alaw_buffer [k])) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf (" alaw_test : decoder ... ok\n") ;
-
- unlink (filename) ;
-
- return 0 ;
-} /* main */
-
-
-/*=================================================================================
-** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution.
-**
-** This code is not compiled into libsndfile. It is only used to test the
-** libsndfile lookup tables for correctness.
-**
-** I have included the original authors comments.
-*/
-
-/*
-** A-law routines by Graeme W. Gill.
-** Date: 93/5/7
-**
-** References:
-** 1) CCITT Recommendation G.711
-**
-*/
-
-#define ACLIP 31744
-
-static
-unsigned char alaw_encode (int sample)
-{ static int exp_lut[128] = {1,1,2,2,3,3,3,3,
- 4,4,4,4,4,4,4,4,
- 5,5,5,5,5,5,5,5,
- 5,5,5,5,5,5,5,5,
- 6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7};
-
- int sign, exponent, mantissa;
- unsigned char Alawbyte;
-
- /* Get the sample into sign-magnitude. */
- sign = ((~sample) >> 8) & 0x80 ; /* set aside the sign */
- if (sign == 0)
- sample = -sample ; /* get magnitude */
- if (sample > ACLIP)
- sample = ACLIP ; /* clip the magnitude */
-
- /* Convert from 16 bit linear to ulaw. */
- if (sample >= 256)
- { exponent = exp_lut [(sample >> 8) & 0x7F] ;
- mantissa = ( sample >> ( exponent + 3 ) ) & 0x0F ;
- Alawbyte = ((exponent << 4) | mantissa) ;
- }
- else
- Alawbyte = (sample >> 4) ;
-
- Alawbyte ^= (sign ^ 0x55) ;
-
- 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 ;
-
- 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 )) ;
- }
- else
- sample = (Alawbyte << 4) + 8 ;
- if (sign == 0)
- sample = -sample ;
-
- return sample ;
-} /* alaw_decode */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--- a/common/libsndfile/tests/double_test.c
+++ /dev/null
@@ -1,182 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <math.h>
-
-
-#include <sndfile.h>
-
-#define SAMPLE_RATE 11025
-#define BUFFER_SIZE (1<<14)
-
-static void scaled_test (char *str, char *filename, int filetype, int bitwidth, double tolerance) ;
-
-static int error_function (double data, double orig, double margin) ;
-static void gen_signal (double *data, unsigned int datalen) ;
-
-static double orig_data [BUFFER_SIZE] ;
-static double test_data [BUFFER_SIZE] ;
-
-int main (int argc, char *argv[])
-{
- scaled_test ("pcm8" , "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 8, 0.001) ;
- scaled_test ("pcm16", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 16, 0.001) ;
- scaled_test ("pcm24", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 24, 0.001) ;
- scaled_test ("pcm32", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 32, 0.001) ;
-
- scaled_test ("ulaw", "test.au", SF_FORMAT_AU | SF_FORMAT_ULAW, 16, 0.05) ;
- scaled_test ("alaw", "test.au", SF_FORMAT_AU | SF_FORMAT_ALAW, 16, 0.05) ;
-
- scaled_test ("imaadpcm", "test.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 16, 0.21) ;
- scaled_test ("msadpcm" , "test.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 16, 0.7) ;
- scaled_test ("gsm610" , "test.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 16, 3.0) ;
-
- scaled_test ("g721_32", "test.au", SF_FORMAT_AU | SF_FORMAT_G721_32, 16, 1.1) ;
- scaled_test ("g723_24", "test.au", SF_FORMAT_AU | SF_FORMAT_G723_24, 16, 1.1) ;
-
- return 0;
-} /* main */
-
-/*============================================================================================
- * Here are the test functions.
- */
-
-static
-void scaled_test (char *str, char *filename, int filetype, int bitwidth, double tolerance)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k ;
- double scale ;
-
- printf (" scaled_test : %s ", str) ;
- for (k = strlen (str) ; k < 10 ; k++)
- putchar ('.') ;
- putchar (' ') ;
-
- gen_signal (orig_data, BUFFER_SIZE) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = BUFFER_SIZE ;
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = bitwidth ;
- sfinfo.format = filetype ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_write_double (file, orig_data, BUFFER_SIZE, 1) != BUFFER_SIZE)
- { printf ("sf_write_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- memset (test_data, 0, sizeof (test_data)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != filetype)
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < BUFFER_SIZE)
- { printf ("Incorrect number of samples in file (too short). (%d should be %d)\n", sfinfo.samples, BUFFER_SIZE) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != bitwidth)
- { printf ("Incorrect bit width (%d => %d).\n", bitwidth, sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_double (file, test_data, BUFFER_SIZE, 1)) < 0.99 * BUFFER_SIZE)
- { printf ("short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- scale = bitwidth > 8 ? 32000.0 : 120.0 ;
- for (k = 0 ; k < BUFFER_SIZE ; k++)
- if (error_function (scale * test_data [k], scale * orig_data [k], tolerance))
- { printf ("Incorrect sample (#%d : %f should be %f).\n", k, test_data [k], orig_data [k]) ;
- exit (1) ;
- } ;
-
- unlink (filename) ;
-
- printf ("ok\n") ;
-} /* scaled_test */
-
-/*========================================================================================
-** Auxiliary functions
-*/
-
-static
-void gen_signal (double *data, unsigned int datalen)
-{ unsigned int k, ramplen ;
- double amp = 0.0 ;
-
- ramplen = datalen / 20 ;
-
- for (k = 0 ; k < datalen ; k++)
- { if (k <= ramplen)
- amp = k / ((double) ramplen) ;
- else if (k > datalen - ramplen)
- amp = (datalen - k) / ((double) ramplen) ;
- data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
- + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
- } ;
- return ;
-} /* gen_signal */
-
-static
-int error_function (double data, double orig, double margin)
-{ double error ;
-
- if (fabs (orig) <= 500.0)
- error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
- else if (fabs (orig) <= 1000.0)
- error = fabs (data - orig) / 3000.0 ;
- else
- error = fabs (data - orig) / fabs (orig) ;
-
- if (error > margin)
- { printf ("\n\n*******************\nError : %f\n", error) ;
- return 1 ;
- } ;
- return 0 ;
-} /* error_function */
-
--- a/common/libsndfile/tests/error_test.c
+++ /dev/null
@@ -1,53 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sndfile.h>
-
-extern int sf_error_number (int errnum, char *str, size_t maxlen) ;
-
-#define BUFFER_SIZE (1<<15)
-#define SHORT_BUFFER (256)
-
-static char strbuffer [BUFFER_SIZE] ;
-static char noerror [SHORT_BUFFER] ;
-
-int main (int argc, char *argv[])
-{ int k ;
-
- sf_error_number (0, noerror, SHORT_BUFFER) ;
-
- printf ("Testing to see if all internal error numbers have corresponding error messages :\n") ;
-
- for (k = 1 ; k < 1000 ; k++)
- { sf_error_number (k, strbuffer, BUFFER_SIZE) ;
- printf ("\t%3d : %s\n", k, strbuffer) ;
- if (! strcmp (strbuffer, noerror))
- break ;
- if (strstr (strbuffer, "This is a bug in libsndfile."))
- return 1 ;
- } ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/tests/lossy_comp_test.c
+++ /dev/null
@@ -1,1472 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <math.h>
-
-#include <sndfile.h>
-
-#ifndef M_PI
- #define M_PI 3.14159
-#endif
-
-#define BUFFER_SIZE (1<<14)
-#define SAMPLE_RATE 11025
-
-static void lcomp_test_short (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-static void lcomp_test_int (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-static void lcomp_test_double (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-
-static void sdlcomp_test_short (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-static void sdlcomp_test_int (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-static void sdlcomp_test_double (char *str, char *filename, int typemajor, int typeminor, double margin) ;
-
-static int error_function (double data, double orig, double margin) ;
-static int decay_response (int k) ;
-static void gen_signal (double *data, unsigned int datalen) ;
-static void smoothed_diff_short (short *data, unsigned int datalen) ;
-static void smoothed_diff_int (int *data, unsigned int datalen) ;
-static void smoothed_diff_double (double *data, unsigned int datalen) ;
-
-/* Force the start of these buffers to be double aligned. Sparc-solaris will
-** choke if they are not.
-*/
-static double data_buffer [BUFFER_SIZE + 1] ;
-static double orig_buffer [BUFFER_SIZE + 1] ;
-static double smooth_buffer [BUFFER_SIZE + 1] ;
-
-int main (int argc, char *argv[])
-{ char *filename ;
- int bDoAll = 0 ;
- int nTests = 0 ;
-
- if (argc != 2)
- { printf ("Usage : %s <test>\n", argv [0]) ;
- printf (" Where <test> is one of the following:\n") ;
- printf (" wav_ima - test IMA ADPCM WAV file functions\n") ;
- printf (" wav_msadpcm - test MS ADPCM WAV file functions\n") ;
- printf (" wav_gsm610 - test GSM 6.10 WAV file functions\n") ;
- printf (" wav_ulaw - test u-law WAV file functions\n") ;
- printf (" wav_alaw - test A-law WAV file functions\n") ;
- printf (" wav_pcm - test PCM WAV file functions\n") ;
- printf (" all - perform all tests\n") ;
- exit (1) ;
- } ;
-
- bDoAll = !strcmp (argv [1], "all") ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_pcm"))
- { filename = "test.wav" ;
- lcomp_test_short ("wav_pcm", filename, SF_FORMAT_WAV, SF_FORMAT_PCM, 0.00001) ;
- lcomp_test_int ("wav_pcm", filename, SF_FORMAT_WAV, SF_FORMAT_PCM, 0.00001) ;
- lcomp_test_double ("wav_pcm", filename, SF_FORMAT_WAV, SF_FORMAT_PCM, 0.005) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_ima"))
- { filename = "test.wav" ;
- lcomp_test_short ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
- lcomp_test_int ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
- lcomp_test_double ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
-
- sdlcomp_test_short ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
- sdlcomp_test_int ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
- sdlcomp_test_double ("wav_ima", filename, SF_FORMAT_WAV, SF_FORMAT_IMA_ADPCM, 0.17) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_msadpcm"))
- { filename = "test.wav" ;
- lcomp_test_short ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
- lcomp_test_int ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
- lcomp_test_double ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
-
- sdlcomp_test_short ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
- sdlcomp_test_int ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
- sdlcomp_test_double ("wav_msadpcm", filename, SF_FORMAT_WAV, SF_FORMAT_MS_ADPCM, 0.36) ;
-
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_ulaw"))
- { filename = "test.wav" ;
- lcomp_test_short ("wav_ulaw", filename, SF_FORMAT_WAV, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_int ("wav_ulaw", filename, SF_FORMAT_WAV, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_double ("wav_ulaw", filename, SF_FORMAT_WAV, SF_FORMAT_ULAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_alaw"))
- { filename = "test.wav" ;
- lcomp_test_short ("wav_alaw", filename, SF_FORMAT_WAV, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_int ("wav_alaw", filename, SF_FORMAT_WAV, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_double ("wav_alaw", filename, SF_FORMAT_WAV, SF_FORMAT_ALAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "wav_gsm610"))
- { filename = "test.wav" ;
- sdlcomp_test_short ("wav_gsm610", filename, SF_FORMAT_WAV, SF_FORMAT_GSM610, 0.2) ;
- sdlcomp_test_int ("wav_gsm610", filename, SF_FORMAT_WAV, SF_FORMAT_GSM610, 0.2) ;
- sdlcomp_test_double ("wav_gsm610", filename, SF_FORMAT_WAV, SF_FORMAT_GSM610, 0.2) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au_ulaw"))
- { filename = "test.au" ;
- lcomp_test_short ("au_ulaw", filename, SF_FORMAT_AU, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_int ("au_ulaw", filename, SF_FORMAT_AU, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_double ("au_ulaw", filename, SF_FORMAT_AU, SF_FORMAT_ULAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au_alaw"))
- { filename = "test.au" ;
- lcomp_test_short ("au_alaw", filename, SF_FORMAT_AU, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_int ("au_alaw", filename, SF_FORMAT_AU, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_double ("au_alaw", filename, SF_FORMAT_AU, SF_FORMAT_ALAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aule_ulaw"))
- { filename = "test.au" ;
- lcomp_test_short ("aule_ulaw", filename, SF_FORMAT_AULE, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_int ("aule_ulaw", filename, SF_FORMAT_AULE, SF_FORMAT_ULAW, 0.04) ;
- lcomp_test_double ("aule_ulaw", filename, SF_FORMAT_AULE, SF_FORMAT_ULAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aule_alaw"))
- { filename = "test.au" ;
- lcomp_test_short ("aule_alaw", filename, SF_FORMAT_AULE, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_int ("aule_alaw", filename, SF_FORMAT_AULE, SF_FORMAT_ALAW, 0.04) ;
- lcomp_test_double ("aule_alaw", filename, SF_FORMAT_AULE, SF_FORMAT_ALAW, 0.04) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au_g721"))
- { filename = "test.au" ;
- lcomp_test_short ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
- lcomp_test_int ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
- lcomp_test_double ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
-
- sdlcomp_test_short ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
- sdlcomp_test_int ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
- sdlcomp_test_double ("au_g721", filename, SF_FORMAT_AU, SF_FORMAT_G721_32, 0.05) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aule_g721"))
- { filename = "test.au" ;
- lcomp_test_short ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
- lcomp_test_int ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
- lcomp_test_double ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
-
- sdlcomp_test_short ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
- sdlcomp_test_int ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
- sdlcomp_test_double ("aule_g721", filename, SF_FORMAT_AULE, SF_FORMAT_G721_32, 0.05) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au_g723"))
- { filename = "test.au" ;
- lcomp_test_short ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
- lcomp_test_int ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
- lcomp_test_double ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
-
- sdlcomp_test_short ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
- sdlcomp_test_int ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
- sdlcomp_test_double ("au_g723", filename, SF_FORMAT_AU, SF_FORMAT_G723_24, 0.15) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aule_g723"))
- { filename = "test.au" ;
- lcomp_test_short ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
- lcomp_test_int ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
- lcomp_test_double ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
-
- sdlcomp_test_short ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
- sdlcomp_test_int ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
- sdlcomp_test_double ("aule_g723", filename, SF_FORMAT_AULE, SF_FORMAT_G723_24, 0.15) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (nTests == 0)
- { printf ("************************************\n") ;
- printf ("* No '%s' test defined.\n", argv [1]) ;
- printf ("************************************\n") ;
- return 1 ;
- } ;
-
- return 0;
-} /* main */
-
-/*============================================================================================
-** Here are the test functions.
-*/
-
-static
-void lcomp_test_short (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- short *orig, *data ;
-
- printf (" lcomp_test_short : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- orig = (short*) orig_buffer ;
- data = (short*) data_buffer ;
- gen_signal (orig_buffer, datalen) ;
- for (k = 0 ; k < datalen ; k++)
- orig [k] = (short) (orig_buffer [k]) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_short (file, orig, datalen)) != datalen)
- { printf ("sf_write_short failed with short write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (short)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + datalen/2))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", sfinfo.samples, datalen) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_short (file, data, datalen)) < 0.99 * datalen)
- { printf ("short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen ; k++)
- { if (error_function ((double) data [k], (double) orig [k], margin))
- { printf ("Incorrect sample A (#%d : %d should be %d).\n", k, data [k], orig [k]) ;
- exit (1) ;
- } ;
- } ;
-
- if ((k = sf_read_short (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", sfinfo.samples - datalen, k) ;
- exit (1) ;
- } ;
-
- if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
- for (k = 0 ; k < sfinfo.samples - datalen ; k++)
- if (abs (data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, data [k], decay_response (k)) ;
- exit (1) ;
- } ;
-
- if (! sfinfo.seekable)
- { printf ("ok\n") ;
- return ;
- } ;
-
- /* Now test sf_seek function. */
-
- if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_short (file, data, datalen/7)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function ((double) data [k], (double) orig [k + m * (datalen / 7)], margin))
- { printf ("Incorrect sample C (#%d : %d => %d).\n", k + m * (datalen / 7), orig [k + m * (datalen / 7)], data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ;
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_short (file, data, 1)) != 1)
- { printf ("sf_read_short (file, data, 1) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_short failed (%d, %d).\n", orig [1], data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_short (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_short past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", data [0], orig [5]) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* lcomp_test_short */
-
-/*--------------------------------------------------------------------------------------------
-*/
-
-static
-void lcomp_test_int (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- int *orig, *data ;
-
- printf (" lcomp_test_int : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- data = (int*) data_buffer ;
- orig = (int*) orig_buffer ;
- gen_signal (orig_buffer, datalen) ;
- for (k = 0 ; k < datalen ; k++)
- orig [k] = (int) (orig_buffer [k]) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_int (file, orig, datalen)) != datalen)
- { printf ("sf_write_int failed with short write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (short)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + datalen/2))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_int (file, data, datalen)) != datalen)
- { printf ("short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen ; k++)
- { if (error_function ((double) data [k], (double) orig [k], margin))
- { printf ("Incorrect sample A (#%d : %d should be %d).\n", k, data [k], orig [k]) ;
- exit (1) ;
- } ;
- } ;
-
- if ((k = sf_read_int (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", sfinfo.samples - datalen, k) ;
- exit (1) ;
- } ;
-
- if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
- for (k = 0 ; k < sfinfo.samples - datalen ; k++)
- if (abs (data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, data [k], decay_response (k)) ;
- exit (1) ;
- } ;
-
- if (! sfinfo.seekable)
- { printf ("ok\n") ;
- return ;
- } ;
-
- /* Now test sf_seek function. */
-
- if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_int (file, data, datalen/7)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function ((double) data [k], (double) orig [k + m * (datalen / 7)], margin))
- { printf ("Incorrect sample C (#%d : %d => %d).\n", k + m * (datalen / 7), orig [k + m * (datalen / 7)], data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ;
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_int (file, data, 1)) != 1)
- { printf ("sf_read_int (file, data, 1) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_int failed (%d, %d).\n", orig [1], data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_int (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_int failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_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_read_int failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_int (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_int past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_int (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", data [0], orig [5]) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* lcomp_test_int */
-
-/*--------------------------------------------------------------------------------------------
-*/
-
-static
-void lcomp_test_double (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- double *orig, *data ;
-
- printf (" lcomp_test_double : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- orig = (double*) orig_buffer ;
- data = (double*) data_buffer ;
- gen_signal (orig_buffer, datalen) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_double (file, orig, datalen, 0)) != datalen)
- { printf ("sf_write_double failed with double write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (double)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + datalen/2))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != datalen)
- { printf ("double read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen ; k++)
- if (error_function (data [k], orig [k], margin))
- { printf ("Incorrect sample A (#%d : %f should be %f).\n", k, data [k], orig [k]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", sfinfo.samples - datalen, k) ;
- exit (1) ;
- } ;
-
- if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
- for (k = 0 ; k < sfinfo.samples - datalen ; k++)
- if (abs ((int) data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, (int) data [k], decay_response (k)) ;
- exit (1) ;
- } ;
-
- if (! sfinfo.seekable)
- { printf ("ok\n") ;
- return ;
- } ;
-
- /* Now test sf_seek function. */
-
- if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_double (file, data, datalen/7, 0)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function (data [k], orig [k + m * (datalen / 7)], margin))
- { printf ("Incorrect sample C (#%d : %d => %d).\n", k + m * (datalen / 7), (int) orig [k + m * (datalen / 7)], (int) data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", (int) data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ;
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_double (file, data, 1, 0)) != 1)
- { printf ("sf_read_double (file, data, 1, 0) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_double failed (%d, %d).\n", (int) orig [1], (int) data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_double (file, data, 1, 0) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", (int) data [0], (int) orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_double (file, data, 1, 0) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", (int) data [0], (int) orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_double past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_double (file, data, 1, 0) ;
- if (error_function (data [0], orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_double failed (%d, %d).\n", (int) data [0], (int) orig [5]) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* lcomp_test_double */
-
-/*========================================================================================
-** Smoothed differential loss compression tests.
-*/
-
-static
-void sdlcomp_test_short (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- short *orig, *data, *smooth ;
-
- printf (" sdlcomp_test_short : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- orig = (short*) orig_buffer ;
- data = (short*) data_buffer ;
- smooth = (short*) smooth_buffer ;
-
- gen_signal (orig_buffer, datalen) ;
- for (k = 0 ; k < datalen ; k++)
- orig [k] = (short) (orig_buffer [k]) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_short (file, orig, datalen)) != datalen)
- { printf ("sf_write_short failed with short write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (short)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + 400))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", sfinfo.samples, datalen) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_short (file, data, datalen)) != datalen)
- { printf ("short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- memcpy (smooth, orig, datalen * sizeof (short)) ;
- smoothed_diff_short (data, datalen) ;
- smoothed_diff_short (smooth, datalen) ;
-
- for (k = 1 ; k < datalen ; k++)
- { if (error_function ((double) data [k], (double) smooth [k], margin))
- { printf ("Incorrect sample A (#%d : %d should be %d).\n", k, data [k], smooth [k]) ;
- exit (1) ;
- } ;
- } ;
-
- if ((k = sf_read_short (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", k, sfinfo.samples - 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.samples - datalen ; k++)
- if (abs (data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, data [k], decay_response (k)) ;
- exit (1) ;
- } ;
-
- /* Now test sf_seek function. */
- if (sfinfo.seekable)
- { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_short (file, data, datalen/7)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- smoothed_diff_short (data, datalen/7) ;
- memcpy (smooth, orig + m * datalen/7, datalen/7 * sizeof (short)) ;
- smoothed_diff_short (smooth, datalen/7) ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function ((double) data [k], (double) smooth [k], margin))
- { printf ("Incorrect sample C (#%d (%d) : %d => %d).\n", k, k + m * (datalen / 7), smooth [k], data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ; /* for (m = 0 ; m < 3 ; m++) */
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_short (file, data, 1)) != 1)
- { printf ("sf_read_short (file, data, 1) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_short failed (%d, %d).\n", orig [1], data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_short (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_short past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
-
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_short (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", data [0], orig [5]) ;
- exit (1) ;
- } ;
- } /* if (sfinfo.seekable) */
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* sdlcomp_test_short */
-
-static
-void sdlcomp_test_int (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- int *orig, *data, *smooth ;
-
- printf (" sdlcomp_test_int : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- orig = (int*) orig_buffer ;
- data = (int*) data_buffer ;
- smooth = (int*) smooth_buffer ;
-
- gen_signal (orig_buffer, datalen) ;
- for (k = 0 ; k < datalen ; k++)
- orig [k] = (int) (orig_buffer [k]) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_int (file, orig, datalen)) != datalen)
- { printf ("sf_write_int failed with int write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (int)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + 400))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", sfinfo.samples, datalen) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_int (file, data, datalen)) != datalen)
- { printf ("int read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- memcpy (smooth, orig, datalen * sizeof (int)) ;
- smoothed_diff_int (data, datalen) ;
- smoothed_diff_int (smooth, datalen) ;
-
- for (k = 1 ; k < datalen ; k++)
- { if (error_function ((double) data [k], (double) smooth [k], margin))
- { printf ("Incorrect sample A (#%d : %d should be %d).\n", k, data [k], smooth [k]) ;
- exit (1) ;
- } ;
- } ;
-
- if ((k = sf_read_int (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", k, sfinfo.samples - 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.samples - datalen ; k++)
- if (abs (data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, data [k], decay_response (k)) ;
- exit (1) ;
- } ;
-
- /* Now test sf_seek function. */
- if (sfinfo.seekable)
- { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_int (file, data, datalen/7)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- smoothed_diff_int (data, datalen/7) ;
- memcpy (smooth, orig + m * datalen/7, datalen/7 * sizeof (int)) ;
- smoothed_diff_int (smooth, datalen/7) ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function ((double) data [k], (double) smooth [k], margin))
- { printf ("Incorrect sample C (#%d (%d) : %d => %d).\n", k, k + m * (datalen / 7), smooth [k], data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ; /* for (m = 0 ; m < 3 ; m++) */
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_int (file, data, 1)) != 1)
- { printf ("sf_read_int (file, data, 1) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_int failed (%d, %d).\n", orig [1], data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_int (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_int failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_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_read_int failed (%d, %d) (%d, %d).\n", data [0], orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_int (file, data, datalen)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_int past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
-
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_int (file, data, 1) ;
- if (error_function ((double) data [0], (double) orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_int failed (%d should be %d).\n", data [0], orig [5]) ;
- exit (1) ;
- } ;
- } /* if (sfinfo.seekable) */
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* sdlcomp_test_int */
-
-static
-void sdlcomp_test_double (char *str, char *filename, int typemajor, int typeminor, double margin)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, m, seekpos ;
- unsigned int datalen ;
- double *orig, *data, *smooth ;
-
- printf (" sdlcomp_test_double : %s ... ", str) ;
-
- datalen = BUFFER_SIZE ;
-
- orig = orig_buffer ;
- data = data_buffer ;
- smooth = smooth_buffer ;
-
- gen_signal (orig_buffer, datalen) ;
-
- sfinfo.samplerate = SAMPLE_RATE ;
- sfinfo.samples = 123456789 ; /* Ridiculous value. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_double (file, orig, datalen, 0)) != datalen)
- { printf ("sf_write_double failed with int write (%d => %d).\n", datalen, k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, datalen * sizeof (double)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < datalen)
- { printf ("Too few samples in file. (%d should be a little more than %d)\n", datalen, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples > (datalen + 400))
- { printf ("Too many samples in file. (%d should be a little more than %d)\n", sfinfo.samples, datalen) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != datalen)
- { printf ("int read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- memcpy (smooth, orig, datalen * sizeof (double)) ;
- smoothed_diff_double (data, datalen) ;
- smoothed_diff_double (smooth, datalen) ;
-
- for (k = 1 ; k < datalen ; k++)
- { if (error_function (data [k], smooth [k], margin))
- { printf ("Incorrect sample A (#%d : %d should be %d).\n", k, (int) data [k], (int) smooth [k]) ;
- exit (1) ;
- } ;
- } ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != sfinfo.samples - datalen)
- { printf ("Incorrect read length A (%d should be %d).\n", k, sfinfo.samples - 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.samples - datalen ; k++)
- if (abs (data [k]) > decay_response (k))
- { printf ("Incorrect sample B (#%d : abs (%d) should be < %d).\n", datalen + k, (int) data [k], (int) decay_response (k)) ;
- exit (1) ;
- } ;
-
- /* Now test sf_seek function. */
- if (sfinfo.seekable)
- { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
- { printf ("Seek to start of file failed (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (m = 0 ; m < 3 ; m++)
- { if ((k = sf_read_double (file, data, datalen/7, 0)) != datalen / 7)
- { printf ("Incorrect read length B (%d => %d).\n", datalen / 7, k) ;
- exit (1) ;
- } ;
-
- smoothed_diff_double (data, datalen/7) ;
- memcpy (smooth, orig + m * datalen/7, datalen/7 * sizeof (double)) ;
- smoothed_diff_double (smooth, datalen/7) ;
-
- for (k = 0 ; k < datalen/7 ; k++)
- if (error_function ((double) data [k], (double) smooth [k], margin))
- { printf ("Incorrect sample C (#%d (%d) : %d => %d).\n", k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
- for (m = 0 ; m < 10 ; m++)
- printf ("%d ", (int) data [k]) ;
- printf ("\n") ;
- exit (1) ;
- } ;
- } ; /* for (m = 0 ; m < 3 ; m++) */
-
- seekpos = BUFFER_SIZE / 10 ;
-
- /* Check seek from start of file. */
- if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
- { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
- exit (1) ;
- } ;
- if ((k = sf_read_double (file, data, 1, 0)) != 1)
- { printf ("sf_read_double (file, data, 1) returned %d.\n", k) ;
- exit (1) ;
- } ;
-
- if (error_function ((double) data [0], (double) orig [seekpos], margin))
- { printf ("sf_seek (SEEK_SET) followed by sf_read_double failed (%d, %d).\n", (int) orig [1], (int) data [0]) ;
- exit (1) ;
- } ;
-
- if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
- { printf ("sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
- k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
- sf_read_double (file, data, 1, 0) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (forwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", (int) data [0], (int) orig [seekpos], k, seekpos + 1) ;
- exit (1) ;
- } ;
-
- seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
- /* Check seek backward from current position. */
- k = sf_seek (file, -20, SEEK_CUR) ;
- sf_read_double (file, data, 1, 0) ;
- if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos)
- { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", (int) data [0], (int) orig [seekpos], k, seekpos) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- sf_seek (file, (int) datalen, SEEK_SET) ;
-
- if ((k = sf_read_double (file, data, datalen, 0)) != sfinfo.samples - datalen)
- { printf ("Return value from sf_read_double past end of file incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
-
- if ((k = sf_seek (file, 5 - (int) sfinfo.samples, SEEK_END)) != 5)
- { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ;
- exit (1) ;
- } ;
-
- sf_read_double (file, data, 1, 0) ;
- if (error_function ((double) data [0], (double) orig [5], margin))
- { printf ("sf_seek (SEEK_END) followed by sf_read_double failed (%d should be %d).\n", (int) data [0], (int) orig [5]) ;
- exit (1) ;
- } ;
- } /* if (sfinfo.seekable) */
-
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* sdlcomp_test_double */
-
-/*========================================================================================
-** Auxiliary functions
-*/
-
-static
-int decay_response (int k)
-{ if (k < 1)
- return ((int) 30000.0) ;
- return (int) (30000.0 / (0.5 * k * k)) ;
-} /* decay_response */
-
-static
-void gen_signal (double *data, unsigned int datalen)
-{ unsigned int k, ramplen ;
- double amp = 0.0 ;
-
- ramplen = datalen / 20 ;
-
- for (k = 0 ; k < datalen ; k++)
- { if (k <= ramplen)
- amp = 30000.0 * k / ((double) ramplen) ;
- else if (k > datalen - ramplen)
- amp = 30000.0 * (datalen - k) / ((double) ramplen) ;
- data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
- + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
- } ;
- return ;
-} /* gen_signal */
-
-static
-int error_function (double data, double orig, double margin)
-{ double error ;
-
- if (fabs (orig) <= 500.0)
- error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
- else if (fabs (orig) <= 1000.0)
- error = fabs (data - orig) / 3000.0 ;
- else
- error = fabs (data - orig) / fabs (orig) ;
-
- if (error > margin)
- { printf ("\n\n*******************\nError : %f\n", error) ;
- return 1 ;
- } ;
- return 0 ;
-} /* error_function */
-
-static
-void smoothed_diff_short (short *data, unsigned int datalen)
-{ unsigned int k ;
- double memory = 0.0 ;
-
- /* Calculate the smoothed sample-to-sample difference. */
- for (k = 0 ; k < datalen - 1 ; k++)
- { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ;
- data [k] = (short) memory ;
- } ;
- data [datalen-1] = data [datalen-2] ;
-
-} /* smoothed_diff_short */
-
-static
-void smoothed_diff_int (int *data, unsigned int datalen)
-{ unsigned int k ;
- double memory = 0.0 ;
-
- /* Calculate the smoothed sample-to-sample difference. */
- for (k = 0 ; k < datalen - 1 ; k++)
- { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ;
- data [k] = (int) memory ;
- } ;
- data [datalen-1] = data [datalen-2] ;
-
-} /* smoothed_diff_int */
-
-static
-void smoothed_diff_double (double *data, unsigned int datalen)
-{ unsigned int k ;
- double memory = 0.0 ;
-
- /* Calculate the smoothed sample-to-sample difference. */
- for (k = 0 ; k < datalen - 1 ; k++)
- { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ;
- data [k] = memory ;
- } ;
- data [datalen-1] = data [datalen-2] ;
-
-} /* smoothed_diff_double */
--- a/common/libsndfile/tests/read_seek_test.c
+++ /dev/null
@@ -1,627 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <sndfile.h>
-
-static unsigned char wav_ieee [] =
-{ 0x52, 0x49, 0x46, 0x46, 0x64, 0x00, 0x00, 0x00,
- 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
- 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
- 0x34, 0x12, 0x00, 0x00, 0xD0, 0x48, 0x00, 0x00,
- 0x04, 0x00, 0x20, 0x00, 0x64, 0x61, 0x74, 0x61,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x40,
- 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40,
- 0x00, 0x00, 0xA0, 0x40, 0x00, 0x00, 0xC0, 0x40,
- 0x00, 0x00, 0xE0, 0x40, 0x00, 0x00, 0x00, 0x41,
- 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41,
- 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41,
- 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41,
- 0x00, 0x00, 0x70, 0x41, 0x49, 0x4E, 0x46, 0x4F,
- 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
-} ; /* wav_ieee */
-
-static unsigned char wav_pcm32 [] =
-{ 0x52, 0x49, 0x46, 0x46, 0x64, 0x00, 0x00, 0x00,
- 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
- 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
- 0x34, 0x12, 0x00, 0x00, 0xD0, 0x48, 0x00, 0x00,
- 0x04, 0x00, 0x20, 0x00, 0x64, 0x61, 0x74, 0x61,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
- 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
- 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
- 0x0F, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x46, 0x4F,
- 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
-} ; /* wav_pcm32 */
-
-static unsigned char wav_pcm24 [] =
-{ 0x52, 0x49, 0x46, 0x46, 0x54, 0x00, 0x00, 0x00,
- 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
- 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
- 0x34, 0x12, 0x00, 0x00, 0x9C, 0x36, 0x00, 0x00,
- 0x03, 0x00, 0x18, 0x00, 0x64, 0x61, 0x74, 0x61,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00,
- 0x00, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09,
- 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0B, 0x00, 0x00,
- 0x0C, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00,
- 0x00, 0x0F, 0x00, 0x00, 0x49, 0x4E, 0x46, 0x4F,
- 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
-} ; /* wav_pcm24 */
-
-static unsigned char wav_pcm16 [] =
-{ 0x52, 0x49, 0x46, 0x46, 0x44, 0x00, 0x00, 0x00,
- 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
- 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
- 0x34, 0x12, 0x00, 0x00, 0x24, 0x68, 0x00, 0x00,
- 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61,
- 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00,
- 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00,
- 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00,
- 0x0E, 0x00, 0x0F, 0x00, 0x49, 0x4E, 0x46, 0x4F,
- 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
-} ; /* wav_pcm16 */
-
-static unsigned char wav_pcm8 [] =
-{ 0x52, 0x49, 0x46, 0x46, 0x34, 0x00, 0x00, 0x00,
- 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
- 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
- 0x34, 0x12, 0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
- 0x01, 0x00, 0x08, 0x00, 0x64, 0x61, 0x74, 0x61,
- 0x10, 0x00, 0x00, 0x00, 0x80, 0x81, 0x82, 0x83,
- 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B,
- 0x8C, 0x8D, 0x8E, 0x8F, 0x49, 0x4E, 0x46, 0x4F,
- 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
-} ; /* wav_pcm8 */
-
-static unsigned char aiff_pcm32 [] =
-{ 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x6E,
- 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D,
- 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x10, 0x00, 0x20, 0x40, 0x0B, 0x91, 0xA0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53,
- 0x4E, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
- 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
- 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
- 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00,
- 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00,
- 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F
-} ; /* aiff_pcm32 */
-
-static unsigned char aiff_pcm24 [] =
-{ 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x5E,
- 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D,
- 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x10, 0x00, 0x18, 0x40, 0x0B, 0x91, 0xA0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53,
- 0x4E, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00,
- 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05,
- 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00,
- 0x00, 0x0B, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0D,
- 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F
-} ; /* aiff_pcm24 */
-
-static unsigned char aiff_pcm16 [] =
-{ 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x4E,
- 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D,
- 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x10, 0x00, 0x10, 0x40, 0x0B, 0x91, 0xA0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53,
- 0x4E, 0x44, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
- 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08,
- 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C,
- 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F
-} ; /* aiff_pcm16 */
-
-
-static unsigned char aiff_pcm8 [] =
-{ 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x3E,
- 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D,
- 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x10, 0x00, 0x08, 0x40, 0x0B, 0x91, 0xA0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53,
- 0x4E, 0x44, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
- 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
-} ; /* aiff_pcm8 */
-
-
-static unsigned char au_pcm32 [] =
-{ 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18,
- 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x05,
- 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
- 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07,
- 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09,
- 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B,
- 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D,
- 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F
-} ; /* au_pcm32 */
-
-static unsigned char au_pcm24 [] =
-{ 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18,
- 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04,
- 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00,
- 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07,
- 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x00, 0x00,
- 0x0A, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0C, 0x00,
- 0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F
-} ; /* au_pcm24 */
-
-static unsigned char au_pcm16 [] =
-{ 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18,
- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
- 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07,
- 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B,
- 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F
-} ; /* au_pcm16 */
-
-static unsigned char au_pcm8 [] =
-{ 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18,
- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
-} ; /* au_pcm8 */
-
-static
-void write_file (char *filename, unsigned char *data, size_t len)
-{ FILE* fp = NULL ;
-
- fp = fopen (filename,"wb") ;
-
- if (fp == NULL)
- { printf ("Could not open file '%s' for writing.\n", filename) ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (fwrite (data, 1, len, fp) != len)
- { printf ("Write to file '%s' failed.\n", filename) ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- fclose (fp) ;
-} /* write_file */
-
-static
-void double_test (char *filename, int length)
-{ int k, count ;
- SNDFILE *file ;
- SF_INFO sfinfo ;
- double *readdata ;
-
- printf (" double_test (%s) ... ", filename) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Could not open file '%s' for read.\n", filename) ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != length)
- { printf ("Expecting %d samples in file, found %d.\n", length, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- readdata = (double*) malloc (sfinfo.samples * sizeof (double)) ;
-
- if ((count = sf_read_double (file, readdata, sfinfo.samples, 0)) != sfinfo.samples)
- { printf ("sf_read_double failed (%d items read).\n", count) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < sfinfo.samples ; k++)
- if (readdata [k] != (double) (k))
- { printf ("Incorrect sample (#%d => %g).\n", k, readdata [k]) ;
- exit (1) ;
- } ;
-
- /* Check seek from start of file. */
- k = sf_seek (file, 1, SEEK_SET) ;
- sf_read_double (file, readdata, 1, 0) ;
- if (readdata [0] != 1 || k != 1)
- { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).\n", ((int) readdata [0]), k) ;
- exit (1) ;
- } ;
-
- /* Check seek forward from current position. */
- k = sf_seek (file, 2, SEEK_CUR) ;
- sf_read_double (file, readdata, 1, 0) ;
- if (readdata [0] != 4 || k != 4)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", ((int) readdata [0]), k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from current position. */
- k = sf_seek (file, -2, SEEK_CUR) ;
- sf_read_double (file, readdata, 1, 0) ;
- if (readdata [0] != 3 || k != 3)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", ((int) readdata [0]), k) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- if ((k = sf_read_double (file, readdata, sfinfo.samples, 0)) != 12)
- { printf ("Return value from short sf_read_XXXX incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- k = sf_seek (file, -14, SEEK_END) ;
- sf_read_double (file, readdata, 1, 0) ;
- if (readdata [0] != 2 || k != 2)
- { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).\n", ((int) readdata [0]), k) ;
- exit (1) ;
- } ;
-
- /* Check multiple reads. */
- k = sf_seek (file, 0, SEEK_SET) ;
- count = 0 ;
- while ((k = sf_read_double (file, readdata, 3, 0)))
- count += k ;
- if (count != sfinfo.samples)
- { printf ("failed multiple read test (%d, %d).\n", count, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- free (readdata) ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-
-} /* double_test */
-
-
-static
-void int_test (char *filename, int length)
-{ int count, k ;
- SNDFILE *file ;
- SF_INFO sfinfo ;
- int *readdata ;
-
- printf (" int_test (%s) ... ", filename) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Could not open file '%s' for read.\n", filename) ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != length)
- { printf ("Expecting %d samples in file, found %d.\n", length, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- readdata = (int*) malloc (sfinfo.samples * sizeof (int)) ;
-
- if ((count = sf_read_int (file, readdata, sfinfo.samples)) != sfinfo.samples)
- { printf ("sf_read_int failed (%d items read).\n", count) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < sfinfo.samples ; k++)
- if (readdata [k] != (int) (k))
- { printf ("Incorrect sample (#%d => %d).\n", k, readdata [k]) ;
- exit (1) ;
- } ;
-
- /* Check seek from start of file. */
- k = sf_seek (file, 1, SEEK_SET) ;
- sf_read_int (file, readdata, 1) ;
- if (readdata [0] != 1 || k != 1)
- { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check seek forward from current position. */
- k = sf_seek (file, 2, SEEK_CUR) ;
- sf_read_int (file, readdata, 1) ;
- if (readdata [0] != 4 || k != 4)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from current position. */
- k = sf_seek (file, -2, SEEK_CUR) ;
- sf_read_int (file, readdata, 1) ;
- if (readdata [0] != 3 || k != 3)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- if ((k = sf_read_int (file, readdata, sfinfo.samples)) != 12)
- { printf ("Return value from short sf_read_XXXX incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- k = sf_seek (file, -14, SEEK_END) ;
- sf_read_int (file, readdata, 1) ;
- if (readdata [0] != 2 || k != 2)
- { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check multiple reads. */
- k = sf_seek (file, 0, SEEK_SET) ;
- count = 0 ;
- while ((k = sf_read_int (file, readdata, 3)))
- count += k ;
- if (count != sfinfo.samples)
- { printf ("failed multiple read test (%d, %d).\n", count, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- free (readdata) ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-
-} /* int_test */
-
-static
-void short_test (char *filename, int length)
-{ int count, k ;
- SNDFILE *file ;
- SF_INFO sfinfo ;
- short *readdata ;
-
- printf (" short_test (%s) ... ", filename) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Could not open file '%s' for read.\n", filename) ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != length)
- { printf ("Expecting %d samples in file, found %d.\n", length, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- readdata = (short*) malloc (sfinfo.samples * sizeof (short)) ;
-
- if ((count = sf_read_short (file, readdata, sfinfo.samples)) != sfinfo.samples)
- { printf ("sf_read_short failed (%d items read).\n", count) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < sfinfo.samples ; k++)
- if (readdata [k] != (short) (k))
- { printf ("Incorrect sample (#%d => %d).\n", k, readdata [k]) ;
- exit (1) ;
- } ;
-
- /* Check seek from start of file. */
- k = sf_seek (file, 1, SEEK_SET) ;
- sf_read_short (file, readdata, 1) ;
- if (readdata [0] != 1 || k != 1)
- { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check seek forward from current position. */
- k = sf_seek (file, 2, SEEK_CUR) ;
- sf_read_short (file, readdata, 1) ;
- if (readdata [0] != 4 || k != 4)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from current position. */
- k = sf_seek (file, -2, SEEK_CUR) ;
- sf_read_short (file, readdata, 1) ;
- if (readdata [0] != 3 || k != 3)
- { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check that read past end of file returns number of items. */
- if ((k = sf_read_short (file, readdata, sfinfo.samples)) != 12)
- { printf ("Return value from short sf_read_XXXX incorrect (%d).\n", k) ;
- exit (1) ;
- } ;
-
- /* Check seek backward from end. */
- k = sf_seek (file, -14, SEEK_END) ;
- sf_read_short (file, readdata, 1) ;
- if (readdata [0] != 2 || k != 2)
- { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).\n", readdata [0], k) ;
- exit (1) ;
- } ;
-
- /* Check multiple reads. */
- k = sf_seek (file, 0, SEEK_SET) ;
- count = 0 ;
- while ((k = sf_read_short (file, readdata, 3)))
- count += k ;
- if (count != sfinfo.samples)
- { printf ("failed multiple read test (%d, %d).\n", count, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- free (readdata) ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-
-} /* short_test */
-
-int main (int argc, char *argv [])
-{ char *filename ;
- int bDoAll = 0 ;
- int nTests = 0 ;
-
- if (argc != 2)
- { printf ("Usage : %s <test>\n", argv [0]) ;
- printf (" Where <test> is one of the following:\n") ;
- printf (" wav - test WAV file functions (little endian)\n") ;
- printf (" aiff - test AIFF file functions (big endian)\n") ;
- printf (" au - test AU file functions (big endian)\n") ;
- /*
- ** printf (" paf - test PAF file functions (little endian)\n") ;
- ** printf (" svx - test SVX file functions (big endian)\n") ;
- ** printf (" nist - test NIST file functions (little endian)\n") ;
- */
- printf (" all - perform all tests\n") ;
- exit (1) ;
- } ;
-
- bDoAll = !strcmp (argv [1], "all") ;
-
- if (bDoAll || ! strcmp (argv [1], "wav"))
- { filename = "wav_pcm8.wav" ;
- write_file (filename, wav_pcm8, sizeof (wav_pcm8)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "wav_pcm16.wav" ;
- write_file (filename, wav_pcm16, sizeof (wav_pcm16)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "wav_pcm24.wav" ;
- write_file (filename, wav_pcm24, sizeof (wav_pcm24)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "wav_pcm32.wav" ;
- write_file (filename, wav_pcm32, sizeof (wav_pcm32)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "wav_ieee.wav" ;
- write_file (filename, wav_ieee, sizeof (wav_ieee)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aiff"))
- { filename = "aiff_pcm8.aiff" ;
- write_file (filename, aiff_pcm8, sizeof (aiff_pcm8)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "aiff_pcm16.aiff" ;
- write_file (filename, aiff_pcm16, sizeof (aiff_pcm16)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "aiff_pcm24.aiff" ;
- write_file (filename, aiff_pcm24, sizeof (aiff_pcm24)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "aiff_pcm32.aiff" ;
- write_file (filename, aiff_pcm32, sizeof (aiff_pcm32)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au"))
- { filename = "au_pcm8.au" ;
- write_file (filename, au_pcm8, sizeof (au_pcm8)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "au_pcm16.au" ;
- write_file (filename, au_pcm16, sizeof (au_pcm16)) ;
- short_test (filename, 16) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "au_pcm24.au" ;
- write_file (filename, au_pcm24, sizeof (au_pcm24)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
-
- filename = "au_pcm32.au" ;
- write_file (filename, au_pcm32, sizeof (au_pcm32)) ;
- int_test (filename, 16) ;
- double_test (filename, 16) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (nTests == 0)
- { printf ("************************************\n") ;
- printf ("* No '%s' test defined.\n", argv [1]) ;
- printf ("************************************\n") ;
- return 1 ;
- }
-
- return 0;
-} /* main */
-
-/*============================================================================================
- * Here are the test functions.
- */
-
--- a/common/libsndfile/tests/sftest.c
+++ /dev/null
@@ -1,62 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <unistd.h>
-
-#include <sndfile.h>
-
-#define BUFFER_SIZE (1024)
-
-
-static short buffer [BUFFER_SIZE] ;
-
-int main (int argc, char *argv[])
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- int k, count, max = 0, total = 0 ;
-
- if (argc < 2)
- { printf ("Expecting input file name.\n") ;
- return 0 ;
- } ;
-
- if (! (file = sf_open_read (argv [1], &sfinfo)))
- { printf ("sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- while ((count = sf_read_short (file, buffer, BUFFER_SIZE)))
- { for (k = 0 ; k < count ; k++)
- if (abs (buffer [k]) > max)
- max = abs (buffer [k]) ;
- total += count ;
- } ;
-
- printf ("Total : %d\n", total) ;
- printf ("Maximun value : %d\n", max) ;
-
- sf_close (file) ;
-
- return 0 ;
-} /* main */
-
-
--- a/common/libsndfile/tests/sfversion.c
+++ /dev/null
@@ -1,38 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sndfile.h>
-
-#define BUFFER_SIZE (256)
-
-static char strbuffer [BUFFER_SIZE] ;
-
-int main (int argc, char *argv[])
-{ sf_get_lib_version (strbuffer, BUFFER_SIZE) ;
-
- printf (strbuffer) ;
-
- return 0 ;
-} /* main */
-
--- a/common/libsndfile/tests/ulaw_test.c
+++ /dev/null
@@ -1,241 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <unistd.h>
-
-#include <sndfile.h>
-
-#define BUFFER_SIZE (65536)
-
-static unsigned char ulaw_encode (int sample) ;
-static int ulaw_decode (unsigned int ulawbyte) ;
-
-static short short_buffer [BUFFER_SIZE] ;
-static unsigned char ulaw_buffer [BUFFER_SIZE] ;
-
-int main (int argc, char *argv[])
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- char *filename ;
- int k ;
-
- filename = "test.au" ;
-
- sfinfo.format = SF_FORMAT_AU | SF_FORMAT_ULAW ;
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- /* Generate a file containing all possible 16 bit sample values
- ** and write it to disk as ulaw encoded samples.
- */
-
- for (k = 0 ; k < 0x10000 ; k++)
- short_buffer [k] = k & 0xFFFF ;
-
- sf_write_short (file, short_buffer, BUFFER_SIZE) ;
- sf_close (file) ;
-
- /* Now open that file and compare the ulaw encoded sample values
- ** with what they should be.
- */
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_read_raw (file, ulaw_buffer, BUFFER_SIZE) != BUFFER_SIZE)
- { printf ("sf_read_raw : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < 0x10000 ; k++)
- if (ulaw_encode (short_buffer [k]) != ulaw_buffer [k])
- { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, ulaw_buffer [k], ulaw_encode (short_buffer [k])) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf (" ulaw_test : encoder ... ok\n") ;
-
- /* Now generate a file containing all possible 8 bit encoded
- ** sample values and write it to disk as ulaw encoded samples.
- */
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < 256 ; k++)
- ulaw_buffer [k] = k & 0xFF ;
-
- sf_write_raw (file, ulaw_buffer, 256) ;
- sf_close (file) ;
-
- /* Now open that file and compare the ulaw decoded sample values
- ** with what they should be.
- */
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_read_short (file, short_buffer, 256) != 256)
- { printf ("sf_read_short : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
-
- for (k = 0 ; k < 256 ; k++)
- if (short_buffer [k] != ulaw_decode (ulaw_buffer [k]))
- { printf ("Decoder error : sample #%d (0x%04X should be 0x%04X)\n", k, short_buffer [k], ulaw_decode (ulaw_buffer [k])) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- printf (" ulaw_test : decoder ... ok\n") ;
-
- unlink (filename) ;
-
- return 0 ;
-} /* main */
-
-
-/*=================================================================================
-** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution.
-**
-** This code is not compiled into libsndfile. It is only used to test the
-** libsndfile lookup tables for correctness.
-**
-** I have included the original authors comments.
-*/
-
-/*
-** This routine converts from linear to ulaw.
-**
-** Craig Reese: IDA/Supercomputing Research Center
-** Joe Campbell: Department of Defense
-** 29 September 1989
-**
-** References:
-** 1) CCITT Recommendation G.711 (very difficult to follow)
-** 2) "A New Digital Technique for Implementation of Any
-** Continuous PCM Companding Law," Villeret, Michel,
-** et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
-** 1973, pg. 11.12-11.17
-** 3) MIL-STD-188-113,"Interoperability and Performance Standards
-** for Analog-to_Digital Conversion Techniques,"
-** 17 February 1987
-**
-** Input: Signed 16 bit linear sample
-** Output: 8 bit ulaw sample
-*/
-
-#define uBIAS 0x84 /* define the add-in bias for 16 bit samples */
-#define uCLIP 32635
-
-static
-unsigned char ulaw_encode (int sample)
-{ static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
- 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
- int sign, exponent, mantissa;
- unsigned char ulawbyte;
-
- /* Get the sample into sign-magnitude. */
- sign = (sample >> 8) & 0x80 ; /* set aside the sign */
- if ( sign != 0 )
- sample = -sample ; /* get magnitude */
- 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 );
-
- return ulawbyte;
-} /* ulaw_encode */
-
-
-/*
-** This routine converts from ulaw to 16 bit linear.
-**
-** Craig Reese: IDA/Supercomputing Research Center
-** 29 September 1989
-**
-** References:
-** 1) CCITT Recommendation G.711 (very difficult to follow)
-** 2) MIL-STD-188-113,"Interoperability and Performance Standards
-** for Analog-to_Digital Conversion Techniques,"
-** 17 February 1987
-**
-** Input: 8 bit ulaw sample
-** Output: signed 16 bit linear 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 )
- sample = -sample ;
-
- return sample;
-} /* ulaw_decode */
-
--- a/common/libsndfile/tests/write_read_test.c
+++ /dev/null
@@ -1,947 +1,0 @@
-/*
-** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
-**
-** 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 <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <math.h>
-
-#include <sndfile.h>
-
-#define BUFFER_SIZE (1<<15)
-
-static void pcm_test_char (char *str, char *filename, int typemajor, int typeminor) ;
-static void pcm_test_short (char *str, char *filename, int typemajor, int typeminor) ;
-static void pcm_test_24bit (char *str, char *filename, int typemajor, int typeminor, int long_file_ok) ;
-static void pcm_test_int (char *str, char *filename, int typemajor, int typeminor) ;
-
-static void pcm_float_test (char *str, char *filename, int typemajor) ;
-
-/* Force the start of this buffer to be double aligned. Sparc-solaris will
-** choke if its not.
-*/
-static double test_buffer [(BUFFER_SIZE/sizeof(double))+1] ;
-
-int main (int argc, char *argv[])
-{ char *filename ;
- int bDoAll = 0 ;
- int nTests = 0 ;
-
- if (argc != 2)
- { printf ("Usage : %s <test>\n", argv [0]) ;
- printf (" Where <test> is one of the following:\n") ;
- printf (" wav - test WAV file functions (little endian)\n") ;
- printf (" aiff - test AIFF file functions (big endian)\n") ;
- printf (" au - test AU file functions (big endian)\n") ;
- printf (" aule - test little endian AU file functions\n") ;
- printf (" raw - test RAW header-less PCM file functions\n") ;
- printf (" paf - test PAF file functions\n") ;
- printf (" svx - test 8SVX/16SV file functions\n") ;
- printf (" all - perform all tests\n") ;
- exit (1) ;
- } ;
-
- bDoAll=!strcmp (argv [1], "all");
-
- if (bDoAll || ! strcmp (argv [1], "wav"))
- { filename = "test.wav" ;
- pcm_test_char ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
- pcm_test_short ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
- pcm_test_24bit ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM, 0) ;
- pcm_test_int ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
- pcm_float_test ("wav", filename, SF_FORMAT_WAV) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aiff"))
- { filename = "test.aiff" ;
- pcm_test_char ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
- pcm_test_short ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
- pcm_test_24bit ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM, 0) ;
- pcm_test_int ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "au"))
- { filename = "test.au" ;
- pcm_test_char ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
- pcm_test_short ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
- pcm_test_24bit ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM, 0) ;
- pcm_test_int ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "aule"))
- { filename = "test.au" ;
- pcm_test_char ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
- pcm_test_short ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
- pcm_test_24bit ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM, 0) ;
- pcm_test_int ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "raw"))
- { filename = "test.raw" ;
- pcm_test_char ("raw-s8", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_S8) ;
- pcm_test_char ("raw-u8", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_U8) ;
- pcm_test_short ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE) ;
- pcm_test_short ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE) ;
- pcm_test_24bit ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE, 0) ;
- pcm_test_24bit ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE, 0) ;
- pcm_test_int ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE) ;
- pcm_test_int ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "paf"))
- { filename = "test.paf" ;
- pcm_test_short ("paf-le", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_LE) ;
- pcm_test_short ("paf-be", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_BE) ;
- pcm_test_24bit ("paf-le", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_LE, 1) ;
- pcm_test_24bit ("paf-be", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_BE, 1) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (bDoAll || ! strcmp (argv [1], "svx"))
- { filename = "test.svx" ;
- pcm_test_char ("svx", filename, SF_FORMAT_SVX, SF_FORMAT_PCM) ;
- pcm_test_short ("svx", filename, SF_FORMAT_SVX, SF_FORMAT_PCM) ;
- unlink (filename) ;
- nTests++ ;
- } ;
-
- if (nTests == 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 pcm_test_char (char *str, char *filename, int typemajor, int typeminor)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k, items, frames ;
- short *data ;
-
- printf (" pcm_test_char : %s ... ", str) ;
-
- items = 127 ;
-
- data = (short*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 8 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Mono : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_short (file, data, items)) != items)
- { printf ("Mono : sf_write_short failed with short write (%d => %d).\n", items, k) ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Mono : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != items)
- { printf ("Mono : Incorrect number of samples in file. (%u => %u)\n", items, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Mono : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 8)
- { printf ("Mono : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_short (file, data, items)) != items)
- { printf ("Mono : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * ((k % 2) ? 1 : -1))
- { printf ("Mono : Incorrect sample (#%d : %d => %d).\n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- /* Now test Stereo. */
-
- if (typemajor == SF_FORMAT_SVX)
- { printf ("ok\n") ;
- return ;
- } ;
-
- items = 126 ;
-
- data = (short*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
- sfinfo.channels = 2 ;
- sfinfo.pcmbitwidth = 8 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- frames = items / sfinfo.channels ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Stereo : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_writef_short (file, data, frames)) != frames)
- { printf ("Stereo : sf_writef_short failed with short write (%d => %d).\n", frames, k) ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Stereo : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != frames)
- { printf ("Stereo : Incorrect number of samples in file. (%u => %u)\n", frames, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 2)
- { printf ("Stereo : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 8)
- { printf ("Stereo : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_readf_short (file, data, frames)) != frames)
- { printf ("Stereo : short read (%d).\n", k) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * ((k % 2) ? 1 : -1))
- { printf ("Stereo : Incorrect sample (#%d : %d => %d).\n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
-
- printf ("ok\n") ;
-} /* pcm_test_char */
-
-static
-void pcm_test_short (char *str, char *filename, int typemajor, int typeminor)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k, items, frames ;
- short *data ;
-
- printf (" pcm_test_short : %s ... ", str) ;
-
- items = BUFFER_SIZE / sizeof (short) ;
-
- data = (short*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Mono : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_write_short (file, data, items)) != items)
- { printf ("Mono : sf_write_short failed with short write (%d => %d).\n", items, k) ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Mono : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != items)
- { printf ("Mono : Incorrect number of samples in file. (%d => %d)\n", items, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Mono : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Mono : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_short (file, data, items)) != items)
- { printf ("Mono : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * ((k % 2) ? 1 : -1))
- { printf ("Mono : Incorrect sample (#%d : %d => %d).\n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- /* Now test Stereo. */
-
- if (typemajor == SF_FORMAT_SVX)
- { printf ("ok\n") ;
- return ;
- } ;
-
- items = BUFFER_SIZE / sizeof (short) ;
-
- data = (short*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 2 ;
- sfinfo.pcmbitwidth = 16 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- frames = items / sfinfo.channels ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Stereo : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if ((k = sf_writef_short (file, data, frames)) != frames)
- { printf ("Stereo : sf_writef_short failed with short write (%d => %d).\n", frames, k) ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Stereo : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != frames)
- { printf ("Stereo : Incorrect number of samples in file. (%d => %d)\n", frames, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 2)
- { printf ("Stereo : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 16)
- { printf ("Stereo : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_readf_short (file, data, frames)) != frames)
- { printf ("Stereo : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * ((k % 2) ? 1 : -1))
- { printf ("Stereo : Incorrect sample (#%d : %d => %d).\n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* pcm_test_short */
-
-static
-void pcm_test_24bit (char *str, char *filename, int typemajor, int typeminor, int long_file_ok)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k, items, frames ;
- int *data ;
-
- printf (" pcm_test_24bit : %s ... ", str) ;
-
- items = BUFFER_SIZE / sizeof (int) ;
-
- data = (int*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * 256 * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 24 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Mono : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_write_int (file, data, items) != items)
- { printf ("Mono : sf_write_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- memset (data, 0, items * 3) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Mono : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < items)
- { printf ("Mono : Incorrect number of samples in file (too short). (%d should be %d)\n", sfinfo.samples, items) ;
- exit (1) ;
- } ;
-
- if (! long_file_ok && sfinfo.samples > items)
- { printf ("Mono : Incorrect number of samples in file (too long). (%d should be %d)\n", sfinfo.samples, items) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Mono : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 24)
- { printf ("Mono : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_int (file, data, items)) != items)
- { printf ("Mono : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * 256 * ((k % 2) ? 1 : -1))
- { printf ("Mono : Incorrect sample (#%d : %d => %d).\n", k, k * 256 * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- /* Now test Stereo. */
-
- if (typemajor == SF_FORMAT_SVX)
- { printf ("ok\n") ;
- return ;
- } ;
-
- items = BUFFER_SIZE / sizeof (int) ;
-
- data = (int*) test_buffer ;
- for (k = 0 ; k < items ; k++)
- data [k] = k * 256 * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 2 ;
- sfinfo.pcmbitwidth = 24 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- frames = items / sfinfo.channels ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Stereo : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_writef_int (file, data, frames) != frames)
- { printf ("Stereo : sf_writef_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
-
- sf_close (file) ;
-
- memset (data, 0, items * 3) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Stereo : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples < frames)
- { printf ("Stereo : Incorrect number of samples in file (too short). (%d should be %d)\n", sfinfo.samples, frames) ;
- exit (1) ;
- } ;
-
- if (! long_file_ok && sfinfo.samples > frames)
- { printf ("Stereo : Incorrect number of samples in file (too long). (%d should be %d)\n", sfinfo.samples, frames) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 2)
- { printf ("Stereo : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 24)
- { printf ("Stereo : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_readf_int (file, data, frames)) != frames)
- { printf ("Stereo : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (k = 0 ; k < items ; k++)
- if (data [k] != k * 256 * ((k % 2) ? 1 : -1))
- { printf ("Stereo : Incorrect sample (#%d : %d => %d).\n", k, k * 256 * ((k % 2) ? 1 : -1), data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* pcm_test_24bit */
-
-static
-void pcm_test_int (char *str, char *filename, int typemajor, int typeminor)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k, items, frames ;
- int sign, *data ;
-
- printf (" pcm_test_int : %s ... ", str) ;
-
- items = BUFFER_SIZE / sizeof (int) ;
-
- data = (int*) test_buffer ;
- for (sign = 1, k = 0 ; k < items ; k++)
- data [k] = k * 200000 * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 32 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Mono : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_write_int (file, data, items) != items)
- { printf ("Mono : sf_write_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Mono : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != items)
- { printf ("Mono : Incorrect number of samples in file. (%d => %d)\n", items, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Mono : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 32)
- { printf ("Mono : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_int (file, data, items)) != items)
- { printf ("Mono : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (sign = 1, k = 0 ; k < items ; k++)
- if (data [k] != k * 200000 * ((k % 2) ? 1 : -1))
- { printf ("Mono : Incorrect sample (#%d : %d => %d).\n", k, (k % 2) ? 1 : -1, data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- /* Now test Stereo. */
-
- if (typemajor == SF_FORMAT_SVX)
- { printf ("ok\n") ;
- return ;
- } ;
-
- items = BUFFER_SIZE / sizeof (int) ;
-
- data = (int*) test_buffer ;
- for (sign = 1, k = 0 ; k < items ; k++)
- data [k] = k * 200000 * ((k % 2) ? 1 : -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 2 ;
- sfinfo.pcmbitwidth = 32 ;
- sfinfo.format = (typemajor | typeminor) ;
-
- frames = items / sfinfo.channels ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Stereo : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_writef_int (file, data, frames) != frames)
- { printf ("Stereo : sf_writef_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (short)) ;
-
- if (typemajor != SF_FORMAT_RAW)
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Stereo : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | typeminor))
- { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | typeminor), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != frames)
- { printf ("Stereo : Incorrect number of samples in file. (%d => %d)\n", frames, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 2)
- { printf ("Stereo : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 32)
- { printf ("Stereo : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_readf_int (file, data, frames)) != frames)
- { printf ("Stereo : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (sign = 1, k = 0 ; k < items ; k++)
- if (data [k] != k * 200000 * ((k % 2) ? 1 : -1))
- { printf ("Stereo : Incorrect sample (#%d : %d => %d).\n", k, (k % 2) ? 1 : -1, data [k]) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* pcm_test_int */
-
-static
-void pcm_float_test (char *str, char *filename, int typemajor)
-{ SNDFILE *file ;
- SF_INFO sfinfo ;
- unsigned int k, items, frames ;
- int sign ;
- double *data, error ;
-
- printf (" pcm_float_test : %s ... ", str) ;
-
- items = BUFFER_SIZE / sizeof (double) ;
-
- data = (double*) test_buffer ;
- for (sign = 1, k = 0 ; k < items ; k++)
- data [k] = ((double) k) / 100.0 * (sign *= -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 1 ;
- sfinfo.pcmbitwidth = 32 ;
- sfinfo.format = (typemajor | SF_FORMAT_FLOAT) ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Mono : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_write_double (file, data, items, 0) != items)
- { printf ("Mono : sf_write_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (double)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Mono : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | SF_FORMAT_FLOAT))
- { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | SF_FORMAT_FLOAT), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != items)
- { printf ("Mono : Incorrect number of samples in file. (%d => %d)\n", items, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Mono : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 32)
- { printf ("Mono : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_read_double (file, data, items, 0)) != items)
- { printf ("Mono : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (sign = 1, k = 0 ; k < items ; k++)
- { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
- if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
- { printf ("Mono : Incorrect sample (#%d : %f => %f).\n", k, ((double) k) / 100.0, data [k]) ;
- exit (1) ;
- } ;
- } ;
- sf_close (file) ;
-
- /* Now test Stereo. */
-
- if (typemajor == SF_FORMAT_SVX)
- { printf ("ok\n") ;
- return ;
- } ;
-
- items = BUFFER_SIZE / sizeof (double) ;
-
- data = (double*) test_buffer ;
- for (sign = 1, k = 0 ; k < items ; k++)
- data [k] = ((double) k) / 100.0 * (sign *= -1) ;
-
- sfinfo.samplerate = 44100 ;
- sfinfo.samples = items ;
- sfinfo.channels = 2 ;
- sfinfo.pcmbitwidth = 32 ;
- sfinfo.format = (typemajor | SF_FORMAT_FLOAT) ;
-
- frames = items / sfinfo.channels ;
-
- if (! (file = sf_open_write (filename, &sfinfo)))
- { printf ("Stereo : sf_open_write failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sf_writef_double (file, data, frames, 0) != frames)
- { printf ("Stereo : sf_writef_int failed with error : ") ;
- sf_perror (file) ;
- exit (1) ;
- } ;
- sf_close (file) ;
-
- memset (data, 0, items * sizeof (double)) ;
- memset (&sfinfo, 0, sizeof (sfinfo)) ;
-
- if (! (file = sf_open_read (filename, &sfinfo)))
- { printf ("Stereo : sf_open_read failed with error : ") ;
- sf_perror (NULL) ;
- exit (1) ;
- } ;
-
- if (sfinfo.format != (typemajor | SF_FORMAT_FLOAT))
- { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", (typemajor | SF_FORMAT_FLOAT), sfinfo.format) ;
- exit (1) ;
- } ;
-
- if (sfinfo.samples != frames)
- { printf ("Stereo : Incorrect number of samples in file. (%d => %d)\n", frames, sfinfo.samples) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 2)
- { printf ("Stereo : Incorrect number of channels in file.\n") ;
- exit (1) ;
- } ;
-
- if (sfinfo.pcmbitwidth != 32)
- { printf ("Stereo : Incorrect bit width (%d).\n", sfinfo.pcmbitwidth) ;
- exit (1) ;
- } ;
-
- if ((k = sf_readf_double (file, data, frames, 0)) != frames)
- { printf ("Stereo : short read (%d).\n", k) ;
- exit (1) ;
- } ;
-
- for (sign = 1, k = 0 ; k < items ; k++)
- { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
- if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
- { printf ("Stereo : Incorrect sample (#%d : %f => %f).\n", k, ((double) k) / 100.0, data [k]) ;
- exit (1) ;
- } ;
- } ;
- sf_close (file) ;
-
- printf ("ok\n") ;
-} /* pcm_float_test */
-